
PHP предоставляет несколько методов для выполнения SQL запросов и обработки их результатов. Наиболее распространённые – расширения mysqli и PDO. Выбор между ними зависит от необходимости поддержки подготовленных выражений и уровня безопасности: PDO обеспечивает универсальный интерфейс для разных СУБД и позволяет предотвращать SQL-инъекции через параметризацию запросов.
После выполнения запроса важно корректно обработать результат. Для mysqli можно использовать методы fetch_assoc(), fetch_row() или fetch_array(), чтобы получить данные в виде ассоциативного массива, индексированного массива или их комбинации. PDO предоставляет fetch() и fetchAll() с возможностью указания режима возврата: ассоциативный, числовой или объект.
Подключение к базе данных через mysqli
Для установления соединения с MySQL используется объект mysqli. Необходимы параметры: хост, имя пользователя, пароль и название базы данных.
Пример подключения:
$mysqli = new mysqli('localhost', 'username', 'password', 'database');
После создания объекта следует проверить соединение с помощью свойства connect_error:
if ($mysqli->connect_error) {
die('Ошибка подключения: ' . $mysqli->connect_error);
}
Рекомендуется указывать кодировку соединения сразу после подключения:
$mysqli->set_charset('utf8mb4');
Для завершения работы соединение закрывается методом close():
$mysqli->close();
Использование объекта mysqli вместо устаревшей функции mysql_connect обеспечивает подготовленные выражения, защиту от SQL-инъекций и удобное управление транзакциями.
Если подключение должно выполняться в нескольких скриптах, целесообразно выделить его в отдельный файл и подключать через require_once для повторного использования.
Использование PDO для безопасного выполнения SQL запросов

PDO (PHP Data Objects) предоставляет единый интерфейс для работы с различными базами данных, обеспечивая безопасное выполнение SQL запросов через подготовленные выражения. Основное преимущество PDO – предотвращение SQL-инъекций при использовании prepared statements.
Для подключения к базе данных создается объект PDO с указанием DSN, имени пользователя и пароля:
$pdo = new PDO('mysql:host=localhost;dbname=testdb;charset=utf8', 'username', 'password');
Важная практика – установка режима обработки ошибок. Рекомендуется использовать PDO::ERRMODE_EXCEPTION:
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
Для безопасного выполнения запросов применяются подготовленные выражения. Например, выборка пользователя по email:
stmt = $pdo->prepare('SELECT id, name FROM users WHERE email = :email');
$stmt->execute(['email' => $userEmail]);
$user = $stmt->fetch(PDO::FETCH_ASSOC);
Использование bindParam или передача массива параметров гарантирует правильное экранирование значений. Это исключает возможность внедрения вредоносного SQL-кода.
Для вставки данных также применяются подготовленные выражения:
stmt = $pdo->prepare('INSERT INTO users (name, email) VALUES (:name, :email)');
$stmt->execute(['name' => $name, 'email' => $email]);
Для массовой вставки рекомендуется использовать транзакции, что повышает производительность и обеспечивает целостность данных:
$pdo->beginTransaction();
foreach ($users as $user) {
$stmt->execute(['name' => $user['name'], 'email' => $user['email']]);
}
$pdo->commit();
PDO также позволяет динамически изменять драйвер базы данных без изменения синтаксиса запросов. Это повышает переносимость кода между MySQL, PostgreSQL, SQLite и другими СУБД.
Заключение: для надежного и безопасного взаимодействия с базой данных в PHP следует использовать PDO с подготовленными выражениями, управлением ошибок и транзакциями при массовых операциях.
Выполнение SELECT запроса и получение результата
Для выполнения SELECT запроса в PHP используется функция mysqli_query() или объектно-ориентированный метод $mysqli->query(). Запрос формируется строкой SQL и передается в функцию вместе с подключением к базе данных.
Пример выполнения запроса через объектно-ориентированный подход:
$result = $mysqli->query("SELECT id, name, email FROM users WHERE status = 'active'");
Если запрос выполнен успешно, возвращается объект mysqli_result. Для извлечения данных используется метод fetch_assoc(), который возвращает массив с ключами, соответствующими названиям столбцов.
Пример перебора результатов:
while ($row = $result->fetch_assoc()) {
echo "ID: " . $row['id'] . ", Name: " . $row['name'] . ", Email: " . $row['email'] . "<br>";
}
После завершения обработки важно освободить память с помощью $result->free(). При работе с большим количеством строк рекомендуется использовать построчную обработку через fetch_assoc() вместо fetch_all(), чтобы снизить нагрузку на память.
Для проверки ошибок выполнения запроса применяется $mysqli->error, что позволяет отлавливать синтаксические ошибки или проблемы с подключением.
Если результат требуется в виде массива всех строк сразу, можно использовать fetch_all(MYSQLI_ASSOC), что возвращает двумерный массив, где каждая строка соответствует одной записи из таблицы.
Пример получения всех строк:
$rows = $result->fetch_all(MYSQLI_ASSOC);
foreach ($rows as $row) {
echo $row['id'] . " - " . $row['name'] . "<br>";
}
Поддержка подготовленных выражений через prepare() и bind_param() повышает безопасность запросов и предотвращает SQL-инъекции, особенно при включении пользовательских данных.
Обработка ошибок при выполнении запроса

При выполнении SQL-запросов в PHP критично проверять результат выполнения функции mysqli_query или аналогичных методов PDO. Если запрос завершился неудачно, возвращается false. Игнорирование этой проверки может привести к некорректной обработке данных или ошибкам на страницах.
Для MySQLi используется проверка следующего вида:
$result = $mysqli->query($sql);
if (!$result) {
echo «Ошибка запроса: » . $mysqli->error;
exit;
}
Для PDO рекомендуется включить режим исключений:
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
try {
$stmt = $pdo->query($sql);
} catch (PDOException $e) {
error_log(«Ошибка запроса: » . $e->getMessage());
exit;
}
При множественных запросах или транзакциях рекомендуется проверять каждый шаг отдельно и использовать ROLLBACK при обнаружении ошибки. Это предотвращает частичное применение изменений в базе данных.
Извлечение данных с помощью fetch_assoc и fetch_all
Пример использования:
$result = $mysqli->query("SELECT id, name, email FROM users");
while ($row = $result->fetch_assoc()) {
echo $row['id'] . ' - ' . $row['name'] . ' - ' . $row['email'] . "<br>";
}
Метод fetch_all извлекает все строки результата сразу и возвращает массив массивов. Он удобен для небольших таблиц, когда необходимо обработать весь результат одновременно. fetch_all принимает параметр MYSQLI_ASSOC, чтобы вернуть ассоциативные массивы, или MYSQLI_NUM для индексированных массивов.
Пример использования:
$result = $mysqli->query("SELECT id, name, email FROM users");
$rows = $result->fetch_all(MYSQLI_ASSOC);
foreach ($rows as $row) {
echo $row['id'] . ' - ' . $row['name'] . ' - ' . $row['email'] . "<br>";
}
Для наглядного сравнения методов удобно использовать таблицу:
| Метод | Возвращаемый тип | Когда использовать | Плюсы | Минусы |
|---|---|---|---|---|
| fetch_assoc | Ассоциативный массив (одна строка) | Обработка больших наборов данных по одной строке | Экономия памяти, последовательная обработка | Неудобно при необходимости получить все данные сразу |
| fetch_all | Массив массивов (все строки) | Небольшие таблицы, когда нужен полный набор данных | Все данные доступны сразу, удобство перебора | Большие таблицы могут привести к высокой нагрузке на память |
Выбор метода зависит от размера данных и способа обработки. Для динамической генерации HTML-таблиц или отчетов чаще используют fetch_assoc, а для агрегации или сериализации данных в JSON – fetch_all.
Для отображения данных SQL в PHP в виде таблицы используется конструкция <table>. Важно сразу определить заголовки столбцов с помощью <th> и обеспечить экранирование данных через htmlspecialchars(), чтобы предотвратить XSS-уязвимости.
Пример базовой структуры:
<table border="1">
<tr>
<th>ID</th>
<th>Имя</th>
<th>Email</th>
</tr>
<?php
$result = $mysqli->query("SELECT id, name, email FROM users");
while($row = $result->fetch_assoc()) {
echo "<tr>";
echo "<td>" . htmlspecialchars($row['id']) . "</td>";
echo "<td>" . htmlspecialchars($row['name']) . "</td>";
echo "<td>" . htmlspecialchars($row['email']) . "</td>";
echo "</tr>";
}
?>
</table>
Рекомендации при работе с таблицами:
- Использовать
fetch_assoc()для ассоциативного массива – удобнее ссылаться на колонки по имени. - Добавлять
borderили CSS-классы для визуального разграничения строк и столбцов. - Для больших наборов данных применять пагинацию на уровне SQL с
LIMITиOFFSET, чтобы не перегружать страницу. - Использовать подготовленные выражения
prepare()при фильтрации или динамических запросах для безопасности.
Дополнительно можно формировать таблицу динамически, создавая заголовки на основе массива array_keys() первого результата:
<?php
$result = $mysqli->query("SELECT * FROM users");
if($row = $result->fetch_assoc()) {
echo "<table border='1'><tr>";
foreach(array_keys($row) as $col) {
echo "<th>" . htmlspecialchars($col) . "</th>";
}
echo "</tr>";
echo "<tr>";
foreach($row as $cell) {
echo "<td>" . htmlspecialchars($cell) . "</td>";
}
echo "</tr>";
while($row = $result->fetch_assoc()) {
echo "<tr>";
foreach($row as $cell) {
echo "<td>" . htmlspecialchars($cell) . "</td>";
}
echo "</tr>";
}
echo "</table>";
}
?>
Этот подход упрощает добавление новых колонок без изменения HTML-кода и гарантирует, что структура таблицы всегда соответствует результату запроса.
Фильтрацию реализуют с помощью WHERE:
- Для числовых значений:
WHERE price > 1000. - Для текстовых полей:
WHERE name LIKE '%Иван%'. - Для дат:
WHERE created_at > '2025-01-01'. - Комбинирование условий через
ANDиOR:WHERE status='active' AND price < 5000.
Сортировку выполняют с помощью ORDER BY:
- По возрастанию:
ORDER BY price ASC. - По убыванию:
ORDER BY created_at DESC. - Несколько полей:
ORDER BY category ASC, price DESC.
В PHP после выполнения запроса фильтровать данные через foreach или array_filter стоит только при необходимости дополнительной логики, не реализуемой в SQL. Пример:
$filtered = array_filter($results, function($row) {
return $row['stock'] > 0;
});
- Первая страница:
LIMIT 20 OFFSET 0 - Вторая страница:
LIMIT 20 OFFSET 20
Закрытие соединения и освобождение ресурсов

