mysqli_stmt::$affected_rows

mysqli_stmt_affected_rows

(PHP 5, PHP 7, PHP 8)

mysqli_stmt::$affected_rows -- mysqli_stmt_affected_rows返回最后执行的语句更改、删除、插入或匹配的总行数

说明

面向对象风格

过程式风格

mysqli_stmt_affected_rows(mysqli_stmt $statement): int|string

返回受 INSERTUPDATEDELETE 查询影响的行数。对于 SELECT 语句,其工作原理类似于 mysqli_stmt_num_rows()

参数

statement

仅限过程式风格:由 mysqli_stmt_init() 返回的 mysqli_stmt 对象。

返回值

大于零的整数表示受影响或检索的行数。零表示 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

参见

添加注释

用户贡献的注释 2 个注释

Carl Olsen
18 年前
似乎包含与数据库中已存在数据相同数据的 UPDATE 准备语句会为 affected_rows 返回 0。我预期它会返回 1,但它一定是将输入值与现有值进行比较,并确定未发生任何 UPDATE。
Chuck
17 年前
我不确定这是否是预期行为,但我通过测试注意到,如果你要一起使用事务和准备语句,并且你使用准备语句向数据库添加了一条记录,但后来回滚了它,mysqli_stmt_affected_rows 仍将返回 1。
To Top