在PHP中,使用mysqli擴展操作數據庫時, $mysqli->affected_rows是一個非常常用的屬性,它可以告訴你最近一次執行的SQL語句影響了多少行。然而,有時候我們會遇到$mysqli->affected_rows返回-1的情況,這到底是什麼意思呢?本文將帶你詳細解析幾種導致返回-1的常見情況,幫你更好地理解和排查代碼問題。
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 。
如果你的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
}
?>
$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不影響行數
?>
如果你使用了事務,執行了修改操作但未提交, $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通常會正確返回,但特殊情況下可能產生誤導。
當用預處理語句執行時,某些情況下$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確認是否有錯誤。
檢查SQL執行是否成功<br> 通過判斷返回值是否fals e ,並調用$mysqli->error獲取詳細錯誤信息
確認SQL語句類型
affected_rows只對修改操作有效,查詢語句永遠返回-1。
檢查事務狀態<br> 保證修改操作的事務已提交
對預處理語句做錯誤判斷<br> 檢查$stmt->execute()是否成功,及時處理錯誤
mysqli::$affected_rows返回-1 ,通常意味著最近一次SQL執行失敗或者執行的是不影響行數的語句。
使用時一定要結合錯誤信息和SQL語句類型進行判斷。
在寫代碼時,養成檢查$mysqli->error或者$stmt->error的習慣,可以幫助快速定位問題。
通過以上方法,你可以更加準確地理解和處理mysqli::$affected_rows返回-1的情況,提升代碼的健壯性和調試效率。
相關標籤:
mysqli