UPDATE users SET 'name'='john' WHERE users.ID = 54;
实际上所有这个问题都与pdo::rowCount
有关,因为我需要知道与查询的匹配是:
1.发现,但无需更新(匹配值)
2.找到并更新了
3.根本找不到,(未更新)
我正在寻找一种方法来告诉PHP这三个选项中的一个
答案 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。