search for in the  
<MySQLmysql_change_user>
Last updated: Thu, 19 May 2005

mysql_affected_rows

(PHP 3, PHP 4, PHP 5)

mysql_affected_rows -- Get number of affected rows in previous MySQL operation

Description

int mysql_affected_rows ( [resource link_identifier] )

Get the number of affected rows by the last INSERT, UPDATE or DELETE query associated with link_identifier.

Parameters

link_identifier

The MySQL connection. If the link identifier is not specified, the last link opened by mysql_connect() is assumed. If no such link is found, it will try to create one as if mysql_connect() was called with no arguments. If by chance no connection is found or established, an E_WARNING level warning is generated.

Return Values

Returns the number of affected rows on success, and -1 if the last query failed.

If the last query was a DELETE query with no WHERE clause, all of the records will have been deleted from the table but this function will return zero with MySQL versions prior to 4.1.2.

When using UPDATE, MySQL will not update columns where the new value is the same as the old value. This creates the possibility that mysql_affected_rows() may not actually equal the number of rows matched, only the number of rows that were literally affected by the query.

The REPLACE statement first deletes the record with the same primary key and then inserts the new record. This function returns the number of deleted records plus the number of inserted records.

Examples

Example 1. mysql_affected_rows() example

<?php
$link
= mysql_connect('localhost', 'mysql_user', 'mysql_password');
if (!
$link) {
   die(
'Could not connect: ' . mysql_error());
}
mysql_select_db('mydb');

/* this should return the correct numbers of deleted records */
mysql_query('DELETE FROM mytable WHERE id < 10');
printf("Records deleted: %d\n", mysql_affected_rows());

/* with a where clause that is never true, it should return 0 */
mysql_query('DELETE FROM mytable WHERE 0');
printf("Records deleted: %d\n", mysql_affected_rows());
?>

The above example will output something similar to:

Records deleted: 10
Records deleted: 0

Example 2. mysql_affected_rows() example using transactions

<?php
$link
= mysql_connect('localhost', 'mysql_user', 'mysql_password');
if (!
$link) {
   die(
'Could not connect: ' . mysql_error());
}
mysql_select_db('mydb');

/* Update records */
mysql_query("UPDATE mytable SET used=1 WHERE id < 10");
printf ("Updated records: %d\n", mysql_affected_rows());
mysql_query("COMMIT");
?>

The above example will output something similar to:

Updated Records: 10

Notes

Transactions: If you are using transactions, you need to call mysql_affected_rows() after your INSERT, UPDATE, or DELETE query, not after the COMMIT.

SELECT Statements: To retrieve the number of rows returned by a SELECT, it is possible to use mysql_num_rows().



User Contributed Notes
mysql_affected_rows
jeroen_vde at hotmail dot com
12-Mar-2005 07:22
If you want to delete all in table, and get number of affected rows back use a delete statment of this form:

mysql> DELETE FROM table_name WHERE 1>0;

Note that this is much slower than DELETE FROM table_name with no WHERE clause, because it deletes rows one at a time.

Source: MySQL Reference Manual "Delete Syntax"
steffen at showsource dot dk
28-Sep-2004 05:20
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
sam_dot_fullman_at_verizon.nt
19-May-2004 02:12
Just a MySQL note, using REPLACE INTO on a record could return either ONE or TWO affected rows with this function.  Basically, REPLACE INTO will insert a record if no combination of unique keys is matched, or delete the existing record if the new record matches one or more unique keys, then insert the new record over it.

This is actually helpful if you want to know if a record was already in there.  (Affected rows=1 means there wasn't already a record there, Affected rows=2 means there was), but if you don't know how REPLACE INTO works it could confuse you.  I didn't see this in the notes above and hope it helps someone out.
deponti A_T tiscalinet D0T it
07-Nov-2003 06:52
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)
Richard dot Johnson2 at student dot gu dot edu dot au
25-Oct-2003 05:56
RE: sng2nara's comment

I think the expression should read:
"/^[^0-9]+([0-9]+)[^0-9]+([0-9]+)[^0-9]+([0-9]+).*$/"
as there is nothing usually returned after the number of warnings.  The previous expression required at least 1 non-digit character after the number of warnings.
sng2nara
02-Oct-2003 02:41
You can use following code for choosing update or insert.

mysql_query($update_sql);
preg_match(
"/^[^0-9]+([0-9]+)[^0-9]+([0-9]+)[^0-9]+([0-9]+)[^0-9]+$/",
  mysql_info(),
  $arr);

if( $arr[1] == 0 ) // a number of matched rows is 0
{...do insert query...}
else
{...nothing...}
raistlin at oracolo dot com
03-Jul-2003 11:38
| If you need to know the actual count of rows,
| even if some update changed nothing add a field
| count int(11) and add | one on every update, like in:
|
| mysql_query("update table set count=count+1, ...");
| if (mysql_affected_rows()==0) {
|  mysql_query("insert into table ...");
| }

Better: add a field `flag` tinyint(1) unsigned default '0'
on every update: "update table set flag=1-flag, ..."
anthonyd at rhsonline dot net
02-Jul-2003 06:08
My little work around for the update problem (that I ran into):

if (mysql_affected_rows()==0)  {
  $q = "select .. WHERE ...<search for what you updated>'";
  if (mysql_num_rows(mysql_query($q))==0)
   die("0 rows affected");
  else
   echo "Record Alredy Existed";
}

