# mysql_affected_rows

(PHP 4, PHP 5)

mysql_affected_rows — 取得前一次 MySQL 操作所影响的记录行数

Warning

本扩展自 PHP 5.5.0 起已废弃，并在自 PHP 7.0.0 开始被移除。应使用 MySQLi 或 PDO_MySQL 扩展来替换之。参见 MySQL：选择 API 指南以及相关 FAQ 来获取更多信息。用以替代本函数的有：

- mysqli_affected_rows()
- PDOStatement::rowCount()

### 说明

mysql_affected_rows ([ resource `$link_identifier` = NULL ] ) : int

取得最近一次与 `link_identifier` 关联的 INSERT，UPDATE 或 DELETE 查询所影响的记录行数。

### 参数

`link_identifier`

  MySQL 连接。如不指定连接标识，则使用由 mysql_connect() 最近打开的连接。如果没有找到该连接，会尝试不带参数调用 mysql_connect() 来创建。如没有找到连接或无法建立连接，则会生成 `E_WARNING` 级别的错误。

### 返回值

执行成功则返回受影响的行的数目，如果最近一次查询失败的话，函数返回 -1。

如果最近一次操作是没有任何条件（WHERE）的 DELETE 查询，在表中所有的记录都会被删除，但本函数返回值在 4.1.2 版之前都为 0。

当使用 UPDATE 查询，MySQL 不会将原值和新值一样的列更新。这样使得 mysql_affected_rows() 函数返回值不一定就是查询条件所符合的记录数，只有真正被修改的记录数才会被返回。

REPLACE 语句首先删除具有相同主键的记录，然后插入一个新记录。本函数返回的是被删除的记录数加上被插入的记录数。

"INSERT ... ON DUPLICATE KEY UPDATE" 这种情况的查询，当执行了一次 INSERT 返回的值会是 1；如果是对已经存在的记录执行一次 UPDATE 将返回 2。

### 范例

Example #1 mysql_affected_rows() 例子

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

    /* 本例返回被删除记录的准确数目 */
    mysql_query('DELETE FROM mytable WHERE id < 10');
    printf("Records deleted: %d\n", mysql_affected_rows());

    /* 对于非真值的 WHERE 子句，应返回 0 */
    mysql_query('DELETE FROM mytable WHERE 0');
    printf("Records deleted: %d\n", mysql_affected_rows());
    ?>

以上例程的输出类似于：

    Records deleted: 10
    Records deleted: 0

Example #2 使用事务处理的 mysql_affected_rows() 例子

    <?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");
    ?>

以上例程的输出类似于：

    Updated Records: 10

### 注释

> Note: 事务处理

> 如果使用事务处理（transactions），需要在 INSERT，UPDATE 或 DELETE 查询后调用 mysql_affected_rows() 函数，而不是在 COMMIT 命令之后。

> Note: SELECT 语句

> 要获取 SELECT 所返回的行数，可以用 mysql_num_rows()。

> Note: Cascaded 外键

> mysql_affected_rows() does not count rows affected implicitly through the use of ON DELETE CASCADE and/or ON UPDATE CASCADE in foreign key constraints.

### 参见

- mysql_num_rows() - 取得结果集中行的数目
- mysql_info() - 取得最近一条查询的信息