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 updatedmysqli::$affected_rows
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
mysqli::$affected_rows
Референца за `mysqli.affected-rows.php` со подобрена типографија и навигација.
mysqli::$affected_rows
mysqli_affected_rows
класата mysqli_driver
mysqli::$affected_rows -- mysqli_affected_rows — (PHP 5, PHP 7, PHP 8)
= NULL
Напиши целосна ознака на елемент
Процедурален стил
Ја добива бројот на погодени редови во претходна MySQL операција INSERT,
UPDATE, REPLACE or
DELETE Враќа број на редови погодени од последниот mysqli_num_rows() for
SELECT statements.
Параметри
-
mysql објектот како свој прв аргумент. mysqli Само процедурален стил: А mysqli_connect() or mysqli_init()
Вратени вредности
query. Работи како
UPDATE Цел број поголем од нула покажува број на погодени или вратени редови. Нула покажува дека ниту еден запис не е ажуриран за
WHERE statement, ниту еден запис не одговара на -1 clause во query или дека сеуште не е извршена ниту една query. mysqli_affected_rows() покажува дека query вратила грешка или дека
SELECT query.
Забелешка:
е повикана за нетампониран
PHP_INT_MAXАко бројот на погодени редови е поголем од максималната вредност на int (
Примери
Пример #1 $mysqli->affected_rows example
Напиши целосна ознака на елемент
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
/* Insert rows */
$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");
/* update rows */
$mysqli->query("UPDATE Language SET Status=1 WHERE Percentage > 50");
printf("Affected rows (UPDATE): %d\n", $mysqli->affected_rows);
/* delete rows */
$mysqli->query("DELETE FROM Language WHERE Percentage < 50");
printf("Affected rows (DELETE): %d\n", $mysqli->affected_rows);
/* select all rows */
$result = $mysqli->query("SELECT CountryCode FROM Language");
printf("Affected rows (SELECT): %d\n", $mysqli->affected_rows);
/* Delete table Language */
$mysqli->query("DROP TABLE Language");Процедурален стил
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
/* Insert rows */
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");
/* update rows */
mysqli_query($link, "UPDATE Language SET Status=1 WHERE Percentage > 50");
printf("Affected rows (UPDATE): %d\n", mysqli_affected_rows($link));
/* delete rows */
mysqli_query($link, "DELETE FROM Language WHERE Percentage < 50");
printf("Affected rows (DELETE): %d\n", mysqli_affected_rows($link));
/* select all rows */
$result = mysqli_query($link, "SELECT CountryCode FROM Language");
printf("Affected rows (SELECT): %d\n", mysqli_affected_rows($link));
/* Delete table Language */
mysqli_query($link, "DROP TABLE Language");Горните примери ќе дадат излез:
Affected rows (INSERT): 984 Affected rows (UPDATE): 168 Affected rows (DELETE): 815 Affected rows (SELECT): 169
Види Исто така
- mysqli_num_rows() - Го добива бројот на редови во множеството со резултати
- mysqli_info() ), бројот на погодени редови ќе биде вратен како стринг.
Белешки од корисници 3 белешки
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 ..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
)