mysqli::$error

mysqli_error

(PHP 5, PHP 7, PHP 8)

mysqli::$error -- mysqli_error返回最后一个错误的字符串描述

描述

面向对象风格

过程式风格

mysqli_error(mysqli $mysql): string

返回最近一次可能成功或失败的 MySQLi 函数调用的最后一个错误消息。

参数

mysql

仅限过程式风格:由 mysqli_connect()mysqli_init() 返回的 mysqli 对象

返回值

描述错误的字符串。如果未发生错误,则为空字符串。

示例

示例 #1 $mysqli->error 示例

面向对象风格

<?php
$mysqli
= new mysqli("localhost", "my_user", "my_password", "world");

/* 检查连接 */
if ($mysqli->connect_errno) {
printf("连接失败:%s\n", $mysqli->connect_error);
exit();
}

if (!
$mysqli->query("SET a=1")) {
printf("错误消息:%s\n", $mysqli->error);
}

/* 关闭连接 */
$mysqli->close();
?>

过程式风格

<?php
$link
= mysqli_connect("localhost", "my_user", "my_password", "world");

/* 检查连接 */
if (mysqli_connect_errno()) {
printf("连接失败:%s\n", mysqli_connect_error());
exit();
}

if (!
mysqli_query($link, "SET a=1")) {
printf("错误消息:%s\n", mysqli_error($link));
}

/* 关闭连接 */
mysqli_close($link);
?>

以上示例将输出

Error message: Unknown system variable 'a'

参见

添加备注

用户贡献的备注 7 则备注

17
information at saunderswebsolutions dot com
18 年前
mysqli_sql_exception 类在 PHP 5.05 中不可用

我使用此代码来捕获错误
<?php
$query
= "SELECT XXname FROM customer_table ";
$res = $mysqli->query($query);

if (!
$res) {
printf("错误消息:%s\n", $mysqli->error);
}

?>
此代码的问题是 $res 的有效值为:mysqli_result 对象、true 或 false
这并不能告诉我们使用的 sql 是否发生了错误。
如果您传递更新语句,如果更新失败,false 是一个有效的结果。

因此,更好的方法是
<?php
$query
= "SELECT XXname FROM customer_table ";
$res = $mysqli->query($query);

if (!
$mysqli->error) {
printf("错误消息:%s\n", $mysqli->error);
}

?>

这将输出类似于以下内容的信息
意外的 PHP 错误 [mysqli::query() [<a href='function.query'>function.query</a>]: (42S22/1054): 表 'field list' 中不存在列 'XXname'] 严重性 [E_WARNING] 在 [G:\database.php] 第 [249] 行

非常令人沮丧,因为我还想捕获 sql 错误并打印出堆栈跟踪。

更好的方法是

<?php
mysqli_report
(MYSQLI_REPORT_OFF); //关闭令人讨厌的默认消息

$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 错误 $mysqli->error <br> 查询:<br> $query", $msqli->errno);
} catch(
Exception $e ) {
echo
"错误编号:".$e->getCode(). " - ". $e->getMessage() . "<br >";
echo
nl2br($e->getTraceAsString());
}
}

//对结果进行操作
?>
打印类似于以下内容的信息
错误编号:1054
表 'field list' 中不存在列 'XXname'
查询
SELECT XXname FROM customer_table

#0 G:\\database.php(251): database->dbError('表 'field list' 中不存在列 ...', 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))

这实际上将打印出错误、堆栈跟踪以及有问题的 sql 语句。当 sql 语句在代码中的其他位置生成时,这更有帮助。
9
se (at) brainbits (dot) net
18 年前
描述 "mysqli_error -- 返回最后一个错误的字符串描述" 并不完全是您从 mysqli_error 获取的内容。您获取的是最后一个 mysqli 函数的错误描述,而不是最后一个 mysql 错误的描述。

如果您遇到以下情况

if (!$mysqli->query("SET a=1")) {
$mysqli->query("ROLLBACK;");
printf("Errormessage: %s\n", $mysqli->error);
}

如果您 ROLLBACK 查询没有失败,则不会获得错误消息。为了获得正确的错误消息,您需要编写

if (!$mysqli->query("SET a=1")) {
printf("Errormessage: %s\n", $mysqli->error);
$mysqli->query("ROLLBACK;");
}
6
callforeach at gmail dot com
9 年前
我必须在我的脚本开头设置 mysqli_report(MYSQLI_REPORT_ALL),以便能够在 PHP 代码的 catch 块中捕获 mysqli 错误。

最初,我使用以下代码抛出和随后捕获 mysqli 异常

<?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();
}

我意识到异常是在实际 throw 语句之前抛出的,因此 catch 块没有被调用

我现在的代码如下所示
mysqli_report
(MYSQLI_REPORT_ALL) ;
try {
$mysqli = new mysqli('localhost','root','pwd','db');
/* 我不需要抛出异常,它会自动抛出 */

} catch (Exception $e) {
echo
$e->getMessage();
}

这工作正常,我'm 能够捕获所有 mysqli 错误
-2
asmith16 at littlesvr dot ca
10 年前
请注意,返回的字符串可能包含用户最初提供的数据,这可能会使您的代码容易受到 XSS 攻击。

因此,即使您使用 mysqli_real_escape_string() 对 SQL 查询中的所有内容进行了转义,也要确保如果您计划显示 mysqli_error() 返回的字符串,请将其通过 htmlspecialchars() 进行处理。

据我所知,这两个转义函数没有转义相同的字符,这就是为什么您需要同时使用它们(第一个用于 SQL,第二个用于 HTML/JS)。
-1
abderrahmanekaddour dot aissat at gmail dot com
1 年前
<?php

// 目的是为开发人员添加格式化的错误信息,以更轻松地检测错误。

$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." \"
} "
; // 更多信息
fwrite($myfile, $data_err); // 写入数据
}
// 在单独的文件中读取文件并对其进行格式化以获得良好的视觉效果。

$db->close();
fclose($myfile);
?>
-5
information at saunderswebsolutions dot com
18 年前
嗨,您还可以使用新的 mysqli_sql_exception 来捕获 sql 错误。
示例
<?php
// 在此处设置 $mysqli_instance..
$Select = "SELECT xyz FROM mytable ";
try {
$res = $mysqli_instance->query($Select);
}catch (
mysqli_sql_exception $e) {
print
"Error Code <br>".$e->getCode();
print
"Error Message <br>".$e->getMessage();
print
"Strack Trace <br>".nl2br($e->getTraceAsString());
}

?>
将打印出类似以下内容
错误代码:0
错误消息
查询/准备语句中未使用索引 select sess_value from frame_sessions where sess_name = '5b85upjqkitjsostvs6g9rkul1'
堆栈跟踪
#0 G:\classfiles\lib5\database.php(214): mysqli->query('select sess_val...')
#1 G:\classfiles\lib5\Session.php(52): database->getString('select sess_val...')
#2 [内部函数]: sess_read('5b85upjqkitjsos...')
#3 G:\classfiles\includes.php(50): session_start()
#4 G:\tests\all_tests.php(4): include('G:\data\WorkSit...')
#5 {main}
-9
Anonymous
4 年前
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
try {
$this->connection = mysqli_connect($hostname,$username,$password, $dbname);
} catch (Exception $e) {
echo "Errno: " . mysqli_connect_errno() . PHP_EOL;
echo "Text error: " . mysqli_connect_error() . PHP_EOL;
exit;
}
To Top