W3docs

Как вставить данные в базу данных 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.

Практика

Практика
Каковы шаги вставки данных в MySQL с помощью PHP?
Каковы шаги вставки данных в MySQL с помощью PHP?
Was this page helpful?