Как получить запись по ID через lastInsertId сразу после вставки?

Ссылка скопирована
1 ответ

Здравствуйте!

Есть такой запрос вставки и получение последнего 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 с тем, что в ошибке?
У вас же в коде нет лимита - это какой-то другой запрос падает.

  • Алексей Уколов, да, id точно совпадает с тем, что добавляется в базу.
    Насчет LIMIT - да, простите, забыл дописать. Сейчас исправлю.
  • Всё должно работать правильно.
    fiddle
    Воспроизведите свою проблему аналогичным образом. Вероятно, на https://phpize.online/
  • Лев Салатов, синтаксическая ошибка вроде как исключена. Можно все пробелы в запросе попробовать заменить на /**/, чтобы убедиться, что не затесался неотображаемый символ. А нет ли проблемы в access violation?
  • Алексей Уколов, Akina, krypt3r. Заменил одинарные кавычки на обратные и все заработало. Написал в UPD вопроса. Большое спасибо всем за помощь.
  • MySQL показывает текст запроса начиная с той позиции, где возникла ошибка. Похоже, что ему не нравится пробел между users и WHERE. Попробуйте удалить этот фрагмент и набрать снова, может затесался какой-то неотображаемый символ.

    • Спасибо за ответ. Переписал запросы заново, к сожалению не помогло.
    • Заменил одинарные кавычки на обратные и все заработало. Написал в UPD вопроса. Большое спасибо за помощь.

    Тупой вопрос. А в таблице есть первичный ключ (primary,autoincrement) ?
    Обычно поле называют id и тип у него длинное целое

    • Да, у ID стоит INT AUTO_INCREMENT PRIMARY KEY
    • Заменил одинарные кавычки на обратные и все заработало. Написал в UPD вопроса. Большое спасибо за помощь.
    Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Никита Орлов Ответ

    Для того чтобы получить запись по 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.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно