У меня есть следующий код:
<? $query =$db->prepare("INSERT INTO a_table (id, a_field) VALUES ('', (:a_field)"); $query->bindParam(":a_field", $a_value); $query->execute(); $last_id = $db->lastInsertId('a_table'); ?>
Я хочу спросить об этом. Представьте себе, когда два человека загружают страницу точно в одно и то же время, возможно ли, что запрос других лиц будет вставлен до получения последнего идентификатора, смешивания идентификаторов?
Нет, эта ситуация невозможна. Метод $ db-> lastInsertId () возвращает последний вставленный идентификатор для этого контура БД. На другой странице будет другое соединение и еще один последний вставленный идентификатор.
PDO вернет вам последний идентификатор, вставленный текущим активным подключением к базе данных.
Просто столкнулся с следующей ситуацией
Имейте файл post.php
который содержит другой файл (например, insert.php
).
Весь код для вставки в mysql находится в insert.php
В insert.php
есть код $id_of_inserted_row = $db->lastInsertId();
Затем в insert.php
находится echo $id_of_inserted_row;
который показывает правильное значение.
Но echo $id_of_inserted_row;
в post.php
показано неверное значение (как я вижу, показывает 7 чисел меньше фактического значения). Я не понимаю, почему, просто нужно принимать во внимание.
Обновить
Извините, выше написанное было потому, что вставлено в две таблицы и ошибочно используется тот же $id_of_inserted_row = $db->lastInsertId();
для обеих таблиц.
Поэтому у меня такой же вывод, как и в других ответах: lastInsertId()
получает идентификатор последней вставленной строки.
Столкнувшись с ситуацией. Я вставил 2 строки в mysql. В таком случае я вижу, что lastInsertId () является идентификатором первой вставленной строки (не последней). Не понимаю, почему … Нашел ответ https://stackoverflow.com/a/12574752/2118559
Важно. Если вы вставляете несколько строк с помощью одного оператора INSERT, LAST_INSERT_ID () возвращает значение, сгенерированное только для первой вставленной строки. Причина этого заключается в том, чтобы дать возможность легко воспроизвести тот же оператор INSERT против какого-либо другого сервера.