簡體   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