Как вставить данные в базу данных MySQL с помощью PHP
Руководство по вставке данных в MySQL с помощью PHP: соединение, INSERT, подготовленные запросы и получение ID вставленной записи.
Вставка данных — это способ, которым PHP-приложение записывает информацию в базу данных MySQL: сохраняет нового пользователя, фиксирует заказ, записывает комментарий. Каждая такая операция представляет собой SQL-оператор INSERT INTO, который PHP отправляет через открытое соединение с базой данных. В этой статье рассматривается полный процесс с использованием расширения mysqli, а затем показан более безопасный современный подход с подготовленными запросами, которые следует применять в реальных проектах.
Что вы узнаете
- Как открыть соединение и выполнить базовый
INSERT - Почему конкатенация значений в SQL опасна и как подготовленные запросы решают эту проблему
- Как получить автоматически сгенерированный ID только что вставленной строки
- Как эффективно вставить несколько строк за один раз
Предварительные требования
Перед началом работы у вас должно быть:
- Веб-сервер с PHP (7.4+) и установленным расширением
mysqli - Работающая база данных MySQL (или MariaDB)
- Инструмент управления базой данных, например phpMyAdmin, или доступ через командную строку
В примерах используется таблица users. Создать её можно с помощью:
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
first_name VARCHAR(50),
last_name VARCHAR(50),
email VARCHAR(100)
);Если вы только знакомитесь с созданием таблиц, смотрите Create a MySQL Table.
Шаг 1: Установите соединение
Первый шаг — подключение к базе данных с помощью mysqli_connect(), которая принимает четыре аргумента: хост сервера, имя пользователя, пароль и название базы данных. Функция возвращает объект соединения, используемый для каждого запроса.
<?php
$server = "localhost";
$username = "root";
$password = "password";
$database = "database_name";
$conn = mysqli_connect($server, $username, $password, $database);
// Always check the connection before continuing.
if (!$conn) {
die("Connection failed: " . mysqli_connect_error());
}
echo "Connected successfully";
?>mysqli_connect_error() возвращает понятное описание ошибки при неудачном подключении — неверный пароль, недоступный хост или отсутствующая база данных — так что вам не придётся гадать о причине.
Шаг 2: Выполните базовый INSERT
После установки соединения можно выполнить запрос INSERT с помощью mysqli_query(). Функция принимает соединение и строку SQL, возвращая true при успехе или false при ошибке.
<?php
$sql = "INSERT INTO users (first_name, last_name, email)
VALUES ('John', 'Doe', '[email protected]')";
if (mysqli_query($conn, $sql)) {
echo "New record created successfully";
} else {
echo "Error: " . mysqli_error($conn);
}
?>Это работает для жёстко заданных значений, но как только в запрос попадают данные от пользователя, это становится небезопасным. Значение наподобие O'Reilly (с апострофом) сломает SQL, а вредоносное значение может полностью переписать запрос — это SQL-инъекция. Никогда не формируйте запросы путём склеивания пользовательских данных в строку.
Шаг 3: Безопасная вставка с помощью подготовленных запросов
Подготовленный запрос отправляет шаблон SQL и данные раздельно. Заполнители (?) обозначают места для значений, а mysqli_stmt_bind_param() привязывает каждое значение с указанием его типа (s — строка, i — целое число, d — число с плавающей точкой, b — blob). MySQL обрабатывает привязанные значения строго как данные, поэтому инъекция невозможна, а экранирование выполняется автоматически.
<?php
// 1. Prepare the statement with placeholders.
$stmt = mysqli_prepare(
$conn,
"INSERT INTO users (first_name, last_name, email) VALUES (?, ?, ?)"
);
// 2. Bind the input values: three strings -> "sss".
$first_name = "Jane";
$last_name = "Smith";
$email = "[email protected]";
mysqli_stmt_bind_param($stmt, "sss", $first_name, $last_name, $email);
// 3. Execute, then clean up.
if (mysqli_stmt_execute($stmt)) {
echo "New record created successfully";
} else {
echo "Error: " . mysqli_stmt_error($stmt);
}
mysqli_stmt_close($stmt);
?>Именно этот подход следует использовать в любом реальном приложении. Подробнее см. PHP MySQL Prepared Statements.
Получение ID вставленной записи
Когда в таблице есть первичный ключ AUTO_INCREMENT, MySQL автоматически присваивает новой строке id. Получить его можно с помощью mysqli_insert_id() — это полезно, когда ID нужен для следующего запроса или для возврата пользователю.
<?php
mysqli_query($conn, "INSERT INTO users (first_name, last_name, email)
VALUES ('Amy', 'Lee', '[email protected]')");
$new_id = mysqli_insert_id($conn);
echo "Inserted row has ID: " . $new_id;
?>Полная информация, включая поведение при использовании подготовленных запросов, — в статье Get the Last Inserted ID.
Вставка нескольких строк
Чтобы добавить несколько строк за один раз, перечислите несколько наборов значений в одном операторе. Один запрос к базе данных значительно быстрее, чем выполнение INSERT в цикле.
<?php
$sql = "INSERT INTO users (first_name, last_name, email) VALUES
('John', 'Doe', '[email protected]'),
('Jane', 'Smith', '[email protected]'),
('Amy', 'Lee', '[email protected]')";
if (mysqli_query($conn, $sql)) {
echo mysqli_affected_rows($conn) . " records inserted";
} else {
echo "Error: " . mysqli_error($conn);
}
?>Для массовой вставки данных, полученных от пользователя, привязывайте значения в цикле через подготовленный запрос — см. Insert Multiple Rows.
Шаг 4: Закройте соединение
По завершении работы закройте соединение с помощью mysqli_close(), чтобы освободить ресурсы. PHP автоматически закрывает соединения по окончании запроса, но явное закрытие является хорошей практикой в долгоработающих скриптах.
<?php
mysqli_close($conn);
?>Распространённые ошибки
- Отсутствие проверки результата.
mysqli_query()возвращаетfalseпри ошибке; всегда проверяйтеmysqli_error(), чтобы незаметный сбой не выглядел как успех. - Неэкранированные апострофы. Имена наподобие
O'Brienломают запрос, собранный из строк. Подготовленные запросы полностью устраняют эту проблему. - Несоответствие количества столбцов. Число столбцов должно совпадать с числом значений, иначе MySQL отклонит оператор.
- Неверный тип при привязке. Привязка целого числа как
"s"обычно работает, но несоответствия (например, привязка строки к столбцу с типомi) могут незаметно повредить данные.
Заключение
Теперь вы знаете, как вставлять данные в MySQL из PHP: открыть соединение, выполнить INSERT и закрыть соединение. Для всего, что выходит за рамки жёстко заданных тестовых значений, используйте подготовленные запросы для защиты от SQL-инъекций. Далее изучите, как считывать данные с помощью Select Data.