Я пытаюсь выучить 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 (), используя второй фрагмент кода, который я написал? Если нет, в чем причина?
Основной вызов базы данных LAST_INSERT_ID()
работает за соединение. Если вы разорвете соединение, значение будет потеряно
Сгенерированный идентификатор сохраняется на сервере за соединение. Это означает, что значение, возвращаемое функцией данному клиенту, является первым
AUTO_INCREMENT
значение, сгенерированное для самого последнего утверждения, влияющего наAUTO_INCREMENT
колонка этим клиентом
Итак, чтобы ответить на ваш вопрос …
Обязательно ли вставлять новую запись непосредственно перед вызовом lastInsertId (), чтобы получить последний вставленный идентификатор в PDO?
Да, это правильно.
как я должен получить последний вставленный идентификатор, не вставляя новую запись
Вы в значительной степени ограничены извлечением максимального значения идентификатора
$maxId = $conn->query('SELECT MAX(id) FROM MyGuests')->fetchColumn();
Альтернативно, сохраните lastInsertId()
значение из первого скрипта где-то, что может быть получено вторым скриптом.
Других решений пока нет …