首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

深入解析 PHP mysqli_affected_rows 回傳值:影響行數 vs 匹配行數

     編輯:PHP 綜合知識

核心概念區分

mysqli_affected_rows 預設回傳「實際修改的行數」,但透過連線參數可切換為「匹配的行數」。兩者在 UPDATE 操作時差異最大:

  • 影響行數:資料真正被改變的列數(如將狀態從 0 改為 1)
  • 匹配行數:符合 WHERE 條件的列數(即使新值等於舊值也會被計入)

切換回傳模式

使用 mysqli_real_connect() 建立連線時,在 flags 參數加入 MYSQLI_CLIENT_FOUND_ROWS:

$link = mysqli_real_connect(
    $host, $user, $pass, $db,
    3306, NULL, MYSQLI_CLIENT_FOUND_ROWS
);

此後 mysqli_affected_rows($link) 將回傳匹配行數。

語法格式對照

風格語法
程序式int mysqli_affected_rows ( mysqli $link )
物件導向$mysqli->affected_rows

實戰範例:程序式風格

<?php
$link = mysqli_connect("localhost", "user", "pass", "world");
if (!$link) { die("連線失敗: " . mysqli_connect_error()); }

/* 建立測試表 */
mysqli_query($link, "CREATE TABLE Language SELECT * FROM CountryLanguage");
printf("INSERT 影響列數: %d\n", mysqli_affected_rows($link));

/* 新增狀態欄位 */
mysqli_query($link, "ALTER TABLE Language ADD Status INT DEFAULT 0");

/* 更新:Percentage > 50 的列 */
mysqli_query($link, "UPDATE Language SET Status=1 WHERE Percentage > 50");
printf("UPDATE 影響列數: %d\n", mysqli_affected_rows($link));

/* 刪除:Percentage < 50 的列 */
mysqli_query($link, "DELETE FROM Language WHERE Percentage < 50");
printf("DELETE 影響列數: %d\n", mysqli_affected_rows($link));

/* SELECT 不影響列數 */
$result = mysqli_query($link, "SELECT CountryCode FROM Language");
printf("SELECT 影響列數: %d\n", mysqli_affected_rows($link)); // 永遠為 -1

mysqli_free_result($result);
mysqli_query($link, "DROP TABLE Language");
mysqli_close($link);
?>

物件導向風格

<?php
$mysqli = new mysqli("localhost", "user", "pass", "world");
if (mysqli_connect_errno()) { die("連線失敗: " . mysqli_connect_error()); }

$mysqli->query("CREATE TABLE Language SELECT * FROM CountryLanguage");
printf("INSERT 影響列數: %d\n", $mysqli->affected_rows);

$mysqli->query("ALTER TABLE Language ADD Status INT DEFAULT 0");
$mysqli->query("UPDATE Language SET Status=1 WHERE Percentage > 50");
printf("UPDATE 影響列數: %d\n", $mysqli->affected_rows);

$mysqli->query("DELETE FROM Language WHERE Percentage < 50");
printf("DELETE 影響列數: %d\n", $mysqli->affected_rows);

$result = $mysqli->query("SELECT CountryCode FROM Language");
printf("SELECT 影響列數: %d\n", $mysqli->affected_rows);

$result->close();
$mysqli->query("DROP TABLE Language");
$mysqli->close();
?>

關鍵提醒

  • SELECT 查詢永遠回傳 -1,若需取得筆數請用 mysqli_num_rows()
  • INSERT ... VALUES 單筆寫入回傳 1,INSERT ... SELECT 回傳實際新增筆數
  • 啟用 MYSQLI_CLIENT_FOUND_ROWS 後,UPDATE 若新舊值相同仍計入匹配行數
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved