#php #mysql #sql #database
#php #mysql #База данных #pdo
Вопрос:
У меня есть запрос, и я хочу вставить последний идентификатор. Идентификатор поля является первичным ключом и автоматически увеличивается.
Я знаю, что я должен использовать это утверждение:
LAST_INSERT_ID()
Этот оператор работает с таким запросом, как этот:
$query = "INSERT INTO `cell-place` (ID) VALUES (LAST_INSERT_ID())";
Но если я хочу получить идентификатор, используя этот оператор:
$ID = LAST_INSERT_ID();
Я получаю эту ошибку:
Fatal error: Call to undefined function LAST_INSERT_ID()
Что я делаю не так?
Ответ №1:
Это потому, что это функция SQL, а не PHP. Вы можете использовать PDO::lastInsertId()
.
Нравится:
$stmt = $db->prepare("...");
$stmt->execute();
$id = $db->lastInsertId();
Если вы хотите сделать это с помощью SQL вместо PDO API, вы должны сделать это как обычный запрос select:
$stmt = $db->query("SELECT LAST_INSERT_ID()");
$lastId = $stmt->fetchColumn();
Комментарии:
1. да, вы правы, я нашел его, и он работает, спасибо, я приму ответ
2. @rybo111, сначала это
Screaming snake case
. во-вторых, это соглашение об именовании MySQL, а не PHP3. @rybo111, hmm
SELECT LAST_INSERT_ID()
— это функция MySQL4. Так что, возможно, это глупый последующий вопрос, но я просто хочу быть уверенным. Когда я полагаюсь на lastInsertId(), возвращает ли он последний вставленный идентификатор, который произошел в моем текущем выполняемом коде прямо тогда? Или он возвращает последний вставленный идентификатор из всей моей базы данных? Например, если у меня веб-сайт с интенсивным трафиком, и я вставляю что-то во время своего сценария входа в систему и использую lastInsertId() для получения вставленного идентификатора, но одновременно входит много людей, могу ли я безопасно полагаться на lastInsertId() для получения последнего вставленного идентификатора из этого конкретного экземпляр выполняемого кода? Или я рискую
5. @ArtGeigel Это будет последний вставленный идентификатор соединения, лежащего в основе экземпляра PDO. Другими словами, в описанном вами сценарии это безопасно, поскольку параллельные запросы будут выполняться в отдельных соединениях.
Ответ №2:
lastInsertId() работает только после запроса INSERT.
Правильно:
$stmt = $this->conn->prepare("INSERT INTO users(userName,userEmail,userPass)
VALUES(?,?,?);");
$sonuc = $stmt->execute([$username,$email,$pass]);
$LAST_ID = $this->conn->lastInsertId();
Неверно:
$stmt = $this->conn->prepare("SELECT * FROM users");
$sonuc = $stmt->execute();
$LAST_ID = $this->conn->lastInsertId(); //always return string(1)=0
Ответ №3:
Вы можете получить идентификатор последней транзакции, запустив метод lastInsertId() для объекта connection($ conn).
Например, $lid = $conn-> lastInsertId();
Пожалуйста, ознакомьтесь с документами https://www.php.net/manual/en/language.oop5.basic.php
Комментарии:
1. Добро пожаловать в Stack Overflow. Мы ценим полезный вклад, но, пожалуйста, не дублируйте существующие ответы.