mysql_affected_rows

(PHP 4, PHP 5)

mysql_affected_rowsВозвращает число затронутых прошлой операцией рядов

Описание

int mysql_affected_rows ([ resource $link_identifier = NULL ] )

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

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

link_identifier

Соединение MySQL. Если идентификатор соединения не был указан, используется последнее соединение, открытое mysql_connect(). Если такое соединение не было найдено, функция попытается создать таковое, как если бы mysql_connect() была вызвана без параметров. Если соединение не было найдено и не смогло быть создано, генерируется ошибка уровня E_WARNING.

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

Возвращает количество измененных записей в случае успеха, и -1 в случае если последний запрос не удался.

Если последний запрос был DELETE без указания WHERE и, соответственно, таблица была очищена, функция вернёт ноль во всех версиях MySQL до 4.1.2.

При использовании UPDATE, MySQL не обновит колонки, уже содержащие новое значение. Вследствие этого, функция mysql_affected_rows() не всегда возвращает количество рядов, подошедших под условия, только количество рядов, обновлённых запросом.

Запрос REPLACE сначала удаляет запись с указанным первичным ключом, а потом вставляет новую. Данная функция возвращает количество удаленных записей вместе с количеством вставленных.

В случае использования запросов типа "INSERT ... ON DUPLICATE KEY UPDATE", возвращаемое значение будет равно 1 в случае, если была произведена вставка, или 2 при обновлении существующего ряда.

Примеры

Пример #1 Пример использования mysql_affected_rows()

<?php
$link 
mysql_connect('localhost''mysql_user''mysql_password');
if (!
$link) {
    die(
'Ошибка соединения: ' mysql_error());
}
mysql_select_db('mydb');

/* здесь функция вернёт корректное число удалённых записей */
mysql_query('DELETE FROM mytable WHERE id < 10');
printf("Удалено записей: %d\n"mysql_affected_rows());

/* если WHERE всегда возвращает false, то функция возвращает 0 */
mysql_query('DELETE FROM mytable WHERE 0');
printf("Удалено записей: %d\n"mysql_affected_rows());
?>

Результатом выполнения данного примера будет что-то подобное:

Удалено записей: 10
Удалено записей: 0

Пример #2 Пример использования mysql_affected_rows() с транзакциями

<?php
$link 
mysql_connect('localhost''mysql_user''mysql_password');
if (!
$link) {
    die(
'Ошибка соединения: ' mysql_error());
}
mysql_select_db('mydb');

/* Обновляем ряды */
mysql_query("UPDATE mytable SET used=1 WHERE id < 10");
printf ("Обновлено записей: %d\n"mysql_affected_rows());
mysql_query("COMMIT");
?>

Результатом выполнения данного примера будет что-то подобное:

Обновлено записей: 10

Примечания

Замечание: Транзакции

При использовании транзакций mysql_affected_rows() нужно вызывать после запросов INSERT, UPDATE, DELETE, но не после COMMIT.

Замечание: Запросы SELECT

Чтобы получить количество рядов, возвращённых SELECT-запросом, используйте функцию mysql_num_rows().

Замечание: Каскадные внешние ключи

mysql_affected_rows() не подсчитывает ряды, неявно измененные ограничениями ON DELETE CASCADE и/или ON UPDATE CASCADE.

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

  • mysql_num_rows() - Возвращает количество рядов результата запроса
  • mysql_info() - Возвращает информацию о последнем запросе

Коментарии

It works also for REPLACE query,returning:
0 if the record it's already updated (0 record modified),
1 if the record it's new (1 record inserted),
2 if the record it's updated (2 operations: 1 deletion+ 1 insertion)
2003-11-07 06:52:51
http://php5.kiev.ua/manual/ru/function.mysql-affected-rows.html
Using OPTIMIZE TABLE will also return true.
So, if you want to check the numbers of deleted records, use mysql_affected_rows() before OPTIMIZE TABLE
2004-09-28 06:20:27
http://php5.kiev.ua/manual/ru/function.mysql-affected-rows.html
SCENARIO
1. You're using MySQL 4.1x with foreign keys.
2. You have table t2 linked to table t1 by a CASCADE ON DELETE foreign key.
3. t2 has a UNIQUE key so that duplicate records are unacceptable.
3. You have a REPLACE query on t1 followed by an INSERT query on t2 and expect the second query to fail if there's an attempted insert of a duplicate record.

PROBLEM
You notice that the second query is not failing as you had expected even though the record being inserted is an exact duplicate of a record previously inserted.

