errno
Функция mysqli_errno() в PHP возвращает числовой код ошибки для последней операции MySQLi. Узнайте, как её использовать.
В этой статье рассматривается функция PHP mysqli_errno(), которая возвращает числовой код ошибки для последнего вызова на соединении MySQLi. Вы узнаете, что она возвращает, как читать код, чем она отличается от mysqli_error(), и как использовать её в процедурном и объектно-ориентированном стилях MySQLi.
Что делает mysqli_errno()
mysqli_errno() — встроенная функция PHP, которая возвращает код ошибки от последней функции MySQLi, выполненной на данном соединении. Это программный аналог сообщения на человеческом языке: там где mysqli_error() возвращает предложение вроде «Table 'db.my_table' doesn't exist», функция mysqli_errno() возвращает целое число (в данном случае 1146), с которым можно сравнивать в коде.
Синтаксис и возвращаемое значение
mysqli_errno(mysqli $mysqli): int- Параметр —
$mysqli: соединение, возвращённое функциейmysqli_connect()(процедурный стиль) илиnew mysqli(...)(объектно-ориентированный стиль). - Возвращаемое значение — код ошибки последнего вызова на данном соединении, либо
0, если ошибки не было. Всегда проверяйте возвращаемое значение, а не предполагайте наличие ошибки.
Зачем число? Числовые коды стабильны и удобны для ветвления. Текст сообщения об ошибке может меняться в разных версиях MySQL или при смене локали, тогда как код (например,
1062для дублирующегося ключа) остаётся прежним — именно коды следует использовать в логикеif/switch.
Использование mysqli_errno() (процедурный стиль)
Функция принимает единственный аргумент — действительное соединение MySQLi. Вот типичный шаблон использования:
Как использовать функцию mysqli_errno()?
<?php
$mysqli = mysqli_connect("localhost", "username", "password", "database");
if (!$mysqli) {
die("Connection failed: " . mysqli_connect_error());
}
$query = "SELECT * FROM my_table";
$result = mysqli_query($mysqli, $query);
if (!$result) {
$error_code = mysqli_errno($mysqli);
echo "Failed to execute query. Error code: " . $error_code;
exit();
}
mysqli_close($mysqli);
?>Здесь мы сначала проверяем успешность соединения, затем выполняем запрос с помощью mysqli_query(). Если запрос завершился неудачей (!$result), функция mysqli_errno($mysqli) возвращает числовой код, который можно записать в журнал и завершить выполнение.
Совместное использование errno и mysqli_error()
На практике почти всегда нужны и код (для ветвления), и сообщение (для журналирования или отображения). Используйте mysqli_errno() совместно с mysqli_error():
<?php
$mysqli = mysqli_connect("localhost", "username", "password", "database");
$result = mysqli_query($mysqli, "SELECT * FROM missing_table");
if (!$result) {
$code = mysqli_errno($mysqli); // e.g. 1146
$message = mysqli_error($mysqli); // e.g. "Table 'database.missing_table' doesn't exist"
// Branch on the stable numeric code, not the message text.
if ($code === 1146) {
echo "The table is missing. ";
}
echo "[$code] $message";
}
mysqli_close($mysqli);
?>Объектно-ориентированный стиль
Если соединение создаётся с помощью new mysqli(...), обращайтесь к $mysqli->errno как к свойству (и к $mysqli->error для сообщения) вместо процедурной функции:
<?php
$mysqli = new mysqli("localhost", "username", "password", "database");
if (!$mysqli->query("SELECT * FROM missing_table")) {
echo "Error " . $mysqli->errno . ": " . $mysqli->error;
}
$mysqli->close();
?>Оба стиля возвращают один и тот же код — выбирайте тот, который соответствует остальной части вашей кодовой базы. Обзор расширения см. в разделе PHP MySQLi.
Распространённые коды ошибок MySQL
Несколько кодов, которые часто встречаются при обработке ошибок MySQLi:
| Код | Значение |
|---|---|
1045 | Доступ запрещён для пользователя (неверное имя пользователя или пароль) |
1049 | Неизвестная база данных |
1062 | Дублирующаяся запись для уникального или первичного ключа |
1146 | Таблица не существует |
1264 | Значение вне допустимого диапазона для столбца |
1452 | Нарушение ограничения внешнего ключа |
Полный список см. в официальном справочнике ошибок сервера MySQL.
Расширенное использование
Функцию mysqli_errno() можно применять и в более сложных сценариях. При работе с несколькими соединениями необходимо передавать конкретный объект MySQLi в функцию, чтобы получить код ошибки для данного соединения. Пример:
Расширенное использование PHP mysqli_errno()
<?php
$mysqli1 = mysqli_connect("localhost", "username", "password", "database1");
$mysqli2 = mysqli_connect("localhost", "username", "password", "database2");
if (!$mysqli1 || !$mysqli2) {
die("One or more connections failed.");
}
$query = "SELECT * FROM my_table";
$result1 = mysqli_query($mysqli1, $query);
$result2 = mysqli_query($mysqli2, $query);
if (!$result1) {
$error_code = mysqli_errno($mysqli1);
echo "Failed to execute query on connection 1. Error code: " . $error_code;
exit();
}
if (!$result2) {
$error_code = mysqli_errno($mysqli2);
echo "Failed to execute query on connection 2. Error code: " . $error_code;
exit();
}
mysqli_close($mysqli1);
mysqli_close($mysqli2);
?>В этом примере создаются два объекта MySQLi, подключающихся к двум разным базам данных MySQL. Затем один и тот же запрос выполняется через каждое соединение, а результат сохраняется в переменной. Наличие ошибки проверяется условием !$result. При возникновении ошибки вызывается mysqli_errno() для соответствующего объекта MySQLi, чтобы получить код ошибки конкретного соединения. После этого код ошибки выводится и скрипт завершается.
Примечание:
mysqli_errno()сообщает об ошибке одного конкретного соединения. При нескольких открытых соединениях код привязан к тому объекту соединения, который вы передаёте — поэтому всегда передавайте нужный.
Связанные функции
mysqli_connect_errno()— код ошибки для неудачной попытки подключения (когда само соединение не удалось установить).mysqli_connect_error()— сообщение для неудачной попытки подключения.error_get_last()— последняя ошибка PHP (не специфичная для MySQLi).
Заключение
mysqli_errno() возвращает числовой код ошибки для последней операции на соединении MySQLi, либо 0, если ошибки не было. Используйте её совместно с mysqli_error() для получения сообщения, ветвьтесь по стабильному числовому коду и передавайте правильный объект соединения при наличии нескольких открытых — это основа надёжной обработки ошибок MySQLi.