Содержание статьи

Работа с базами данных в PHP через расширение MySQLi требует точного понимания, какие результаты возвращают запросы. SELECT запросы возвращают объект mysqli_result, который позволяет последовательно получать строки данных с помощью функций fetch_assoc, fetch_row и fetch_all. Для INSERT, UPDATE и DELETE возвращается логическое значение true при успешном выполнении или false при ошибке.
Для анализа количества затронутых строк используется функция mysqli_affected_rows. Она особенно полезна при массовых обновлениях или удалении данных, позволяя программно контролировать результаты и реагировать на изменения.
При извлечении данных из SELECT-запроса важно правильно обрабатывать результат: проверять, есть ли строки, и выбирать метод получения данных в зависимости от задачи. fetch_assoc возвращает ассоциативный массив с именами полей, fetch_row – нумерованный массив, а fetch_all позволяет сразу получить весь набор строк. Этот выбор влияет на читаемость кода и нагрузку на сервер.
Обработка ошибок при выполнении запросов является обязательной частью работы с MySQLi. Методы mysqli_error и mysqli_errno дают детализированную информацию о причине сбоя, что позволяет оперативно корректировать SQL и предотвращать потерю данных.
Как выполнять SELECT запросы и получать данные из таблиц
Для извлечения данных из MySQL в PHP используется метод query объекта mysqli. SELECT запрос возвращает объект mysqli_result, который содержит строки результата и метаданные полей.
Основной алгоритм выполнения SELECT запроса выглядит следующим образом:
- Создать соединение с базой данных через new mysqli(host, user, password, database).
- Вызвать метод query с текстом SQL-запроса: $result = $mysqli->query(«SELECT * FROM users»).
- Проверить успешность выполнения: if ($result === false), использовать mysqli_error для диагностики.
- Обработать результат с помощью методов fetch_assoc, fetch_row или fetch_all.
- Закрыть объект результата методом free и соединение через close.
Для получения строк данных применяются следующие подходы:
- fetch_assoc() – возвращает ассоциативный массив, где ключи соответствуют именам полей таблицы. Удобно для работы с конкретными колонками.
- fetch_row() – возвращает нумерованный массив, полезно для итераций по индексам или массовой обработке без указания имен полей.
- fetch_all(MYSQLI_ASSOC) – сразу возвращает весь набор строк в виде массива ассоциативных массивов. Удобно для небольших таблиц.
При работе с большим количеством данных рекомендуется использовать циклы с fetch_assoc или fetch_row, чтобы снизить нагрузку на память. Для анализа количества полученных строк применяется mysqli_num_rows($result).
Обработка INSERT и UPDATE запросов с проверкой успешности
INSERT и UPDATE запросы в MySQLi возвращают true при успешном выполнении или false при ошибке. Для их корректной обработки важно проверять результат сразу после выполнения запроса.
Пример выполнения INSERT запроса:
$result = $mysqli->query(«INSERT INTO users (name, email) VALUES (‘Иван’, ‘ivan@example.com’)»);
Если $result === true, операция завершена успешно. Для идентификатора вставленной строки используется mysqli_insert_id($mysqli).
Для UPDATE запросов алгоритм аналогичен:
$result = $mysqli->query(«UPDATE users SET email=’new@example.com’ WHERE id=5»);
Проверка выполняется через $result === true. Количество изменённых строк доступно через mysqli_affected_rows($mysqli), что позволяет убедиться, что обновление затронуло нужные записи.
При ошибках следует использовать mysqli_error($mysqli) для получения текста ошибки и mysqli_errno($mysqli) для кода. Это важно при обработке данных из пользовательского ввода или внешних источников.
Рекомендуется заключать INSERT и UPDATE запросы в транзакции (begin_transaction / commit / rollback) при необходимости атомарного выполнения нескольких операций, чтобы предотвратить частичное внесение изменений в базу.
Использование mysqli_num_rows для подсчета строк результата

Функция mysqli_num_rows возвращает количество строк, полученных в результате SELECT запроса. Это особенно полезно для проверки наличия данных перед их обработкой и для создания отчётов.
Пример использования:
$result = $mysqli->query(«SELECT id, name, email FROM users»);
$count = mysqli_num_rows($result);
Для наглядного представления результатов можно использовать таблицу:
| ID | Имя | |
|---|---|---|
| «.$row[‘id’].» | «.$row[‘name’].» | «.$row[’email’].» |
Использование mysqli_num_rows совместно с циклами while позволяет программно контролировать количество обрабатываемых строк и оптимизировать работу с большими таблицами.
Получение отдельных значений с помощью mysqli_fetch_assoc и mysqli_fetch_row
Функция mysqli_fetch_assoc возвращает одну строку результата SELECT в виде ассоциативного массива, где ключи соответствуют именам полей таблицы. Это удобно для работы с конкретными колонками по имени.
Пример использования:
$result = $mysqli->query(«SELECT id, name, email FROM users»);
while ($row = $result->fetch_assoc()) {
echo $row[‘name’].» – «.$row[’email’].»
«;
}
Функция mysqli_fetch_row возвращает строку как нумерованный массив. Индексы соответствуют порядку полей в запросе, что может быть полезно при итерации или массовой обработке данных.
Пример использования:
while ($row = $result->fetch_row()) {
echo $row[1].» – «.$row[2].»
«;
}
При работе с большими таблицами рекомендуется выбирать метод в зависимости от потребностей: fetch_assoc повышает читаемость кода при выборке конкретных колонок, а fetch_row снижает накладные расходы при массовой обработке.
Работа с mysqli_fetch_all для выборки полного набора данных

