Мой вопрос довольно простой. Я читал, что рекомендуемый метод получения значения auto_increment / id строки, которую я вставил в mysqli, – это mysqli_insert_id()
. Тем не менее, я не слишком хорошо знаком и задал вопрос: (Это все теоретически на данный момент)
Для этих целей (отсюда бит mysqli) все это будет из веб-приложения PHP. Скажите, что несколько пользователей находятся в приложении одновременно, а другая строка вставлена с другой страницы между тем временем, когда я вставляю свою строку и время, которое я вызываю mysqli_insert_id()
?
Будет ли это возвращать неправильное значение, или у MySQL есть какая-то особенность, чтобы предотвратить такую вещь? Или я просто переоцениваю возможность такого сценария?
Спасибо за ваше время.
mysqli_insert_id()
специфичен для подключения к базе данных – он возвращает идентификатор строки, которую этот скриптовый вызов вставлял совсем недавно, а не какой-либо другой клиент MySQL. Таким образом, нет конфликта, если несколько приложений вставляются в базу данных одновременно.
Существует два способа вызова этого метода:
$mysqli->insert_id
; mysqli_insert_id(mysqli $link)
В обоих случаях последний идентификатор вставки относится к соединению, которое вы установили с базой данных. Для объяснения, хотя я считаю, что объектно-ориентированный подход обеспечивает большую ясность. Рассмотрим следующий код:
$mysqli = new mysqli('host','username','password','database'); // Insert into table with an AUTO INCREMENT field defined` if ($result = $mysqli->query("INSERT INTO table (somefield) VALUES ('somevalue');")) { echo 'The ID is: '.$mysqli->insert_id; }
$insert_id
экземпляра $insert_id
обновляется всякий раз, когда вызывается функция запроса. Таким образом, удерживаемая ценность находится только в пределах вашего кода и не относится к другим взаимодействиям с базой данных каким-либо другим процессом.
Однако есть некоторые интересные замечания. Например, если вы решите делать массовые вставки, например
$mysqli->query("INSERT INTO table (somefield) VALUES ('somevalue'), ('anothervalue');")
Он вернет идентификатор первой строки, вставленной, а не последней.
Для дальнейшего чтения PHP Doc дает больше разъяснений.