W3docs

Как получить последний вставленный ID в PHP и MySQL

Узнайте, как получить ID последней вставленной записи в PHP и MySQL с помощью MySQLi и PDO.

Когда вы вставляете строку в таблицу MySQL, первичный ключ которой является столбцом AUTO_INCREMENT, база данных генерирует новый ID за вас. PHP позволяет считать этот ID сразу после вставки, не выполняя дополнительный запрос SELECT. На этой странице показано, как это делается с помощью расширений MySQLi и PDO, почему возвращаемое значение надёжно и какие подводные камни нужно учитывать.

Последний вставленный ID чаще всего используется для связи связанных записей: вставляете нового user, получаете его ID, а затем вставляете строки в orders или profiles, которые ссылаются на него как на внешний ключ.

Как это работает

Обе функции, описанные ниже, возвращают ID, сгенерированный самым последним успешным INSERT на текущем соединении с базой данных:

  • mysqli_insert_id($conn) — MySQLi (процедурный или объектно-ориентированный стиль).
  • PDO::lastInsertId() — PDO.

Два важных момента:

  • Значение привязано к соединению. Даже если другие пользователи вставляют строки одновременно, вы всегда получаете ID, сгенерированный вашим соединением, — состояния гонки нет.
  • Ненулевое значение возвращается только тогда, когда в таблице есть столбец AUTO_INCREMENT. Если автоинкрементного ключа нет, возвращается 0.

Предварительные требования

Прежде чем начать, убедитесь, что у вас есть:

  • Веб-сервер с установленным PHP
  • База данных MySQL
  • Доступ к интерфейсу phpMyAdmin или аналогичному инструменту управления базой данных
  • Таблица с первичным ключом AUTO_INCREMENT. В примерах ниже используется следующая таблица:
CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50),
    email VARCHAR(100)
);

Подробнее о создании таблиц см. в разделе Создание таблицы MySQL.

Установка соединения

Первый шаг при получении последнего вставленного ID — установить соединение с базой данных. В MySQLi это делается с помощью функции mysqli_connect(), которой требуются следующие параметры:

  • Имя сервера базы данных
  • Имя пользователя для доступа к базе данных
  • Пароль пользователя базы данных
  • Имя базы данных для подключения

Пример установки соединения с базой данных:

<?php
$server = "localhost";
$username = "root";
$password = "password";
$database = "database_name";

$conn = mysqli_connect($server, $username, $password, $database);

if (!$conn) {
    die("Connection failed: " . mysqli_connect_error());
}
echo "Connected successfully";
?>

Подробнее о подключении см. в разделе Подключение к базе данных MySQL.

Написание SQL-запроса

После установки соединения с базой данных следующий шаг — написать SQL-запрос для вставки данных.

Пример SQL-запроса для вставки данных в таблицу:

INSERT INTO table_name (column1, column2, column3)
VALUES ('value1', 'value2', 'value3');

Выполнение SQL-запроса

После написания SQL-запроса его нужно выполнить. Для этого используется функция mysqli_query(), которой требуются следующие параметры:

  • Соединение с базой данных
  • SQL-запрос для выполнения

Пример выполнения SQL-запроса:

<?php
$sql = "INSERT INTO table_name (column1, column2, column3)
VALUES ('value1', 'value2', 'value3')";

if (mysqli_query($conn, $sql)) {
    echo "New record created successfully";
} else {
    echo "Error: " . $sql . "<br>" . mysqli_error($conn);
}
?>

Замечание по безопасности: В производственной среде всегда используйте подготовленные запросы для защиты от SQL-инъекций.

Получение последнего вставленного ID

После вставки данных в базу следующий шаг — получить ID последней вставленной записи. Для этого используется функция mysqli_insert_id(), которой требуется следующий параметр:

  • Соединение с базой данных

Пример получения последнего вставленного ID:

<?php
$last_id = mysqli_insert_id($conn);
echo "Last inserted ID is: " . $last_id;
?>

Закрытие соединения

После получения последнего вставленного ID важно закрыть соединение с базой данных во избежание угроз безопасности. Для этого используется функция mysqli_close(), которой требуется следующий параметр:

  • Соединение с базой данных

Пример закрытия соединения с базой данных:

<?php
mysqli_close($conn);
?>

Полный пример (MySQLi, подготовленный запрос)

В реальном коде пользовательские данные следует передавать через подготовленный запрос, а не конкатенировать со строкой SQL. Принцип тот же: выполняем вставку, затем считываем ID. Вот полный пример:

<?php
$conn = mysqli_connect("localhost", "root", "password", "database_name");
if (!$conn) {
    die("Connection failed: " . mysqli_connect_error());
}

$stmt = mysqli_prepare($conn, "INSERT INTO users (name, email) VALUES (?, ?)");
mysqli_stmt_bind_param($stmt, "ss", $name, $email);

$name = "Jane Doe";
$email = "[email protected]";
mysqli_stmt_execute($stmt);

$last_id = mysqli_insert_id($conn);
echo "New user inserted with ID: " . $last_id;

mysqli_stmt_close($stmt);
mysqli_close($conn);
?>

После успешной вставки $last_id содержит значение, сгенерированное MySQL для столбца id — например, 1 при первой вставке, 2 при следующей и т. д.

Получение последнего ID с помощью PDO

Если вы подключаетесь через PDO, а не MySQLi, используйте метод lastInsertId() объекта соединения:

<?php
$pdo = new PDO("mysql:host=localhost;dbname=database_name", "root", "password");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$stmt = $pdo->prepare("INSERT INTO users (name, email) VALUES (?, ?)");
$stmt->execute(["John Doe", "[email protected]"]);

$last_id = $pdo->lastInsertId();
echo "New user inserted with ID: " . $last_id;
?>

Обратите внимание, что PDO::lastInsertId() возвращает ID в виде строки, поэтому при необходимости приводите его к числовому типу с помощью (int).

Распространённые ошибки

  • Вызывайте функцию сразу после вставки. Выполняйте mysqli_insert_id() / lastInsertId() до любого другого запроса на том же соединении — следующий INSERT перезапишет сохранённое значение.
  • Нет столбца auto-increment → 0. Функция возвращает 0 (не ошибку), если в таблице, в которую была выполнена вставка, нет столбца AUTO_INCREMENT.
  • UPDATE и DELETE не меняют его. Только операторы INSERT, создающие значение автоинкремента, обновляют результат.
  • Не используйте SELECT MAX(id). Распространённая ошибка — читать наибольший ID с помощью SELECT MAX(id) FROM users. При одновременных вставках это может вернуть строку другого пользователя. Специализированные функции привязаны к соединению и безопасны.

Заключение

В этой статье мы показали, как получить ID последней вставленной записи в PHP и MySQL. Следуя этим шагам, вы сможете получить ID последней вставленной записи в вашей базе данных. Для наилучшего результата всегда вставляйте данные через подготовленные запросы и считывайте ID на том же соединении сразу после вставки.

Связанные разделы: Вставка данных в MySQL, Подготовленные запросы и Выборка данных из MySQL.

Практика

Практика
Какие методы можно использовать для получения последнего вставленного ID в PHP и MySQL?
Какие методы можно использовать для получения последнего вставленного ID в PHP и MySQL?
Was this page helpful?