mysqli::$affected_rows

mysqli_affected_rows

(PHP 5, PHP 7)

mysqli::$affected_rows -- mysqli_affected_rowsПолучает число строк, затронутых предыдущей операцией MySQL

Описание

Объектно-ориентированный стиль

Процедурный стиль

int mysqli_affected_rows ( mysqli $link )

Возвращает число строк, затронутых последним INSERT, UPDATE, REPLACE или DELETE запросом.

Для запросов вида SELECT mysqli_affected_rows() работает как mysqli_num_rows().

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

link

Только для процедурного стиля: Идентификатор соединения, полученный с помощью mysqli_connect() или mysqli_init()

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

Целое число, большее нуля, означает количество затронутых или полученных строк. Ноль означает, что запросом вида UPDATE не обновлено ни одной записи, или что ни одна строка не соответствует условию WHERE в запросе, или что запрос еще не был выполнен. Значение -1 указывает на то, что запрос вернул ошибку.

Замечание:

Если число затронутых строк больше чем максимальное значение int ( PHP_INT_MAX ), то число затронутых строк будет возвращено в строковом виде (string).

Примеры

Пример #1 Пример $mysqli->affected_rows

Объектно-ориентированный стиль

<?php
$mysqli 
= new mysqli("localhost""my_user""my_password""world");

/* Проверка соединения */
if (mysqli_connect_errno()) {
    
printf("Подключение не удалось: %s\n"mysqli_connect_error());
    exit();
}

/* Добавление строк (Insert) */
$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");

/* Обновление строк (Update) */
$mysqli->query("UPDATE Language SET Status=1 WHERE Percentage > 50");
printf("Затронутые строки (UPDATE): %d\n"$mysqli->affected_rows);

/* Удаление строк (Delete) */
$mysqli->query("DELETE FROM Language WHERE Percentage < 50");
printf("Затронутые строки (DELETE): %d\n"$mysqli->affected_rows);

/* Выбор всех строк (Select) */
$result $mysqli->query("SELECT CountryCode FROM Language");
printf("Затронутые строки (SELECT): %d\n"$mysqli->affected_rows);

$result->close();

/* Удаление таблицы Language */
$mysqli->query("DROP TABLE Language");

/* Закрытие соединения */
$mysqli->close();
?>

Процедурный стиль

<?php
$link 
mysqli_connect("localhost""my_user""my_password""world");

if (!
$link) {
    
printf("Не могу подключиться к localhost. Ошибка: %s\n"mysqli_connect_error());
    exit();
}

/* Добавление строк (Insert) */
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");

/* Обновление строк (Update) */
mysqli_query($link"UPDATE Language SET Status=1 WHERE Percentage > 50");
printf("Затронутые строки (UPDATE): %d\n"mysqli_affected_rows($link));

/* Удаление строк (Delete) */
mysqli_query($link"DELETE FROM Language WHERE Percentage < 50");
printf("Затронутые строки (DELETE): %d\n"mysqli_affected_rows($link));

/* Выбор всех строк (Select) */
$result mysqli_query($link"SELECT CountryCode FROM Language");
printf("Затронутые строки (SELECT): %d\n"mysqli_affected_rows($link));

mysqli_free_result($result);

/* Удаление таблицы Language */
mysqli_query($link"DROP TABLE Language");

/* Закрытие соединения */
mysqli_close($link);
?>

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

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

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

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

Коментарии

Автор:
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
2011-02-18 16:50:25
http://php5.kiev.ua/manual/ru/mysqli.affected-rows.html
Автор:
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
)
2014-11-15 20:35:50
http://php5.kiev.ua/manual/ru/mysqli.affected-rows.html
Автор:
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 ..
2017-04-10 19:07:54
http://php5.kiev.ua/manual/ru/mysqli.affected-rows.html
Автор:
Under the hood, this calls into mysql_affected_rows (1). The MariaDB function ROW_COUNT() mentions (2) that it is the equivalent of that C API function. These two lines, SQL followed by PHP, should be equivalent:

SELECT ROW_COUNT();
$db->affected_rows;

I found this useful to double check things in an SQL prompt, to make sure affected_rows is reflecting what I expect (changed rows as opposed to matched rows in an update statement), which indeed it did.

1. https://github.com/php/php-src/blob/1521cafee29e23ca147ec777f3770a7ac46c6880/ext/mysqli/mysqli_api.c#L36-L49
2. https://mariadb.com/kb/en/row_count/
2023-02-07 17:02:08
http://php5.kiev.ua/manual/ru/mysqli.affected-rows.html
Do note that if you have turned off autocommit, and plan to do multiple actions before the commit, $affected_rows only works per statement. This means if, for example, you want to run multiple INSERT statements and tally all rows inserted after they are commited, a running counter will need to be implemented.

// start the count
$count = 0;

// turn off autocommit
$mysqli->autocommit(FALSE);
$mysqli->begin_transaction;

// insert a couple items
$query = "
    INSERT INTO users ('id','username','email') 
    VALUES (1, 'userguy', 'userguy@mail.com'), (2, 'some_user', 'some_user@ymail.com')
";
$mysqli->query($query);
echo $mysqli->affected_rows;  // 2 - correct
$count += $mysqli->affected_rows;  // add to the count

// insert one more
$query = "
    INSERT INTO users ('id','username','email') 
    VALUES (3, 'anotherone', 'anotherone@mail.com')
";
$mysqli->query($query);
$count += $mysqli->affected_rows;

// insert one more
$query = "
    INSERT INTO users ('id','username','email') 
    VALUES (4, 'thefourth', 'thefourth@gmail.com')
";
$mysqli->query($query);
$count += $mysqli->affected_rows;

// commit these statements to the database
$mysqli->commit();

echo $mysqli->affected_rows;  // 1 - only counts the last statement run
echo "Actual count: ".$count;  // 4
2024-07-27 04:11:32
http://php5.kiev.ua/manual/ru/mysqli.affected-rows.html

    Поддержать сайт на родительском проекте КГБ