<?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,表示插入了一行。
原因:如果你執行的是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獲取詳細信息,或者根據需求調整邏輯。
<?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是針對最近一次執行的查詢,如果你批量執行多條語句,必須逐條處理結果,才能準確獲得每條語句的受影響行數。
$affected_rows只對寫操作(INSERT、UPDATE、DELETE)有效,SELECT 語句不會影響任何行數,返回-1。
如果想知道SELECT 查詢返回多少條結果,應該使用$result->num_rows 。
事務未提交:如果開啟了事務,且未提交, $affected_rows仍然反映實際影響行數,但數據未提交到數據庫。
觸發器影響:MySQL 觸發器執行過程中對行的修改不會改變PHP 中$affected_rows的值。
連接狀態:確保mysqli 連接正常,錯誤時$affected_rows可能返回-1。
使用$mysqli->error檢查是否有SQL 錯誤。
使用$mysqli->info查看最近執行語句的詳細信息。
開啟MySQL 日誌或者使用工具查看執行的SQL 是否和預期一致。
mysqli::$affected_rows是檢測寫操作影響行數的有效工具,但在以下情況下容易讓人困惑:
使用複雜SQL(如ON DUPLICATE KEY UPDATE )時,返回值規則需特別注意。
多條SQL 批量執行時,需逐條處理結果。
SELECT 語句不會影響行數,使用$result->num_rows替代。
事務、觸發器等也可能影響實際表現。
只要理解其工作原理和邊界條件, $affected_rows就能幫你準確判斷數據庫操作效果,提升代碼健壯性。