Обязательно ли вставлять новую запись непосредственно перед вызовом lastInsertId (), чтобы получить последний вставленный идентификатор в 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', '[email protected]')";
// 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;
?>

Затем я попытался получить идентификатор последней вставленной записи. Я написал следующий код для этого:

<?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?

Если да, то как мне получить последний вставленный идентификатор, не вставляя новую запись непосредственно перед вызовом lastInsertId (), используя второй фрагмент кода, который я написал? Если нет, в чем причина?

0

Решение

Основной вызов базы данных LAST_INSERT_ID() работает за соединение. Если вы разорвете соединение, значение будет потеряно

Сгенерированный идентификатор сохраняется на сервере за соединение. Это означает, что значение, возвращаемое функцией данному клиенту, является первым AUTO_INCREMENT значение, сгенерированное для самого последнего утверждения, влияющего на AUTO_INCREMENT колонка этим клиентом

Итак, чтобы ответить на ваш вопрос …

Обязательно ли вставлять новую запись непосредственно перед вызовом lastInsertId (), чтобы получить последний вставленный идентификатор в PDO?

Да, это правильно.


как я должен получить последний вставленный идентификатор, не вставляя новую запись

Вы в значительной степени ограничены извлечением максимального значения идентификатора

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

Альтернативно, сохраните lastInsertId() значение из первого скрипта где-то, что может быть получено вторым скриптом.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]