It is probably not the best way, as I sometimes run 2 queries for the same thing, but it gets the job done.
phpweb at eden2 dot com
28-Jun-2003 01:47
"Note: When using UPDATE, MySQL will not update columns where the new value is the same as the old value.  This creates the possiblity that mysql_affected_rows() may not actually equal the number of rows matched, only the number of rows that were literally affected by the query."

As of PHP 4.3.0 (I assume, I only tried with 4.3.2), you can make mysql_affected_rows() return the number of rows matched, even if none are updated.

You do this by setting the CLIENT_FOUND_ROWS flag in mysql_connect(). For some reason, not all the flags are defined in PHP, but you can use the decimal equivalent, which for CLIENT_FOUND_ROWS is 2.

So, for example:

$db= mysql_connect("localhost", "user", "pass", false, 2);
mysql_select_db("mydb", $db);

$query= "UPDATE ...";
mysql_query($query);
print mysql_affected_rows(); // more than 0
mysql_query($query); // same query twice
print mysql_affected_rows(); // still more than 0
gabriel dot preda at amr dot ro
18-Jun-2003 10:35
-1-----------------------------
$w = "insert into...";
$q = mysql_query($w) or die('mortua est'); // 1433 times
print mysql_affected_rows($cnex); // prints 1433
-2-----------------------------
$w = "insert into...";
$q = mysql_query($w) or die('mortua est'); // 1433 times
@mysql_query("SELECT a FROM b LIMIT x"); //
print mysql_affected_rows($cnex); // prints x

It appears that php's "mysql_affected_rows" calls mysql's "mysql_affected_rows"... witch says:

"For SELECT statements, mysql_affected_rows() works like mysql_num_rows().
mysql_affected_rows() is currently implemented as a macro."
adam at NOSPAM dot example dot com
17-Jan-2003 01:34
using PHP/MySql -There is an alternate way to get the rows returned -
for non-critical use i suppose--due to its oversimplified approach.

You can simply intialize a variable to the integer value of 0, and then, inside of the "while" loop that returns the rows
of your query, you increment that variable and then print out the final value of that variable outside of that "while" loop.
Or, you could print the variable within each iteration if you want to give each row returned [ as in a chart where you
need to provide line numbers ]

//code:
$sql = "SELECT * FROM YourTable
ORDER BY Last_Name";

$result = @mysql_query($sql, $connection) or die("Could not execute query.");

$i = 0; // we will use variable $i as a returned row counter.

while ($row = mysql_fetch_array($result)) {
$First_Name = $row['First_Name'];
$Last_Name = $row['Last_Name'];
$num_rows = mysql_num_rows($result);
$i++;

//To show the rows number by number

echo "Member no. $i $First_Name $Last_Name < br >";
// the < br > is an actual HTML line break
// which is not allowed on posting these notes,
// to use it, close up the spaces between the < and the >

// above echo statement will produce the results below if 3 rows were returned:
//  Member no. 1 John Jones
//  Member no. 2 Mary Smith
//  Member no. 3 Nancy Steffan

}
  echo "$i Rows Returned from query.";

// above statement will produce:
//    3 Rows Returned from query.

Hope this helps-- again,
this is a simplified approach.

take care;
<?adam?>
spam123 at cobsen dot biz
08-Dec-2002 07:04
If you need to know the actual count of rows, even if some update changed nothing add a field count int(11) and add one on every update, like in:

mysql_query("update table set count=count+1, ...");
if (mysql_affected_rows()==0) {
  mysql_query("insert into table ...");
}
ben-xo at NOSPAMdubplatesNOSPAM dot org
21-Apr-2002 09:30
mysql_affected_rows() reports on the number of rows affected by an in-place operation on the database, but mysql_num_rows() returns the number of rows in a MySQL record set (which is held by PHP after MySQL has generated it). This means that if you can do

$a = mysql_query("SELECT ...");
$b = mysql_query("SELECT ...");
if (mysql_unm_rows($a) > mysql_num_rows($b)) print "a is larger";
else print "b is larger";

... but this does not make sense for the operations supported by mysql_affected_rows(), which reports on the status of the database connection as a whole.

Particularly note this:

$query = "UPDATE ...";
mysql_query($query);
print mysql_affected_rows(); // more than 0
mysql_query($query); // same query twice
print mysql_affected_rows(); // 0.

.. this is because the 2nd time you execute the identical query, all the rows are already updated so no rows are affected the 2nd time.

I hope this clears up why mysql_num_rows() and mysql_affected_rows() are fundamentally different
dfylstra at frontsys dot com
13-Aug-2001 02:06
mysql_affected_rows() also reports the number of rows changed by the LOAD DATA command.  If you use the IGNORE option in LOAD DATA and you know the number of rows in the input file, you can use mysql_affected_rows() to determine the number of rows that were ignored.
peter at petermoulding dot NO_SPAM dot com
06-Aug-2001 01:34
mysql_affected_rows() fails with some automatic updates. An example from the PHP Black Book is that of session records updated by automatic timestamps. When you maintain the session valid time via a timestamp and use some databases including MySQL, then update the session record, the automatic timestamp update will not count as an update in mysql_affected_rows(). You have to manually update the timestamp field. In MySQL that is achieved by setting the field to nulls. If your time field is named updated, you have to include
set updated = null
Other databases require appropriate tricks and you will have to test stored procedures in your database to see if their updates count in mysql_affected_rows().

<MySQLmysql_change_user>
 Last updated: Thu, 19 May 2005
Copyright © 2001-2005 The PHP Group
All rights reserved.
This unofficial mirror is operated at: The Server Pages
Last updated: Thu May 19 17:35:34 2005 CDT