PHP 8.4.2 Released!

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

Возвращает число строк, затронутых последним запросом INSERT, UPDATE, REPLACE или DELETE. Работает аналогично mysqli_num_rows() для выражений SELECT.

Список параметров

mysql

Только для процедурного стиля: объект mysqli, который вернула функция mysqli_connect() или функция mysqli_init().

Возвращаемые значения

Целое число, большее нуля, означает количество затронутых или полученных строк. Ноль означает, что записи для оператора 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");
?>

Результат выполнения приведённых примеров:

Затронутые строки (INSERT): 984
Затронутые строки (UPDATE): 168
Затронутые строки (DELETE): 815
Затронутые строки (SELECT): 169

Смотрите также

  • mysqli_num_rows() - Получает количество строк в наборе результатов
  • mysqli_info() - Извлекает информацию о последнем выполненном запросе

Добавить

Примечания пользователей 3 notes

up
48
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
up
10
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 ..
up
16
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
)
To Top