mysql_affected_rows

(PHP 4, PHP 5)

mysql_affected_rowsZwraca liczbę wierszy przetworzonych w poprzedniej operacji MySQL

Ostrzeżenie

To rozszerzenie zostało uznane za przestarzałe w PHP 5.5.0 i usunięte w PHP 7.0.0. Zamiast niego należy stosować rozszerzenia MySQLi lub PDO_MySQL. Zobacz też przewodnik MySQL: wybieranie API i stosowne FAQ aby uzyskać więcej informacji. Alternatywy dla tej funkcji to między innymi:

Opis

mysql_affected_rows ([ resource $identyfikator_połączenia = NULL ] ) : int

Pobiera liczbę wierszy przetworzonych w ostatnim zapytaniu INSERT, UPDATE, REPLACE lub DELETE skojarzonym z identyfikator_połączenia.

Parametry

identyfikator_połączenia

Połączenie MySQL. Jeśli identyfikator połączenia nie zostanie podany, użyte zostanie ostatnie połączenie otwarte przez mysql_connect(). Jeśli połączenie takie nie zostanie znalezione, funkcja spróbuje nawiązać połączenie tak, jakby wywołana została funkcja mysql_connect() bez argumentów. Jeśli żadne połączenie nie zostanie znalezione lub nawiązane, wygenerowany zostanie błąd poziomu E_WARNING.

Zwracane wartości

Zwraca liczbę przetworzonych wierszy w przypadku sukcesu i -1 jeśli ostatnie zapytanie zawiedzie.

Jeżeli ostatnim zapytaniem było DELETE bez użycia klauzuli WHERE, wszystkie rekordy zostaną usunięte z tabeli, ale funkcja zwróci zero w wersjach MySQL starszych niż 4.1.2.

Podczas operacji UPDATE, MySQL nie aktualizuje kolumn w których nowa wartość jest identyczna z poprzednią. Możliwe jest zatem, że zwrócona przez mysql_affected_rows() liczba nie będzie odpowiadać liczbie wierszy pasujących do zapytania, ale tych, które zostały faktycznie zmienione.

Wyrażenie REPLACE najpierw skasuje rekord z tym samym kluczem głównym następnie wstawi nowy rekord. Ta funkcja zwraca liczbę skasowanych rekordów plus liczbę wstawionych rekordów.

W wypadku zapytania "INSERT ... ON DUPLICATE KEY UPDATE" funkcja zwróci 1 jeżeli dodano nowy wiersz lub 2, jeśli został zaktualizowany istniejący rekord.

Przykłady

Przykład #1 Przykład mysql_affected_rows()

<?php
$link 
mysql_connect('localhost''mysql_user''mysql_password');
if (!
$link) {
    die(
'Nie można się połączyć: ' mysql_error());
}
mysql_select_db('mydb');
  
/* to powinno zwrócić prawidłową liczbę usuniętych rekordów */
mysql_query('DELETE FROM mytable WHERE id < 10');
printf("Usuniętych rekordów: %d\n"mysql_affected_rows());

/* z klauzulą where, która nigdy nie jest prawdziwa, powinno zrwócic 0 */
mysql_query('DELETE FROM mytable WHERE 0');
printf("Usuniętych rekordów: %d\n"mysql_affected_rows());
?>

Powyższy przykład wyświetli coś podobnego do:

Usuniętych rekordów: 10
Usuniętych rekordów: 0

Przykład #2 Przykład mysql_affected_rows() używający transakcję

<?php
$link 
mysql_connect('localhost''mysql_user''mysql_password');
if (!
$link) {
    die(
'Nie można się połączyć: ' mysql_error());
}
mysql_select_db('mydb');
    
/* Uaktualnienie rekordów */
mysql_query("UPDATE mytable SET used=1 WHERE id < 10");
printf ("Zaktualizowanych rekordów: %d\n"mysql_affected_rows());
mysql_query("COMMIT");
?>

Powyższy przykład wyświetli coś podobnego do:

Zaktualizowanych rekordów: 10

Notatki

Informacja: Transakcje

Jeśli używasz transakcji musisz wywołać mysql_affected_rows() po Twoim zapytaniu INSERT, UPDATE lub DELETE, a nie po COMMIT.

Informacja: Instrukcja SELECT

Aby uzyskać liczbę wierszy zwróconych przez SELECT, można użyć use mysql_num_rows().

Informacja: Kaskadowe klucze obce

mysql_affected_rows() nie zwraca liczby wierszy przetworzonych pośrednio przez użycie klauzuli ON DELETE CASCADE i/lub ON UPDATE CASCADE w ograniczeniach kluczy obcych.

Zobacz też:

add a note add a note

User Contributed Notes 10 notes

up
1
vitospericolato at gmail dot com
3 years ago
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();
up
2
ahmd
4 years ago
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.
up
2
Ome Ko
9 years ago
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];
}
?>
up
2
HMax
13 years ago
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.
up
2
temp02 at flexis dot com dot br
15 years ago
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.
up
1
dobrys at abv dot bg
13 years ago
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
up
1
deponti A_T tiscalinet D0T it
16 years ago
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)
up
-3
brian at smitherconsulting dot com
3 years ago
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.
up
-8
steffen at showsource dot dk
16 years ago
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
up
-9
sean at adtools dot co dot uk
12 years ago
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.
To Top