當前位置: 首頁> 最新文章列表> 【mysqli::$affected_rows】函數返回-1是什麼意思?你必須知道的幾種情況

【mysqli::$affected_rows】函數返回-1是什麼意思?你必須知道的幾種情況

gitbox 2025-06-09

在PHP中,使用mysqli擴展操作數據庫時, $mysqli->affected_rows是一個非常常用的屬性,它可以告訴你最近一次執行的SQL語句影響了多少行。然而,有時候我們會遇到$mysqli->affected_rows返回-1的情況,這到底是什麼意思呢?本文將帶你詳細解析幾種導致返回-1的常見情況,幫你更好地理解和排查代碼問題。


什麼是mysqli::$affected_rows

mysqli::$affected_rows返回的是上一次執行的INSERT、UPDATE、DELETE語句受影響的行數。例如:

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

$mysqli->query("UPDATE users SET active = 1 WHERE id = 10");
echo $mysqli->affected_rows; // 輸出受影響的行數
?>

如果這條更新語句成功執行, $affected_rows會返回一個非負整數,表示實際修改的行數。但當出現錯誤或者某些特殊情況時,返回值可能是-1


mysqli::$affected_rows返回-1的幾種情況

1. SQL語句執行失敗

如果你的SQL語句執行失敗,比如語法錯誤、表不存在等, $affected_rows會返回-1 。此時你應該通過檢查錯誤信息來判斷:

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

$result = $mysqli->query("UPDATE non_existing_table SET active=1");

if ($result === false) {
    echo "查詢失敗,錯誤訊息:" . $mysqli->error;
    echo "受影響行數:" . $mysqli->affected_rows; // 這裡會輸出 -1
}
?>

2. 執行的是不影響行數的查詢

$affected_rows只對修改類操作(INSERT、UPDATE、DELETE)有意義。如果你執行的是SELECT、SHOW或者其他不改變數據的查詢, $affected_rows會返回-1

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

$mysqli->query("SELECT * FROM users");
echo $mysqli->affected_rows; // 輸出 -1,因為SELECT不影響行數
?>

3. 事務未提交或自動提交關閉

如果你使用了事務,執行了修改操作但未提交, $affected_rows可能會返回異常值。確保事務已正確提交。

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

$mysqli->autocommit(false);
$mysqli->query("UPDATE users SET active=1 WHERE id=5");

echo $mysqli->affected_rows; // 仍可能顯示正確
$mysqli->commit();
?>

未提交的事務可能導致實際未生效,儘管affected_rows通常會正確返回,但特殊情況下可能產生誤導。

4. 預處理語句使用不當

當用預處理語句執行時,某些情況下$stmt->affected_rows可能為-1 ,例如執行了不支持返回影響行數的語句,或者查詢失敗。

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

$stmt = $mysqli->prepare("UPDATE users SET active=1 WHERE id=?");
$id = 10;
$stmt->bind_param("i", $id);
$stmt->execute();

echo $stmt->affected_rows; // 可能為-1,表示執行異常
?>

務必檢查$stmt->error確認是否有錯誤。


如何正確處理返回-1的情況?

  1. 檢查SQL執行是否成功<br> 通過判斷返回值是否fals e ,並調用$mysqli->error獲取詳細錯誤信息

  2. 確認SQL語句類型
    affected_rows只對修改操作有效,查詢語句永遠返回-1。

  3. 檢查事務狀態<br> 保證修改操作的事務已提交

  4. 對預處理語句做錯誤判斷<br> 檢查$stmt->execute()是否成功,及時處理錯誤


小結

  • mysqli::$affected_rows返回-1 ,通常意味著最近一次SQL執行失敗或者執行的是不影響行數的語句。

  • 使用時一定要結合錯誤信息和SQL語句類型進行判斷。

  • 在寫代碼時,養成檢查$mysqli->error或者$stmt->error的習慣,可以幫助快速定位問題。

通過以上方法,你可以更加準確地理解和處理mysqli::$affected_rows返回-1的情況,提升代碼的健壯性和調試效率。