繁体   English   中英

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

[英]Is it mandatory to insert a new record just before calling lastInsertId() to get the last inserted ID in PDO?

我正在尝试学习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是我在第一个程序中插入的记录的ID字段中的值。

为什么它没有返回上面指定的预期输出?

在调用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()值保存在第二个脚本可以检索的位置。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM