當前位置: 首頁> 最新文章列表> 避免在PHP 中使用mysqli::$info 時產生錯誤的常見問題

避免在PHP 中使用mysqli::$info 時產生錯誤的常見問題

gitbox 2025-05-28

什麼是mysqli::$info?

mysqli::$info是一個只讀屬性,用於返回最近執行的查詢所產生的詳細信息,通常用於UPDATEDELETEINSERT ... 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;

該屬性只在特定類型的查詢後有效,且只有在查詢成功執行後才會返回有意義的信息。


常見問題及解決方案

1. 訪問mysqli::$info時返回NULL 或空字符串

這是最常見的問題。 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;
}

2. 在查詢失敗後訪問mysqli::$info導致錯誤

如果查詢執行失敗, mysqli::$info仍然存在,但其內容不可信。如果不判斷查詢結果直接訪問,可能會得到無意義或錯誤的信息。

解決方案:

始終先判斷查詢是否成功,再訪問mysqli::$info

 if ($mysqli->query($sql) === false) {
    echo "錯誤: " . $mysqli->error;
} else {
    echo "資訊: " . $mysqli->info;
}

3. 錯誤的編碼或字符集導致mysqli::$info內容異常

如果數據庫連接的字符集設置不正確, mysqli::$info可能會返回亂碼或不完整信息。

解決方案:

確保在連接數據庫後,立即設置正確的字符集,例如:

 $mysqli->set_charset('utf8mb4');

這樣可以保證mysqli::$info返回的字符串正確顯示。


4. 頻繁訪問mysqli::$info可能返回舊數據

mysqli::$info是針對最後一次成功查詢的結果。如果中間執行了其他查詢,訪問該屬性可能返回之前查詢的結果,造成誤解。

解決方案:

確保每次訪問mysqli::$info之前,沒有插入其他無關查詢,或者只在緊接相關查詢後訪問。


額外建議

  • 使用異常處理:結合mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT)使用,能夠更早捕獲查詢錯誤,避免錯誤信息混淆。

  • 查詢返回值判斷:不單靠mysqli::$info判斷查詢結果,最好結合affected_rowserror來綜合判斷。

  • 文檔參考:詳細了解官方文檔對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";
}