info
В этой статье рассматривается функция mysqli_info() в PHP, которая возвращает информацию о последнем выполненном запросе.
В этой статье рассматривается функция mysqli_info() в PHP, которая возвращает удобочитаемую строку, описывающую результат последнего выполненного запроса. Вы узнаете, что возвращает функция, какие операторы порождают вывод, как вызывать её в процедурном и объектно-ориентированном стилях MySQLi, а также чем она отличается от связанных функций, таких как mysqli_affected_rows().
Что возвращает mysqli_info()
mysqli_info() — это встроенная функция PHP, которая возвращает форматированную строку состояния для последнего запроса, выполненного на данном соединении. Строка совпадает с тем текстом, который сервер MySQL сообщает для данного оператора — она предназначена для людей, а не для программной обработки.
Функция возвращает строку только для операторов, изменяющих или загружающих несколько строк. Для других запросов (обычный SELECT, CREATE TABLE и т. д.) она возвращает пустую строку или NULL. Операторы, для которых возвращается строка:
| Оператор | Пример строки вывода |
|---|---|
INSERT INTO ... SELECT ... | Records: 3 Duplicates: 0 Warnings: 0 |
INSERT INTO ... VALUES (...),(...) | Records: 2 Duplicates: 0 Warnings: 0 |
LOAD DATA INFILE ... | Records: 1 Deleted: 0 Skipped: 0 Warnings: 0 |
ALTER TABLE ... | Records: 3 Duplicates: 0 Warnings: 0 |
UPDATE ... | Rows matched: 40 Changed: 40 Warnings: 0 |
Поскольку формат строки нестабилен и может различаться в зависимости от типа оператора или версии MySQL, используйте её только для отображения. Чтобы программно получить отдельные числа, используйте специальные функции — см. mysqli_affected_rows() и mysqli_warning_count().
Синтаксис
mysqli_info() принимает ссылку на соединение, возвращаемую функцией mysqli_connect():
// Procedural style
string mysqli_info(mysqli $link)
// Object-oriented style
string $mysqli->infoВ объектно-ориентированном API info является свойством, а не методом — обратите внимание на отсутствие скобок.
Как использовать mysqli_info()
Вызовите mysqli_info() на действующем соединении MySQLi сразу после выполнения запроса с помощью mysqli_query(). Выполните проверку статуса до отправки следующего запроса, так как каждый новый запрос перезаписывает предыдущий статус.
<?php
$mysqli = mysqli_connect("localhost", "username", "password", "database");
if (!$mysqli) {
die("Connection failed: " . mysqli_connect_error());
}
// A multi-row INSERT produces a status string
$sql = "INSERT INTO users (name) VALUES ('Ann'), ('Bob'), ('Cara')";
if (mysqli_query($mysqli, $sql)) {
echo mysqli_info($mysqli);
} else {
echo "Query failed: " . mysqli_error($mysqli);
}
mysqli_close($mysqli);
?>Для трёхстрочной вставки выше скрипт выведет:
Records: 3 Duplicates: 0 Warnings: 0Здесь Records — количество строк, обработанных оператором, Duplicates — количество строк, конфликтующих с уникальным ключом, а Warnings — количество некритических предупреждений, возникших при выполнении.
Объектно-ориентированный стиль
Та же логика с использованием объектно-ориентированного API MySQLi обращается к свойству info:
<?php
$mysqli = new mysqli("localhost", "username", "password", "database");
if ($mysqli->connect_errno) {
die("Connection failed: " . $mysqli->connect_error);
}
$mysqli->query("INSERT INTO users (name) VALUES ('Ann'), ('Bob'), ('Cara')");
echo $mysqli->info; // Records: 3 Duplicates: 0 Warnings: 0
$mysqli->close();
?>mysqli_info() и mysqli_affected_rows()
Эти функции легко перепутать:
mysqli_info()возвращает форматированную строку для отображения и работает только для типов операторов, перечисленных выше.- mysqli_affected_rows() возвращает целочисленное количество строк, изменённых операторами
INSERT,UPDATE,DELETEилиREPLACE— используйте её, когда вам нужно число в коде.
Если вам нужно число, никогда не разбирайте строку mysqli_info(); вызывайте mysqli_affected_rows() напрямую.
Распространённые ошибки
- Обычный
SELECTничего не возвращает.mysqli_info()пуста дляSELECT; чтобы подсчитать возвращённые строки, используйтеmysqli_num_rows()на результирующем наборе. - Статус сбрасывается при следующем запросе. Читайте
mysqli_info()сразу после интересующего вас запроса. - Не разбирайте строку. Её формулировка меняется в зависимости от типа оператора и версии сервера; для логики используйте специальные функции подсчёта строк и предупреждений.
Заключение
mysqli_info() — это быстрый способ получить удобочитаемую сводку о результатах последнего запроса: сколько записей было обработано, сколько оказались дубликатами и сколько возникло предупреждений. Используйте её для логирования и отладки, а для получения числовых значений обращайтесь к mysqli_affected_rows() или mysqli_warning_count(). Подробнее о выполнении запросов см. в обзоре PHP MySQLi.