CAUSE
When the first query (the REPLACE query) deletes a record from t1 in the first stage of the REPLACE operation, it cascades the delete to the record that would be duplicated in t2. The second query then does not fail because the "duplicate" record is no longer a duplicate, as the original one has just been deleted.
2005-06-29 08:39:43
http://php5.kiev.ua/manual/ru/function.mysql-affected-rows.html
I see that when try to use mysql_affected_rows() with "mysql_pconnect(...)" without link indetifier as param in "mysql_affected_rows()" the result is allways -1.
When use link identifier "mysql_affected_rows($this_sql_connection)" - everything is Fine. This is is on PHP Version 5.2.0
Hope that this was helpfull for somebody
2007-05-28 17:35:52
http://php5.kiev.ua/manual/ru/function.mysql-affected-rows.html
Автор:
If you use "INSERT INTO ... ON DUPLICATE KEY UPDATE" syntax, mysql_affected_rows() will return you 2 if the UPDATE was made (just as it does with the "REPLACE INTO" syntax) and 1 if the INSERT was.

So if you use one SQL request to insert several rows at a time, and some are inserted, some are just updated, you won't get the real count.
2007-07-02 06:21:04
http://php5.kiev.ua/manual/ru/function.mysql-affected-rows.html
Here's a little function I've been using for a while now, pass it two parameters (action command (1 or 0 see notes)) and a sql statement.

It returns a simple line which shows the length of time taken to action the query, the status of the query (0= query not actioned, you can set this value for testing, 1=success qry executed successfully, -1= failed, there was a problem with the sql statement) the number of lines affected by that query and the sql statement itself. 

I've found this invaluable when trying to tie down large amounts of updates to a table, using this you can easily see where a query was successfully executed and the number of rows are affected, or where there are problems and a statement has failed for example.

<?php
function dosql($action,$sql){
 
# assuming you have setup a link to your database entitled $link
  # action = 1 run this query
  # action = 0 don't run, just return sql statement
 
 
$start getmtime();
 
  if(
$action==1){
   
$result mysql_query($sql);
   
$affectedrows "[".mysql_affected_rows($link)."]";
  } 
  return 
"[".number_format((getmtime()-$start),3)."][$action]: $sql\n";
 
mysql_free_result($result);
}
?>

Example output:
[0.072][1][80]: UPDATE MYTABLE SET FIELD = 1;
[0.106][1][758]: UPDATE ANOTHERTABLE SET FIELD = 2;
[0.006][-1][0]: UPDATER ANOTHERTABLE SET FIELD = 2;

The output shows:

[Timetaken][result]][lines affected]

The result will be either -1, 0 or 1, -1 means there's a problem with the sql statement, 1 means it executed correctly, 0 means it wasn't executed.
2008-09-09 04:48:32
http://php5.kiev.ua/manual/ru/function.mysql-affected-rows.html
Автор:
There are no rows affected by an update with identical data.
So here is one very ugly solution for these cases:
<?
function mysql_matched_rows() {
   
$_kaBoom=explode(' ',mysql_info());
   return 
$_kaBoom[2];
}
?>
2011-06-28 16:10:05
http://php5.kiev.ua/manual/ru/function.mysql-affected-rows.html
Автор:
I was just testing  "INSERT INTO ... ON DUPLICATE KEY UPDATE" syntax, on PHP 5.3.29 and mysql_affected_rows() was returning either 2 for updated row, 1 for inserted new row, and also 0, which was not documented, evidently when nothing was inserted. I was inserting a single row.
2016-05-12 09:39:51
http://php5.kiev.ua/manual/ru/function.mysql-affected-rows.html
In the case of INSERT where a row/slot had been previously deleted, making an uncollapsed hole in the table, and the record being inserted fills that empty row/slot, that is to say, the inserted data did not create a new row/slot/space, then this may explain why a zero result is returned by this function.
2016-11-21 02:31:21
http://php5.kiev.ua/manual/ru/function.mysql-affected-rows.html
calling mysql_affected_rows(null)
is not the same that calling mysql_affected_rows()

So, if you have a $link variable that could be null, you must write

if($link) 
  $n=mysql_affected_rows($link);
else 
  $n=mysql_affected_rows();
2017-01-19 13:44:51
http://php5.kiev.ua/manual/ru/function.mysql-affected-rows.html
Note that when the CLIENT_FOUND_ROWS connection flag was used, affected_rows returns the number of rows matched by the WHERE condition of an UPDATE query, even if the query doesn't actually change those rows. I.e. for

     INSERT INTO t(id, val) VALUES (1, 'x');
     UPDATE t SET val = 'x' WHERE id = 1;

the number of affected rows will be 0 normally but 1 with CLIENT_FOUND_ROWS.
2019-08-16 14:30:08
http://php5.kiev.ua/manual/ru/function.mysql-affected-rows.html

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