我试图将相同的insertId插入到几个链接表中,但是我发现在执行第一个方法后,插入ID显然会重置为零。这些方法是分开的,因为它们可以在其他地方重复使用。他们分开上课。
基本上有三个进程被调用,但我主要关注这两个更新,其中一个更新另一个更新。
if($resource->createResource()){
$author->resourceAuthor();
$subject->resourceSubject();
}
这两种方法基本上是相同的。每个人都将数据插入一个单独的链接表(多对多)。
第一个就是:
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都很好,但当然最终会有重复键,当然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,但没有任何内容被执行
答案 0 :(得分:1)
好的,我设法解决了这个问题。该问题与一次执行后重置插入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
));
}
}
}