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";
}