mysqli::$affected_rows
mysqli_affected_rows
(PHP 5, PHP 7, PHP 8)
mysqli::$affected_rows -- mysqli_affected_rows — 直前の MySQL の操作で変更された行の数を得る
説明
オブジェクト指向型
手続き型
直近の INSERT
、
UPDATE
、REPLACE
あるいは
DELETE
クエリにより変更された行の数を返します。
SELECT 文の場合は、 mysqli_num_rows() と同じように動作します。
戻り値
正の整数が返された場合、それは変更された行数かあるいは取得された行数を
示します。ゼロが返された場合、それは 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("Affected rows (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("Affected rows (UPDATE): %d\n", $mysqli->affected_rows);
/* 行を削除します */
$mysqli->query("DELETE FROM Language WHERE Percentage < 50");
printf("Affected rows (DELETE): %d\n", $mysqli->affected_rows);
/* 全件選択します。 */
$result = $mysqli->query("SELECT CountryCode FROM Language");
printf("Affected rows (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("Affected rows (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("Affected rows (UPDATE): %d\n", mysqli_affected_rows($link));
/* 行を削除します */
mysqli_query($link, "DELETE FROM Language WHERE Percentage < 50");
printf("Affected rows (DELETE): %d\n", mysqli_affected_rows($link));
/* 全件選択します。 */
$result = mysqli_query($link, "SELECT CountryCode FROM Language");
printf("Affected rows (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
+add a note
User Contributed Notes 3 notes
Anonymous ¶
13 years ago
On "INSERT INTO ON DUPLICATE KEY UPDATE" queries, though one may expect affected_rows to return only 0 or 1 per row on successful queries, it may in fact return 2.
From Mysql manual: "With ON DUPLICATE KEY UPDATE, the affected-rows value per row is 1 if the row is inserted as a new row and 2 if an existing row is updated."
See: http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html
Here's the sum breakdown _per row_:
+0: a row wasn't updated or inserted (likely because the row already existed, but no field values were actually changed during the UPDATE)
+1: a row was inserted
+2: a row was updated
Jacques Amar ¶
7 years ago
While using prepared statements, even if there is no result set (Like in an UPDATE or DELETE), you still need to store the results before affected_rows returns the actual number:
<?php
$del_stmt->execute();
$del_stmt->store_result();
$count = $del_stmt->affected_rows;
?>
Otherwise things will just be frustrating ..
Michael ¶
10 years ago
If you need to know specifically whether the WHERE condition of an UPDATE operation failed to match rows, or that simply no rows required updating you need to instead check mysqli::$info.
As this returns a string that requires parsing, you can use the following to convert the results into an associative array.
Object oriented style:
<?php
preg_match_all ('/(\S[^:]+): (\d+)/', $mysqli->info, $matches);
$info = array_combine ($matches[1], $matches[2]);
?>
Procedural style:
<?php
preg_match_all ('/(\S[^:]+): (\d+)/', mysqli_info ($link), $matches);
$info = array_combine ($matches[1], $matches[2]);
?>
You can then use the array to test for the different conditions
<?php
if ($info ['Rows matched'] == 0) {
echo "This operation did not match any rows.\n";
} elseif ($info ['Changed'] == 0) {
echo "This operation matched rows, but none required updating.\n";
}
if ($info ['Changed'] < $info ['Rows matched']) {
echo ($info ['Rows matched'] - $info ['Changed'])." rows matched but were not changed.\n";
}
?>
This approach can be used with any query that mysqli::$info supports (INSERT INTO, LOAD DATA, ALTER TABLE, and UPDATE), for other any queries it returns an empty array.
For any UPDATE operation the array returned will have the following elements:
Array
(
[Rows matched] => 1
[Changed] => 0
[Warnings] => 0
)