在使用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