PHP Conference Japan 2024

mysqli::$affected_rows

mysqli_affected_rows

(PHP 5, PHP 7, PHP 8)

mysqli::$affected_rows -- mysqli_affected_rows获取上一次MySQL操作中受影响的行数

描述

面向对象风格

过程式风格

mysqli_affected_rows(mysqli $mysql): int|string

返回最后一次INSERTUPDATEREPLACEDELETE查询受影响的行数。对于SELECT语句,其功能类似于mysqli_num_rows()

参数

mysql

仅过程式风格:由mysqli_connect()mysqli_init()返回的mysqli对象

返回值

大于零的整数表示受影响或检索到的行数。零表示对于UPDATE语句没有更新任何记录,或者没有行匹配查询中的WHERE子句,或者尚未执行任何查询。 -1表示查询返回错误,或者mysqli_affected_rows()被用于非缓冲的SELECT查询。

注意:

如果受影响的行数大于最大整数值 (PHP_INT_MAX),则受影响的行数将作为字符串返回。

示例

示例 #1 $mysqli->affected_rows 示例

面向对象风格

<?php

mysqli_report
(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

/* 插入行 */
$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);

/* 删除表 Language */
$mysqli->query("DROP TABLE Language");

过程式风格

<?php

mysqli_report
(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$link = mysqli_connect("localhost", "my_user", "my_password", "world");

/* 插入行 */
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");

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

/* 删除行 */
mysqli_query($link, "DELETE FROM Language WHERE Percentage < 50");
printf("受影响的行数 (DELETE): %d\n", mysqli_affected_rows($link));

/* 选择所有行 */
$result = mysqli_query($link, "SELECT CountryCode FROM Language");
printf("受影响的行数 (SELECT): %d\n", mysqli_affected_rows($link));

/* 删除表 Language */
mysqli_query($link, "DROP TABLE Language");

以上示例将输出

Affected rows (INSERT): 984
Affected rows (UPDATE): 168
Affected rows (DELETE): 815
Affected rows (SELECT): 169

另请参阅

添加笔记

用户贡献的笔记 3 条笔记

匿名用户
13 年前
关于“INSERT INTO ON DUPLICATE KEY UPDATE”查询,虽然人们可能期望 affected_rows 对于成功的查询每行仅返回 0 或 1,但实际上它可能返回 2。

来自 Mysql 手册:“使用 ON DUPLICATE KEY UPDATE 时,每行的 affected-rows 值为 1(如果该行作为新行插入)或 2(如果更新现有行)。"

参见:https://dev.mysqlserver.cn/doc/refman/5.0/en/insert-on-duplicate.html

以下是每行的汇总细分
+0:未更新或插入一行(可能是因为该行已存在,但在 UPDATE 期间没有实际更改任何字段值)
+1:插入了一行
+2:更新了一行
Jacques Amar
7 年前
使用预处理语句时,即使没有结果集(如在 UPDATE 或 DELETE 中),您仍然需要在 affected_rows 返回实际数字之前存储结果

<?php
$del_stmt
->execute();
$del_stmt->store_result();
$count = $del_stmt->affected_rows;
?>

否则事情会令人沮丧。。
Michael
10 年前
如果您需要具体了解 UPDATE 操作的 WHERE 条件是否未能匹配行,或者根本不需要更新任何行,则需要检查 mysqli::$info。

由于这会返回需要解析的字符串,因此您可以使用以下方法将结果转换为关联数组。

面向对象风格

<?php
preg_match_all
('/(\S[^:]+): (\d+)/', $mysqli->info, $matches);
$info = array_combine ($matches[1], $matches[2]);
?>

过程式风格

<?php
preg_match_all
('/(\S[^:]+): (\d+)/', mysqli_info ($link), $matches);
$info = array_combine ($matches[1], $matches[2]);
?>

然后,您可以使用该数组来测试不同的条件

<?php
if ($info ['Rows matched'] == 0) {
echo
"此操作没有匹配任何行。\n";
} elseif (
$info ['Changed'] == 0) {
echo
"此操作匹配了行,但没有需要更新的行。\n";
}

if (
$info ['Changed'] < $info ['Rows matched']) {
echo (
$info ['Rows matched'] - $info ['Changed'])." 行匹配但未更改。\n";
}
?>

此方法可用于 mysqli::$info 支持的任何查询(INSERT INTO、LOAD DATA、ALTER TABLE 和 UPDATE),对于任何其他查询,它都返回一个空数组。

对于任何 UPDATE 操作,返回的数组将包含以下元素

数组
(
[Rows matched] => 1
[Changed] => 0
[Warnings] => 0
)
To Top