在调用LastInsertId()以获取PDO中的最后一个插入ID之前,插入新记录是必须的



我正在尝试学习PDO。

首先,我使用以下代码成功地在表中插入了记录。

<?php
  $servername = "localhost";
  $username = "root";
  $password = "";
  $dbname = "myDBPDO";
  try {
    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
    // set the PDO error mode to exception
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $sql = "INSERT INTO MyGuests (firstname, lastname, email)
    VALUES ('John', 'Doe', 'john@example.com')";
    // use exec() because no results are returned
    $conn->exec($sql);
    echo "New record created successfully";
  }
  catch(PDOException $e) {
    echo $sql . "<br>" . $e->getMessage();
  }
  $conn = null;
?>

然后,我试图获取最后插入的记录的ID。我为此写了以下代码:

<?php
  $servername = "localhost";
  $username = "root";
  $password = "";
  $dbname = "myDBPDO";
  try {
    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
    // set the PDO error mode to exception
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $last_id = $conn->lastInsertId();
    echo "Last inserted ID is: " . $last_id;
  }
  catch(PDOException $e) {
    echo $sql . "<br>" . $e->getMessage();
  }
  $conn = null;
?>

上述输出(第二代码段)如下:

Last inserted ID is: 0

实际上,我希望得到以下输出:

Last inserted ID is: 1

1 是我在第一个程序中插入的记录字段中的值。

为什么它不返回上述指定的预期输出?

是否必须在调用lastinsertid()之前插入新记录以获取PDO中的最后一个插入ID?

如果是,那么我应该如何在使用我编写的第二个代码片段调用lastInsertId()之前插入新记录的最后插入ID?如果否,原因是什么?

基础数据库呼叫LAST_INSERT_ID()每个连接操作。如果切断连接,该值将丢失

生成的ID以/连接基础的速度维护在服务器中。这意味着该函数返回给给定客户端的值是最新语句生成的第一个AUTO_INCREMENT

生成的AUTO_INCREMENT值。

所以回答您的问题...

在调用lastinsertid()以获取PDO中的最后一个插入ID之前,是否必须插入新记录?

是的,这是正确的。


我应该如何在不插入新记录的情况下获得最后一个插入的ID

您几乎限于获取最大ID值

$maxId = $conn->query('SELECT MAX(id) FROM MyGuests')->fetchColumn();

另外,将lastInsertId()值从第一个脚本保存在可以通过第二个脚本检索的地方。

最新更新