mysqli::$error
mysqli_error
(PHP 5)
mysqli::$error -- mysqli_error — Возвращает строку с описанием последней ошибки
Описание
Объектно-ориентированный стиль
string $mysqli->error;
Процедурный стиль
Возвращает сообщение об ошибке последнего вызова функции MySQLi, который может успешно выполниться или провалиться.
Список параметров
-
link
-
Только для процедурного стиля: Идентификатор соединения, полученный с помощью mysqli_connect() или mysqli_init()
Возвращаемые значения
Строка с описанием ошибки. Пустая строка, если ошибки нет.
Примеры
Пример #1 Пример с $mysqli->error
Объектно-ориентированный стиль
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
/* check connection */
if ($mysqli->connect_errno) {
printf("Connect failed: %s\n", $mysqli->connect_error);
exit();
}
if (!$mysqli->query("SET a=1")) {
printf("Errormessage: %s\n", $mysqli->error);
}
/* close connection */
$mysqli->close();
?>
Процедурный стиль
<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
if (!mysqli_query($link, "SET a=1")) {
printf("Errormessage: %s\n", mysqli_error($link));
}
/* close connection */
mysqli_close($link);
?>
Результат выполнения данных примеров:
Errormessage: Unknown system variable 'a'
Смотрите также
- mysqli_connect_errno() - Возвращает код ошибки последней попытки соединения
- mysqli_connect_error() - Возвращает описание последней ошибки подключения
- mysqli_errno() - Возвращает код ошибки последнего вызова функции
- mysqli_sqlstate() - Возвращает код состояния SQLSTATE последней MySQL операции
- PHP Руководство
- Функции по категориям
- Индекс функций
- Справочник функций
- Расширения для работы с базами данных
- Расширения для работы с базами данных отдельных производителей
- MySQL Drivers and Plugins
- Улучшенный модуль MySQL
- Функция mysqli::$affected_rows() - Получает число строк, затронутых предыдущей операцией MySQL
- Функция mysqli::autocommit() - Включает или отключает автоматическую фиксацию изменений базы данных
- Функция mysqli::begin_transaction() - Starts a transaction
- Функция mysqli::change_user() - Позволяет сменить пользователя подключенного к базе данных
- Функция mysqli::character_set_name() - Возвращает кодировку по умолчанию, установленную для соединения с БД
- Функция mysqli::$client_info() - Получает информацию о клиенте MySQL
- Функция mysqli::$client_version() - Возвращает информацию о клиенте MySQL в виде строки
- Функция mysqli::close() - Закрывает ранее открытое соединение с базой данных
- Функция mysqli::commit() - Фиксирует текущую транзакцию
- Функция mysqli::$connect_errno() - Возвращает код ошибки последней попытки соединения
- Функция mysqli::$connect_error() - Возвращает описание последней ошибки подключения
- Функция mysqli::__construct() - Устанавливает новое соединение с сервером MySQL
- Функция mysqli::debug() - Выполняет процедуры отладки
- Функция mysqli::dump_debug_info() - Журналирование отладочной информации
- Функция mysqli::$errno() - Возвращает код ошибки последнего вызова функции
- Функция mysqli::$error_list() - Возвращает список ошибок выполнения последней запущенной команды
- Функция mysqli::$error() - Возвращает строку с описанием последней ошибки
- Функция mysqli::$field_count() - Возвращает число столбцов, затронутых последним запросом
- Функция mysqli::get_charset() - Возвращает набор символов в виде объекта
- Функция mysqli::get_client_info() - Получает информацию о клиенте MySQL
- Функция mysqli_get_client_stats() - Возвращает статистику клиента для каждого процесса
- Функция mysqli_get_client_version() - Возвращает информацию о клиенте MySQL в виде строки
- Функция mysqli::get_connection_stats() - Возвращает статистику соединения с клиентом
- Функция mysqli::$host_info() - Возвращает строку, содержащую тип используемого соединения
- Функция mysqli::$protocol_version() - Возвращает версию используемого MySQL протокола
- Функция mysqli::$server_info() - Возвращает версию MySQL сервера
- Функция mysqli::$server_version() - Возвращает версию сервера MySQL, представленую в виде integer
- Функция mysqli::get_warnings() - Получает результат SHOW WARNINGS
- Функция mysqli::$info() - Извлекает информацию о последнем выполненном запросе
- mysqli::init
- Функция mysqli::$insert_id() - Возвращает автоматически генерируемый ID, используя последний запрос
- Функция mysqli::kill() - Запрос для сервера завершить выполнение процесса MySQL
- Функция mysqli::more_results() - Проверка, есть ли еще результаты в мультизапросе
- Функция mysqli::multi_query() - Выполняет запрос к базе данных
- Функция mysqli::next_result() - Подготовка следующего доступного результирующего набора из multi_query
- Функция mysqli::options() - Задание настроек
- mysqli::ping
- Функция mysqli::poll() - Опрос подключений
- Функция mysqli::prepare() - Подготавливает SQL выражение к выполнению
- Функция mysqli::query() - Выполняет запрос к базе данных
- Функция mysqli::real_connect() - Устанавливает соединение с сервером mysql
- mysqli::real_escape_string
- Функция mysqli::real_query() - Выполнение SQL запроса
- Функция mysqli::reap_async_query() - Получение результата асинхронного запроса
- Функция mysqli::refresh() - Обновление
- Функция mysqli::release_savepoint() - Rolls back a transaction to the named savepoint
- Функция mysqli::rollback() - Откат текущей транзакции
- Функция mysqli::rpl_query_type() - Возвращает RPL тип запроса
- Функция mysqli::savepoint() - Set a named transaction savepoint
- Функция mysqli::select_db() - Устанавливает базу данных для выполняемых запросов
- Функция mysqli::send_query() - Отправка запроса и возврат
- Функция mysqli::set_charset() - Задает набор символов по умолчанию
- Функция mysqli::set_local_infile_default() - Отмена привязки callback-функции для команды load local infile
- Функция mysqli::set_local_infile_handler() - Задает callback-функцию для команды LOAD DATA LOCAL INFILE
- Функция mysqli::$sqlstate() - Возвращает код состояния SQLSTATE последней MySQL операции
- Функция mysqli::ssl_set() - Используется для установления безопасных соединений, используя SSL
- Функция mysqli::stat() - Получение информации о текущем состоянии системы
- mysqli::stmt_init
- Функция mysqli::store_result() - Передает результирующий набор последнего запроса
- Функция mysqli::$thread_id() - Возвращает ID процесса текущего подключения
- Функция mysqli::thread_safe() - Показывает, безопасна ли работа с процессами
- Функция mysqli::use_result() - Готовит результирующий набор на сервере к использованию
- Функция mysqli::$warning_count() - Возвращает количество предупреждений из последнего запроса заданного подключения
Коментарии
The mysqli_sql_exception class is not available to PHP 5.05
I used this code to catch errors
<?php
$query = "SELECT XXname FROM customer_table ";
$res = $mysqli->query($query);
if (!$res) {
printf("Errormessage: %s\n", $mysqli->error);
}
?>
The problem with this is that valid values for $res are: a mysqli_result object , true or false
This doesn't tell us that there has been an error with the sql used.
If you pass an update statement, false is a valid result if the update fails.
So, a better way is:
<?php
$query = "SELECT XXname FROM customer_table ";
$res = $mysqli->query($query);
if (!$mysqli->error) {
printf("Errormessage: %s\n", $mysqli->error);
}
?>
This would output something like:
Unexpected PHP error [mysqli::query() [<a href='function.query'>function.query</a>]: (42S22/1054): Unknown column 'XXname' in 'field list'] severity [E_WARNING] in [G:\database.php] line [249]
Very frustrating as I wanted to also catch the sql error and print out the stack trace.
A better way is:
<?php
mysqli_report(MYSQLI_REPORT_OFF); //Turn off irritating default messages
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
$query = "SELECT XXname FROM customer_table ";
$res = $mysqli->query($query);
if ($mysqli->error) {
try {
throw new Exception("MySQL error $mysqli->error <br> Query:<br> $query", $msqli->errno);
} catch(Exception $e ) {
echo "Error No: ".$e->getCode(). " - ". $e->getMessage() . "<br >";
echo nl2br($e->getTraceAsString());
}
}
//Do stuff with the result
?>
Prints out something like:
Error No: 1054
Unknown column 'XXname' in 'field list'
Query:
SELECT XXname FROM customer_table
#0 G:\\database.php(251): database->dbError('Unknown column ...', 1054, 'getQuery()', 'SELECT XXname F...')
#1 G:\data\WorkSites\1framework5\tests\dbtest.php(29): database->getString('SELECT XXname F...')
#2 c:\PHP\includes\simpletest\runner.php(58): testOfDB->testGetVal()
#3 c:\PHP\includes\simpletest\runner.php(96): SimpleInvoker->invoke('testGetVal')
#4 c:\PHP\includes\simpletest\runner.php(125): SimpleInvokerDecorator->invoke('testGetVal')
#5 c:\PHP\includes\simpletest\runner.php(183): SimpleErrorTrappingInvoker->invoke('testGetVal')
#6 c:\PHP\includes\simpletest\simple_test.php(90): SimpleRunner->run()
#7 c:\PHP\includes\simpletest\simple_test.php(498): SimpleTestCase->run(Object(HtmlReporter))
#8 c:\PHP\includes\simpletest\simple_test.php(500): GroupTest->run(Object(HtmlReporter))
#9 G:\all_tests.php(16): GroupTest->run(Object(HtmlReporter))
This will actually print out the error, a stack trace and the offending sql statement. Much more helpful when the sql statement is generated somewhere else in the code.
The decription "mysqli_error -- Returns a string description of the LAST error" is not exactly that what you get from mysqli_error. You get the error description from the last mysqli-function, not from the last mysql-error.
If you have the following situation
if (!$mysqli->query("SET a=1")) {
$mysqli->query("ROLLBACK;")
printf("Errormessage: %s\n", $mysqli->error);
}
you don't get an error-message, if the ROLLBACK-Query didn't failed, too. In order to get the right error-message you have to write:
if (!$mysqli->query("SET a=1")) {
printf("Errormessage: %s\n", $mysqli->error);
$mysqli->query("ROLLBACK;")
}
Please note that the string returned may contain data initially provided by the user, possibly making your code vulnerable to XSS.
So even if you escape everything in your SQL query using mysqli_real_escape_string(), make sure that if you plan to display the string returned by mysqli_error() you run that string through htmlspecialchars().
As far as I can tell the two escape functions don't escape the same characters, which is why you need both (the first for SQL and the second for HTML/JS).
I had to set mysqli_report(MYSQLI_REPORT_ALL) at the begin of my script to be able to catch mysqli errors within the catch block of my php code.
Initially, I used the below code to throw and subsequent catch mysqli exceptions
<?php
try {
$mysqli = new mysqli('localhost','root','pwd','db');
if ($mysqli->connect_errno)
throw new Exception($mysqli->connect_error);
} catch (Exception $e) {
echo $e->getMessage();
}
I realized the exception was being thrown before the actual throw statement and hence the catch block was not being called.
My current code looks like
mysqli_report(MYSQLI_REPORT_ALL) ;
try {
$mysqli = new mysqli('localhost','root','pwd','db');
/* I don't need to throw the exception, it's being thrown automatically */
} catch (Exception $e) {
echo $e->getMessage();
}
This works fine and I'm able to trap all mysqli errors
<?php
// The idea is the add formated errors information for developers to easier bugs detection.
$myfile = fopen("database_log.log", "r");
$db = new mysqli("localhost", "root","root","data");
if(!$db->query("SELECT")){
$timestamp = new DateTime();
$data_err = " {
\"title\": \" Select statement error \",
\"date_time\": ".$timestamp->getTimestamp().",
\"error\":\" ".$db->error." \"
} "; // Do more information
fwrite($myfile, $data_err); // writing data
}
// In separate file do file read and format it for good visual.
$db->close();
fclose($myfile);
?>