2024 年 PHP 大会日本站

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'

参见

添加注释

用户贡献的注释 5 条注释

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] in [G:\database.php] line [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
未知列 'XXname' 在 'field list' 中
查询
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))

这实际上会打印出错误信息、堆栈跟踪和有问题的SQL语句。当SQL语句在代码的其他地方生成时,这更有帮助。
se (at) brainbits (dot) net
18 年前
描述“mysqli_error -- 返回最后一个错误的字符串描述”并不完全是您从 mysqli_error 获得的结果。您获得的是来自最后一个 mysqli 函数的错误描述,而不是来自最后一个 mysql 错误的描述。

如果您遇到以下情况:

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

如果 ROLLBACK 查询也没有失败,您将不会收到错误信息。为了获得正确的错误信息,您必须编写:

if (!$mysqli->query("SET a=1")) {
printf("错误信息: %s\n", $mysqli->error);
$mysqli->query("ROLLBACK;");
}
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();
}

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

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

据我所知,这两个转义函数不会转义相同的字符,这就是为什么您需要两者(第一个用于 SQL,第二个用于 HTML/JS)的原因。
abderrahmanekaddour dot aissat at gmail dot com
2年前
<?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 语句错误 \",
\"date_time\": "
.$timestamp->getTimestamp().",
\"error\":\" "
.$db->error." \"
} "
; // 添加更多信息
fwrite($myfile, $data_err); // 写入数据
}
// 在单独的文件中读取文件并将其格式化以获得良好的视觉效果。

$db->close();
fclose($myfile);
?>
To Top