Как получить запись по ID через lastInsertId сразу после вставки?
Здравствуйте!
Есть такой запрос вставки и получение последнего ID:
$stmt = $db->prepare("INSERT INTO users (name, email) VALUES ('Иван', 'test@test.com')"); $stmt->execute(); $lastId = $db->lastInsertId(); |
$stmt = $db->prepare("INSERT INTO users (name, email) VALUES ('Иван', 'test@test.com')"); $stmt->execute(); $lastId = $db->lastInsertId();
Сразу за ним, вызывается SELECT по последнему ID:
$stmt = $db->prepare('SELECT * FROM users WHERE id = ? LIMIT 1'); $stmt->execute([$lastId]); |
$stmt = $db->prepare('SELECT * FROM users WHERE id = ? LIMIT 1'); $stmt->execute([$lastId]);
Но получаю ошибку:
SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE id = 173 LIMIT 1' at line 1
Несколько часов не могу понять в чем проблема. Уже подумал, что может какая-то проблема в окружении, но даже не знаю. -куда смотреть. Гугл не помог. Использую MariaDb 106
UPD.
В итоге, почему-то ошибка была из-за одинарных кавычек в значениях вставки. Заменил одинарные кавычки на обратные и все сразу заработало. Причем пробовал в песочницах - проблемы не было. Скорее всего у меня что-то с локальным окружением все-таки.
Всем большое спасибо за участие!
Дополнительно:
Вы уверены, что именно в этом коде проблема? Делали var_dump($lastId), совпадает ID с тем, что в ошибке?
У вас же в коде нет лимита - это какой-то другой запрос падает.
Насчет LIMIT - да, простите, забыл дописать. Сейчас исправлю.
fiddle
Воспроизведите свою проблему аналогичным образом. Вероятно, на https://phpize.online/
MySQL показывает текст запроса начиная с той позиции, где возникла ошибка. Похоже, что ему не нравится пробел между users и WHERE. Попробуйте удалить этот фрагмент и набрать снова, может затесался какой-то неотображаемый символ.
- Спасибо за ответ. Переписал запросы заново, к сожалению не помогло.
- Заменил одинарные кавычки на обратные и все заработало. Написал в UPD вопроса. Большое спасибо за помощь.
Тупой вопрос. А в таблице есть первичный ключ (primary,autoincrement) ?
Обычно поле называют id и тип у него длинное целое
- Да, у ID стоит INT AUTO_INCREMENT PRIMARY KEY
- Заменил одинарные кавычки на обратные и все заработало. Написал в UPD вопроса. Большое спасибо за помощь.
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для того чтобы получить запись по ID сразу после вставки в базу данных с использованием lastInsertId, необходимо следовать определенным шагам.
1. Подключиться к базе данных. Для этого необходимо создать объект PDO, указать параметры подключения к базе данных (хост, имя базы данных, пользователь, пароль) и установить соединение.
2. Выполнить запрос на вставку данных в таблицу. Для этого необходимо использовать метод prepare объекта PDO и выполнить запрос с помощью метода execute.
3. Получить ID последней вставленной записи. Для этого можно использовать метод lastInsertId объекта PDO. Этот метод возвращает ID последней вставленной записи в текущем соединении с базой данных.
4. Выполнить запрос на получение записи по ID. Для этого можно использовать метод prepare объекта PDO и выполнить запрос с помощью метода execute, передавая в запрос ID, полученный на предыдущем шаге.
5. Получить результат запроса. Результатом будет запись из базы данных с соответствующим ID.
Пример кода на PHP:
```php
// Подключение к базе данных
$pdo = new PDO('mysql:host=localhost;dbname=test', 'root', 'password');
// Выполнение запроса на вставку данных
$stmt = $pdo->prepare("INSERT INTO users (name, email) VALUES (:name, :email)");
$stmt->execute(['name' => 'John Doe', 'email' => 'john.doe@example.com']);
// Получение ID последней вставленной записи
$id = $pdo->lastInsertId();
// Выполнение запроса на получение записи по ID
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id");
$stmt->execute(['id' => $id]);
// Получение результата запроса
$user = $stmt->fetch();
// Вывод данных
echo "ID: " . $user['id'] . "
";
echo "Name: " . $user['name'] . "
";
echo "Email: " . $user['email'] . "
";
```
Таким образом, можно получить запись по ID сразу после вставки в базу данных с использованием lastInsertId.