mysqli::$info 是一个只读属性,用于返回最近执行的查询所产生的详细信息,通常用于 UPDATE、DELETE 或 INSERT ... ON DUPLICATE KEY UPDATE 语句后,提供受影响的行数、警告数等信息。
$mysqli = new mysqli('gitbox.net', 'user', 'password', 'database');
$mysqli->query("UPDATE users SET status = 'active' WHERE last_login > NOW() - INTERVAL 30 DAY");
echo $mysqli->info;
该属性只在特定类型的查询后有效,且只有在查询成功执行后才会返回有意义的信息。
这是最常见的问题。mysqli::$info 只有在某些特定查询后才会被设置,比如 UPDATE 语句。如果查询没有产生任何额外信息,$mysqli->info 就会返回 NULL 或空字符串。
解决方案:
在使用之前,检查查询类型,确认其适用性。同时建议结合 $mysqli->affected_rows 一起使用,以保证你获取了正确的反馈。
$result = $mysqli->query("UPDATE users SET status = 'active' WHERE last_login > NOW() - INTERVAL 30 DAY");
if ($result) {
echo "受影响的行数: " . $mysqli->affected_rows . "\n";
echo "额外信息: " . ($mysqli->info ?? '无信息') . "\n";
} else {
echo "查询失败: " . $mysqli->error;
}
如果查询执行失败,mysqli::$info 仍然存在,但其内容不可信。如果不判断查询结果直接访问,可能会得到无意义或错误的信息。
解决方案:
始终先判断查询是否成功,再访问 mysqli::$info。
if ($mysqli->query($sql) === false) {
echo "错误: " . $mysqli->error;
} else {
echo "信息: " . $mysqli->info;
}
如果数据库连接的字符集设置不正确,mysqli::$info 可能会返回乱码或不完整信息。
解决方案:
确保在连接数据库后,立即设置正确的字符集,例如:
$mysqli->set_charset('utf8mb4');
这样可以保证 mysqli::$info 返回的字符串正确显示。
mysqli::$info 是针对最后一次成功查询的结果。如果中间执行了其他查询,访问该属性可能返回之前查询的结果,造成误解。
解决方案:
确保每次访问 mysqli::$info 之前,没有插入其他无关查询,或者只在紧接相关查询后访问。
使用异常处理:结合 mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT) 使用,能够更早捕获查询错误,避免错误信息混淆。
查询返回值判断:不单靠 mysqli::$info 判断查询结果,最好结合 affected_rows 和 error 来综合判断。
文档参考:详细了解官方文档对 mysqli::$info 的说明,了解它适用的场景和限制。
总结来说,mysqli::$info 是一个实用但易被误用的属性。正确判断查询结果,结合其他 mysqli 属性一起使用,能有效避免使用过程中的错误。
$mysqli = new mysqli('gitbox.net', 'user', 'password', 'database');
$mysqli->set_charset('utf8mb4');
$sql = "UPDATE users SET status = 'active' WHERE last_login > NOW() - INTERVAL 30 DAY";
if ($mysqli->query($sql) === false) {
echo "查询错误: " . $mysqli->error;
} else {
echo "受影响行数: " . $mysqli->affected_rows . "\n";
echo "额外信息: " . ($mysqli->info ?? '无信息') . "\n";
}