當前位置: 首頁> 最新文章列表> 【mysqli::$affected_rows】在插入數據後的常見誤區

【mysqli::$affected_rows】在插入數據後的常見誤區

gitbox 2025-05-26

1. mysqli::$affected_rows 的基本用法

<?php
$mysqli = new mysqli("gitbox.net", "username", "password", "database");

$sql = "INSERT INTO users (username, email) VALUES ('testuser', '[email protected]')";
$mysqli->query($sql);

echo "受影響的行數:" . $mysqli->affected_rows;
?>

上述代碼中,插入了一條新數據, $affected_rows應該返回1,表示插入了一行。


2. 常見誤區及解決方案

誤區1:插入數據後返回0,明明插入成功了

  • 原因:如果你執行的是INSERT ... ON DUPLICATE KEY UPDATE語句,並且實際沒有更新任何數據,那麼$affected_rows可能返回2 或0,具體取決於MySQL 版本。

  • 說明

    • MySQL 5.1 及更早版本中, ON DUPLICATE KEY UPDATE影響的行數是1(插入)或2(更新)。

    • MySQL 5.7 以後,如果沒有實際更新數據,返回0。

  • 解決

    • 你可以檢查$mysqli->info獲取詳細信息,或者根據需求調整邏輯。

誤區2:執行多條SQL 時,受影響行數不准確

<?php
$sql = "INSERT INTO users (username) VALUES ('user1');";
$sql .= "INSERT INTO users (username) VALUES ('user2');";

$mysqli->multi_query($sql);
do {
    if ($result = $mysqli->store_result()) {
        $result->free();
    }
    echo "受影響的行數:" . $mysqli->affected_rows . "\n";
} while ($mysqli->more_results() && $mysqli->next_result());
?>
  • 說明$affected_rows是針對最近一次執行的查詢,如果你批量執行多條語句,必須逐條處理結果,才能準確獲得每條語句的受影響行數。

誤區3: $affected_rows對於SELECT 語句無效

  • $affected_rows只對寫操作(INSERT、UPDATE、DELETE)有效,SELECT 語句不會影響任何行數,返回-1。

  • 如果想知道SELECT 查詢返回多少條結果,應該使用$result->num_rows


3. 影響$affected_rows的其他因素

  • 事務未提交:如果開啟了事務,且未提交, $affected_rows仍然反映實際影響行數,但數據未提交到數據庫。

  • 觸發器影響:MySQL 觸發器執行過程中對行的修改不會改變PHP 中$affected_rows的值。

  • 連接狀態:確保mysqli 連接正常,錯誤時$affected_rows可能返回-1。


4. 推薦調試技巧

  • 使用$mysqli->error檢查是否有SQL 錯誤。

  • 使用$mysqli->info查看最近執行語句的詳細信息。

  • 開啟MySQL 日誌或者使用工具查看執行的SQL 是否和預期一致。


5. 總結

mysqli::$affected_rows是檢測寫操作影響行數的有效工具,但在以下情況下容易讓人困惑:

  • 使用複雜SQL(如ON DUPLICATE KEY UPDATE )時,返回值規則需特別注意。

  • 多條SQL 批量執行時,需逐條處理結果。

  • SELECT 語句不會影響行數,使用$result->num_rows替代。

  • 事務、觸發器等也可能影響實際表現。

只要理解其工作原理和邊界條件, $affected_rows就能幫你準確判斷數據庫操作效果,提升代碼健壯性。