PHP 7.1.0 Release Candidate 4 Released


(PHP 4, PHP 5)

mysql_affected_rowsObtém o número de linhas atingidas na operação anterior do MySQL


int mysql_affected_rows ([ resource $link_identifier ] )

Obtém o número de linhas atingidas pela consulta INSERT, UPDATE, REPLACE ou DELETE mais recente associada ao link_identifier.



A conexão MySQL. Se o link identifier não for especificado, o último link aberto por mysql_connect() é utilizado. Se uma conexão anterior não existir será tentado criar um a partir de uma chadama a mysql_connect() sem nenhum argumento. Se nenhuma conexão for encontrada ou estabelecida, um erro nível E_WARNING é gerado.

Valor Retornado

Retona o número de linas atingidas em caso de sucesso, e -1 se a ultima consulta falhou.

Se a ultima consulta foi um consulta DELETE sem a claúsula WHERE, todos os registros terão sido excluídos da tabela mas esta função irá retornar zero com versões do MySQL anteriores a 4.1.2.

Ao usar UPDATE, o MySQL não irá atualizar colunas aonde o novo valor é o mesmo que o valor anterior. Isto cria a possibilidade de que mysql_affected_rows() possa não ser igual ao número de linhas encontradas, apenas o número de linhas que literalmente foram afetadas pela consulta.

O comando REPLACE primeiro exclui o registro com a mesma chave primaria e então insere o novo registro. Esta função retorna o número de registros excluídos mais o número de registros inseridos.


Exemplo #1 Exemplo mysql_affected_rows()

if (!
$link) {
'Não foi possível conectar: ' mysql_error());

/* isto deve retornar o número correto de registros excluídos */
mysql_query('DELETE FROM mytable WHERE id < 10');
printf("Registros excluídos: %d\n"mysql_affected_rows());

/* com uma clausula where que jamais é verdadeira, deve retornar 0 */
mysql_query('DELETE FROM mytable WHERE 0');
printf("Registros Excluídos: %d\n"mysql_affected_rows());

O exemplo acima irá imprimir algo similar à:

Records deleted: 10
Records deleted: 0

Exemplo #2 Exemplo de mysql_affected_rows() usando transações

if (!
$link) {
'Não foi possível conectar: ' mysql_error());

/* Atualiza os registros */
mysql_query("UPDATE mytable SET used=1 WHERE id < 10");
printf ("Registros atualizados: %d\n"mysql_affected_rows());

O exemplo acima irá imprimir algo similar à:

Updated Records: 10


Nota: Transações

Se você estiver usando transações, você deve utilizar mysql_affected_rows() depois da sua consulta INSERT, UPDATE, ou DELETE, não depois de COMMIT.

Nota: Comandos SELECT

Para obter o número de linhas retornados por um SELECT, é possível usar mysql_num_rows().

Veja Também

add a note add a note

User Contributed Notes 8 notes

dobrys at abv dot bg
9 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
9 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.
Ome Ko
5 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());
temp02 at flexis dot com dot br
11 years ago
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.

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.

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.
5 months 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.
deponti A_T tiscalinet D0T it
12 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)
steffen at showsource dot dk
12 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
sean at adtools dot co dot uk
8 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.

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();
$result = mysql_query($sql);
$affectedrows = "[".mysql_affected_rows($link)."]";
"[".number_format((getmtime()-$start),3)."][$action]: $sql\n";

Example output:
[0.072][1][80]: UPDATE MYTABLE SET FIELD = 1;

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