看起來,如果 UPDATE 預備語句包含與資料庫中已存在的相同資料,則 affected_rows 會傳回 0。我原先預期它會傳回 1,但它一定是將輸入值與現有值進行比較,並確定沒有發生 UPDATE。
(PHP 5, PHP 7, PHP 8)
mysqli_stmt::$affected_rows -- mysqli_stmt_affected_rows — 傳回最後執行的語句所變更、刪除、插入或比對的總列數
大於零的整數表示受影響或擷取的列數。零表示 UPDATE
語句沒有更新任何記錄,查詢中沒有任何列符合 WHERE
子句,或者尚未執行任何查詢。-1
表示查詢傳回錯誤,或者對於 SELECT
查詢,在呼叫 mysqli_stmt_store_result() 之前呼叫了 mysqli_stmt_affected_rows()。
注意:
如果受影響的列數大於 PHP int 的最大值,則受影響的列數將以字串值傳回。
範例 #1 mysqli_stmt_affected_rows() 範例
物件導向樣式
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
/* 建立暫存表格 */
$mysqli->query("CREATE TEMPORARY TABLE myCountry LIKE Country");
$query = "INSERT INTO myCountry SELECT * FROM Country WHERE Code LIKE ?";
/* 準備語句 */
$stmt = $mysqli->prepare($query);
/* 為佔位符綁定變數 */
$code = 'A%';
$stmt->bind_param("s", $code);
/* 執行語句 */
$stmt->execute();
printf("插入的列數:%d\n", $stmt->affected_rows);
程序樣式
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
/* 建立暫存表格 */
mysqli_query($link, "CREATE TEMPORARY TABLE myCountry LIKE Country");
$query = "INSERT INTO myCountry SELECT * FROM Country WHERE Code LIKE ?";
/* 準備語句 */
$stmt = mysqli_prepare($link, $query);
/* 為佔位符綁定變數 */
$code = 'A%';
mysqli_stmt_bind_param($stmt, "s", $code);
/* 執行語句 */
mysqli_stmt_execute($stmt);
printf("插入的列數:%d\n", mysqli_stmt_affected_rows($stmt));
以上範例將輸出
Rows inserted: 17
看起來,如果 UPDATE 預備語句包含與資料庫中已存在的相同資料,則 affected_rows 會傳回 0。我原先預期它會傳回 1,但它一定是將輸入值與現有值進行比較,並確定沒有發生 UPDATE。