Функция mysqli_fetch_all позволяет получить все строки результата SELECT одним вызовом, возвращая массив массивов. Это ускоряет обработку, если требуется сразу получить весь набор данных.
Синтаксис и варианты:
- $rows = $result->fetch_all(MYSQLI_ASSOC); – ассоциативный массив с именами полей.
- $rows = $result->fetch_all(MYSQLI_NUM); – нумерованный массив по индексу поля.
- $rows = $result->fetch_all(MYSQLI_BOTH); – каждая строка содержит и ассоциативные, и числовые ключи.
Пошаговое использование:
- Создать соединение и выполнить SELECT запрос: $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’].»
«;
}
Для больших таблиц лучше использовать последовательное чтение строк через fetch_assoc или fetch_row, чтобы уменьшить потребление памяти и избежать переполнения.
Обработка ошибок и проверка результата выполнения запроса

При работе с MySQLi важно проверять результат выполнения каждого запроса. SELECT возвращает объект mysqli_result при успешном выполнении и false при ошибке, INSERT, UPDATE и DELETE возвращают true или false.
Для диагностики ошибок используются функции:
- mysqli_error($mysqli) – возвращает текст последней ошибки соединения или запроса.
- mysqli_errno($mysqli) – возвращает код ошибки, что позволяет программно различать типы сбоев.
Пример проверки выполнения SELECT запроса:
$result = $mysqli->query(«SELECT id, name FROM users»);
if ($result === false) {
echo «Ошибка запроса: «.$mysqli->error.» (код «.$mysqli->errno.»)»;
} else {
while ($row = $result->fetch_assoc()) { /* обработка данных */ }
}
Для INSERT и UPDATE проверка аналогична, дополнительно можно использовать mysqli_affected_rows($mysqli) для определения количества затронутых строк. Это помогает выявлять непреднамеренные пропуски и контролировать корректность внесённых изменений.
При комплексных операциях рекомендуется использовать транзакции (begin_transaction, commit, rollback), чтобы отменять изменения при возникновении ошибок и сохранять целостность данных.
Закрытие соединения и освобождение ресурсов после запроса

После выполнения запросов важно закрывать соединение с базой данных и освобождать ресурсы, чтобы избежать утечек памяти и блокировок.
Для объектов результата используется метод free:
$result->free();
Это освобождает память, занятую набором данных SELECT, особенно важно при больших таблицах или множественных запросах в одном скрипте.
Закрытие соединения выполняется методом close:
$mysqli->close();
Это завершает сессию с сервером MySQL и освобождает ресурсы, связанные с соединением. При использовании нескольких соединений рекомендуется закрывать каждое после завершения работы.
Если используется транзакция, перед закрытием соединения необходимо завершить её через commit или отменить через rollback, чтобы сохранить целостность данных.
Вопрос-ответ:
Какие данные возвращает SELECT запрос в MySQLi и как их правильно обработать?
SELECT запрос возвращает объект mysqli_result. Для получения строк используют функции fetch_assoc, fetch_row или fetch_all. fetch_assoc формирует ассоциативный массив с именами полей, fetch_row — нумерованный массив, а fetch_all возвращает весь набор данных сразу. Для больших таблиц рекомендуется обрабатывать строки по одной, чтобы не перегружать память.
Как проверить успешность выполнения INSERT или UPDATE запроса?
INSERT и UPDATE возвращают true, если операция выполнена, и false, если возникла ошибка. Для дополнительной проверки количества затронутых строк используют mysqli_affected_rows($mysqli). Это позволяет убедиться, что изменения применились к нужным записям, а не к пустому результату.
В чем разница между fetch_assoc и fetch_row при получении данных?
fetch_assoc возвращает ассоциативный массив, где ключи — это имена полей таблицы, что облегчает работу с конкретными колонками. fetch_row возвращает нумерованный массив по индексу поля, что удобно для итераций и массовой обработки данных. Выбор метода зависит от структуры данных и требований к коду.
Зачем использовать mysqli_num_rows и когда это необходимо?
Функция mysqli_num_rows возвращает количество строк в результате SELECT запроса. Она позволяет проверять наличие данных перед их обработкой, формировать отчёты и контролировать вывод. Особенно полезна при фильтрации или поиске, когда нужно понять, есть ли совпадения в таблице.
Как правильно закрывать соединение и освобождать ресурсы после выполнения запросов?
После работы с базой следует освободить ресурсы результата через $result->free() и закрыть соединение методом $mysqli->close(). При использовании транзакций необходимо завершить их через commit или отменить через rollback. Это предотвращает утечки памяти и сохраняет целостность данных.
