在使用PHP进行MySQL数据库操作时,开发者通常更关注查询结果本身,例如返回的行数或是否执行成功,而容易忽略一个有用的调试工具——mysqli::$info属性。这个属性在某些类型的SQL语句执行后,能够返回关于执行结果的更多统计信息,帮助我们更全面地了解一次查询的影响。
mysqli::$info 是 mysqli 类的一个只读属性,用来提供最后执行的 SQL 语句的一些统计信息,特别适用于 INSERT、UPDATE、LOAD DATA 等修改型语句。
该属性的返回值是一个字符串,内容格式不固定,但通常包含受影响的行数、重复的行数、被警告的行数等信息。例如:
$mysqli = new mysqli("localhost", "user", "password", "database");
$mysqli->query("UPDATE users SET status = 'active' WHERE last_login > NOW() - INTERVAL 30 DAY");
echo $mysqli->info;
可能输出如下信息:
Rows matched: 15 Changed: 15 Warnings: 0
这告诉我们,共有15条记录被匹配,15条记录被修改,没有发生任何警告。
mysqli::$info 返回的是一个格式化的字符串。以下是常见的返回关键字:
Records:被处理的记录数(多用于 LOAD DATA)
Duplicates:重复的记录数(常见于 INSERT ... ON DUPLICATE KEY UPDATE)
Warnings:执行过程中出现的警告数
Rows matched:匹配的行数(通常用于 UPDATE 或 DELETE)
Changed:真正被改变的行数(表示字段值实际变化)
例如:
$mysqli->query("INSERT INTO logs (event, created_at) VALUES ('login', NOW()), ('logout', NOW())");
echo $mysqli->info;
输出可能为:
Records: 2 Duplicates: 0 Warnings: 0
这表明插入了两条记录,没有重复,也没有警告。
通过结合 mysqli::$info 与日志记录系统,我们可以对数据库操作的影响进行细致分析。例如:
$mysqli->query("UPDATE products SET stock = stock - 1 WHERE id = 101");
$log = sprintf("Query info: %s", $mysqli->info);
file_put_contents("/var/log/db_ops.log", $log . PHP_EOL, FILE_APPEND);
这样,每次更新库存时都能记录受影响的行数,有助于后期调试和性能优化。
仅在支持的语句后有意义:如 SELECT 查询通常返回空字符串。
不能代替 error 处理机制:它不是错误报告工具,而是执行影响的补充信息。
多语句执行时只反映最后一条语句:如果使用多语句查询,仅能反映最后一条的执行情况。
语言版本差异:不同 MySQL 和 PHP 版本间,输出字符串的结构可能略有不同。
mysqli::$info 是一个简单却实用的调试工具,能够在执行非查询类 SQL 语句时提供详尽的统计信息。它对于调试、日志记录及查询优化提供了重要的参考数据。在高性能或对数据变化敏感的应用中,合理使用它能显著提升系统的可观察性。
更多关于该属性的官方文档可参考:https://gitbox.net/php/mysqli.info