После выполнения SQL-запросов в PHP важно корректно закрывать соединение с базой данных и освобождать ресурсы, чтобы избежать утечек памяти и блокировок. В случае использования MySQLi закрытие соединения выполняется функцией mysqli_close($conn), где $conn – объект соединения. Если соединение создавалось через объект mysqli, можно использовать метод $conn->close().
Для PDO явного закрытия соединения не требуется: соединение разрушается при уничтожении объекта PDO. Однако для гарантированного освобождения ресурсов можно присвоить объекту значение null, например: $pdo = null;. Это особенно важно при длительных скриптах с большим количеством операций с базой данных.
При работе с результатами запроса через MySQLi следует освобождать память, вызвав mysqli_free_result($result) после обработки данных. Для объектов PDO метод fetchAll() автоматически возвращает массив, освобождая внутренние буферы, но при использовании PDOStatement рекомендуется вызвать $stmt->closeCursor(), чтобы подготовленный запрос можно было повторно использовать.
Правильное закрытие соединений и освобождение ресурсов обеспечивает стабильность приложения, снижает нагрузку на сервер и предотвращает ошибки типа «Too many connections». При больших объёмах данных важно контролировать момент вызова free_result() и closeCursor(), чтобы избежать накопления неосвобождённых ресурсов.
Вопрос-ответ:
Как подключиться к базе данных в PHP перед выполнением SQL запроса?
Для подключения используют объект mysqli или PDO. С mysqli создается объект с указанием хоста, имени пользователя, пароля и названия базы. Если используется PDO, нужно указать DSN (Data Source Name) и передать логин с паролем. После успешного подключения можно выполнять запросы, а в случае ошибки соединение выводит сообщение о проблеме.
Какие функции PHP удобны для получения результатов SELECT запроса?
Для mysqli это методы fetch_assoc(), fetch_row(), fetch_array(), которые возвращают данные в виде массива. fetch_assoc() удобен, если нужны ассоциативные ключи с названиями столбцов. При использовании PDO применяют метод fetch() или fetchAll(), которые позволяют получать строки в виде ассоциативного массива, объекта или числового массива. Выбор зависит от того, как планируется использовать данные дальше.
Как вывести несколько строк результата запроса в цикле?
После выполнения SELECT запроса создается объект результата. С mysqli можно использовать while ($row = $result->fetch_assoc()) { … } для прохода по каждой строке. Внутри цикла можно выводить значения отдельных столбцов, формировать HTML-таблицы или списки. В PDO применяют foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $row) { … } для перебора всех строк.
Что делать, если SQL запрос не возвращает данных?
Сначала проверяют корректность самого запроса и наличие данных в таблице. В PHP после выполнения запроса можно проверить количество строк с помощью $result->num_rows для mysqli или rowCount() для PDO. Если данных нет, выводят сообщение пользователю или обрабатывают этот случай в логике скрипта, чтобы не возникало ошибок при обращении к пустому массиву.
Можно ли форматировать вывод результата запроса прямо в PHP?
Да, PHP позволяет обрабатывать данные перед выводом. Например, числа можно форматировать функцией number_format(), даты преобразовывать через date() после конвертации в timestamp. Также удобно формировать HTML-таблицы, списки или комбинировать значения нескольких столбцов в одну строку. Это позволяет отображать информацию в читаемом виде, без изменения самой базы данных.
