如何判断PDO是否与我的UPDATE查询匹配,是否更新?

时间:2016-07-17 09:59:40

标签: php mysql pdo

UPDATE users SET 'name'='john' WHERE users.ID = 54;

实际上所有这个问题都与pdo::rowCount有关,因为我需要知道与查询的匹配是:
1.发现,但无需更新(匹配值)
2.找到并更新了 3.根本找不到,(未更新)

我正在寻找一种方法来告诉PHP这三个选项中的一个

1 个答案:

答案 0 :(得分:2)

正如UPDATE Syntax所述:

  

UPDATE返回实际更改的行数。 mysql_info() C API函数返回匹配和更新的行数以及UPDATE期间发生的警告数。

特别是,UPDATE查询mysql_info()返回ER_UPDATE_INFO后。 The MySQL Command-Line Tool在发出命令后立即显示此类信息。例如:

mysql> UPDATE users SET name='john' WHERE ID=54;
Query OK, 0 rows affected (0.00 sec)
Rows matched: 1  Changed: 0  Warnings: 0

MySQLi通过mysqli::$info提供对此功能的直接访问。甚至Original MySQL API也通过自己的mysql_info()函数提供了访问权限。

不幸的是,PDO无法访问此功能 - 搜索代码库确认它从不调用mysql_info()

或者,客户端可以设置CLIENT_FOUND_ROWS连接标志 - 然后UPDATE将返回匹配的行数而不是更改的数量。 PDO通过PDO::MYSQL_ATTR_FOUND_ROWS特定于驱动程序的属性提供了设置此连接标志的访问权限。

然而,此连接标记对您来说没什么用处,因为它不是无法区分" 根本找不到"并且" 已找到但没有更新",它将使您无法区分" 找到但没有更新"和" 找到并更新了"。

因此,正如其他人已经建议的那样,在这种情况下,您唯一的选择是执行单独的SELECT查询以区分可能的条件。为避免种族危险,您应该小心在同一交易中执行SELECT,并在更新前使用locking read