PDO 将最后一个插入 ID 插入到两个表中
PDO inserting last insert id into two tables
我试图将相同的 insertId 插入到几个 link table 中,但是我发现在执行第一个方法后,插入 ID 显然被重置为零。这些方法是分开的,因为它们在其他地方被重用。它们在单独的 类.
基本上调用了三个进程,但我主要关心这两个更新,其中一个取消了另一个。
if($resource->createResource()){
$author->resourceAuthor();
$subject->resourceSubject();
}
这两种方法在本质上是相同的。每个插入数据到一个单独的link table(多对多)。
第一个是这个:
function resourceAuthor()
{
$query = "INSERT INTO authors_has_resource (resource_id, author_id) VALUES (?,?)";
$last_id = $this->conn->lastInsertId();
$stmt = $this->conn->prepare($query);
if(!empty($this->id)) {
foreach($_POST['author_id'] as $id) {
$stmt->execute(array(
$last_id,
$id
));
}
}
}
第二个是这样的:
function resourceSubject()
{
$query = "INSERT INTO resource_has_subjects (resource_id, subject_id) VALUES (?,?)";
$last_id = $this->conn->lastInsertId();
$stmt = $this->conn->prepare($query);
if(!empty($this->id)) {
foreach($_POST['subject_id'] as $id) {
$stmt->execute(array(
$last_id,
$id
));
}
}
}
第一个 运行 工作正常,但第二个只是输入 resource_id 作为 0(其他行,即 author_id 或 subject_id 在他们各自的 table 中运行良好,但当然他们最终会得到重复的键,因为当然 0 不是主键,至少在这种情况下是这样)
是否有解决此问题的简单方法?我试过在初始脚本中创建插入 ID 作为变量,它似乎没有效果。
编辑
我尝试过这样的事情:
if($resource->createResource()){
$last_id = $db->lastInsertId();
print_r($last_id);
$resource->resourceSubjectAuthor($last_id);
}
然后创建一个新方法
function resourceSubjectAuthor($last_id)
{
$query = "INSERT INTO authors_has_resource (resource_id, author_id) VALUES (?,?)";
$stmt = $this->conn->prepare($query);
$query2 = "INSERT INTO resource_has_subjects (resource_id, subject_id) VALUES (?,?)";
$stmt2 = $this->conn->prepare($query2);
if(!empty($this->id)) {
foreach($_POST['author_id'] as $id) {
$stmt->execute(array(
$last_id,
$id
));
}
foreach($_POST['subject_id'] as $ids) {
$stmt2->execute(array(
$last_id,
$ids
));
}
}
}
最后一个 id 被正确创建,但是没有被执行
好的,我设法解决了这个问题。该问题与一次执行后重置的插入 ID 直接相关。我只需要在调用这两个方法之前定义插入 ID,然后在执行之前将该变量传递给方法。
if($resource->createResource()){
$last_id = $db->lastInsertId();
$author->resourceAuthor($last_id);
$subject->resourceSubject($last_id);
}
然后在这两种方法中,只需传递变量而不是像这样声明它:
function resourceSubject($last_id)
{
$query = "INSERT INTO resource_has_subjects (resource_id, subject_id) VALUES (?,?)";
$stmt = $this->conn->prepare($query);
if(!empty($this->id)) {
foreach($_POST['subject_id'] as $id) {
$stmt->execute(array(
$last_id,
$id
));
}
}
}
类似地:
function resourceAuthor($last_id)
{
$query = "INSERT INTO authors_has_resource (resource_id, author_id) VALUES (?,?)";
$stmt = $this->conn->prepare($query);
if(!empty($this->id)) {
foreach($_POST['author_id'] as $id) {
$stmt->execute(array(
$last_id,
$id
));
}
}
}
我试图将相同的 insertId 插入到几个 link table 中,但是我发现在执行第一个方法后,插入 ID 显然被重置为零。这些方法是分开的,因为它们在其他地方被重用。它们在单独的 类.
基本上调用了三个进程,但我主要关心这两个更新,其中一个取消了另一个。
if($resource->createResource()){
$author->resourceAuthor();
$subject->resourceSubject();
}
这两种方法在本质上是相同的。每个插入数据到一个单独的link table(多对多)。
第一个是这个:
function resourceAuthor()
{
$query = "INSERT INTO authors_has_resource (resource_id, author_id) VALUES (?,?)";
$last_id = $this->conn->lastInsertId();
$stmt = $this->conn->prepare($query);
if(!empty($this->id)) {
foreach($_POST['author_id'] as $id) {
$stmt->execute(array(
$last_id,
$id
));
}
}
}
第二个是这样的:
function resourceSubject()
{
$query = "INSERT INTO resource_has_subjects (resource_id, subject_id) VALUES (?,?)";
$last_id = $this->conn->lastInsertId();
$stmt = $this->conn->prepare($query);
if(!empty($this->id)) {
foreach($_POST['subject_id'] as $id) {
$stmt->execute(array(
$last_id,
$id
));
}
}
}
第一个 运行 工作正常,但第二个只是输入 resource_id 作为 0(其他行,即 author_id 或 subject_id 在他们各自的 table 中运行良好,但当然他们最终会得到重复的键,因为当然 0 不是主键,至少在这种情况下是这样)
是否有解决此问题的简单方法?我试过在初始脚本中创建插入 ID 作为变量,它似乎没有效果。
编辑
我尝试过这样的事情:
if($resource->createResource()){
$last_id = $db->lastInsertId();
print_r($last_id);
$resource->resourceSubjectAuthor($last_id);
}
然后创建一个新方法
function resourceSubjectAuthor($last_id)
{
$query = "INSERT INTO authors_has_resource (resource_id, author_id) VALUES (?,?)";
$stmt = $this->conn->prepare($query);
$query2 = "INSERT INTO resource_has_subjects (resource_id, subject_id) VALUES (?,?)";
$stmt2 = $this->conn->prepare($query2);
if(!empty($this->id)) {
foreach($_POST['author_id'] as $id) {
$stmt->execute(array(
$last_id,
$id
));
}
foreach($_POST['subject_id'] as $ids) {
$stmt2->execute(array(
$last_id,
$ids
));
}
}
}
最后一个 id 被正确创建,但是没有被执行
好的,我设法解决了这个问题。该问题与一次执行后重置的插入 ID 直接相关。我只需要在调用这两个方法之前定义插入 ID,然后在执行之前将该变量传递给方法。
if($resource->createResource()){
$last_id = $db->lastInsertId();
$author->resourceAuthor($last_id);
$subject->resourceSubject($last_id);
}
然后在这两种方法中,只需传递变量而不是像这样声明它:
function resourceSubject($last_id)
{
$query = "INSERT INTO resource_has_subjects (resource_id, subject_id) VALUES (?,?)";
$stmt = $this->conn->prepare($query);
if(!empty($this->id)) {
foreach($_POST['subject_id'] as $id) {
$stmt->execute(array(
$last_id,
$id
));
}
}
}
类似地:
function resourceAuthor($last_id)
{
$query = "INSERT INTO authors_has_resource (resource_id, author_id) VALUES (?,?)";
$stmt = $this->conn->prepare($query);
if(!empty($this->id)) {
foreach($_POST['author_id'] as $id) {
$stmt->execute(array(
$last_id,
$id
));
}
}
}