在这种情况下如何使用 lastInsertId?

Posted

技术标签:

【中文标题】在这种情况下如何使用 lastInsertId?【英文标题】:How to use lastInsertId in this case? 【发布时间】:2020-02-23 22:34:31 【问题描述】:

我想要的是获取并存储最后插入的 ID,但我不确定如何。场景是,在用户添加记录后,他/她将被重定向到一个页面,该页面将向他/她显示他/她保存的内容的摘要。但我不确定我该怎么做才能检索最近添加的记录。 我有一个看起来像这样的类 record.php

<?php
class Record 
     private $conn;
     private $table_name_1 = "name_of_the_table_1";
     private $table_name_2 = "name_of_the_table_2";

     public $name;
     public $age;
     public function __construct($db)
    $this->conn = $db;

function newRecord()
     $query = "INSERT INTO " . $this->table_name_1 . " SET name=:name;
     INSERT INTO " . $this->table_name_2 . " SET age=:age";
     $stmt = $this->conn->prepare($query);
     $this->name=$this->name;
     $this->age=$this->age;
     $stmt->bindParam(':name', $this->name);
     $stmt->bindParam(':age', $this->age);
     if($stmt->execute())
        return  true;
    else
        return false;
    
   
   
  ?>

现在我有另一个创建和添加记录的 php 表单,代码类似于 add_record.php

<?php
inlude_once 'db.php'
inlude_once 'record.php'

$database = new Database();
$db = $database->getConnection();

$record = new Record($db);
?>

<?php 
if($_POST) 
$record->name=$_POST['name'];
$record->age=$_POST['age'];

if(record->record())
header("Location:$home_urlview_recently_added_record.php?action=record_saved");

else
echo "Unable to save";


?>

思路是将查询保存到两个不同的表中,同时自动将表1的自增ID记录到表2中,这样它们就有了关系。我想我可以做到这一点,如果我可以立即存储表 1 中的 ID 并为其分配一个变量,这样它就可以使用新的查询或函数自动保存到表 2 中。这可能吗?是否有意义?还有一件事我想立即向用户显示最近记录的数据。谢谢。

【问题讨论】:

【参考方案1】:

您可以在newRecord 函数中返回$stmt-&gt;insert_id-1 insteaf of boolean:

function newRecord()
     ...
     if($stmt->execute())
        return $stmt->insert_id;
    else
        return -1;
    
   

并使用该值进行重定向,如下所示:

$newrecord = record->newRecord();
if($newrecord != -1) 
   header("Location:$home_urlview_recently_added_record.php?action=record_saved&id=".$newrecord);

else
   echo "Unable to save";

【讨论】:

我试过了,但很遗憾它不起作用,虽然可能不是问题,我会再次检查并回复您。 到目前为止它正在工作,我能够捕获并存储最后插入的记录,现在它回答了最初的询问,我希望没有其他额外的问题。我稍微调整了一下,而不是 $stmt->insert_id;我将其更改为 $this->conn->lastInsertId();非常感谢。

以上是关于在这种情况下如何使用 lastInsertId?的主要内容,如果未能解决你的问题,请参考以下文章

PDO::lastInsertID 有时不起作用

pdo lastInsertId() 不断返回 0

Java、PreparedStatement、TransactSQL (MS SQL)、最后插入 ID

如何添加 lastInsertId()? [复制]

无法让 PHP lastInsertId() 使用此设置

如何在这种情况下使用group by表达式?