似乎包含与数据库中已存在数据相同数据的 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。