我正在尝试编写一个有点智能的PHP-MySQL数据库处理器。当此处理器决定需要进行更新时,我想报告它是否真的成功。我以为我可以使用mysql_affected_rows
...
// Example:
// After running query "UPDATE mytable SET name='Test' WHERE ID=1"
$result = mysql_affected_rows();
if ($result >= 1) { /* Success */ }
例如,如果没有 ID = 1 的行,那么$result
将 0 。
然而,事实证明PHP的mysql_affected_rows
是实际受影响的行,如果行存在但name
已经是“测试”,则可能仍然 0 。 (PHP docs甚至说这是事实。)
如果我在命令行中运行此命令,则会获得有关查询的以下元信息:
Query OK, 0 rows affected (0.01 sec)
Rows matched: 1 Changed: 0 Warnings: 0
有没有办法让我在PHP中获得“Rows matching”值而不是受影响的行?
[编辑]:我应该注意,我知道我可以运行单独的查询,但为了提高性能,我不想这样做。
答案 0 :(得分:14)
来自mysql_affected_rows
的{{3}}:
对于UPDATE语句,如果指定 CLIENT_FOUND_ROWS标志时 连接到mysqld, mysql_affected_rows()返回 WHERE匹配的行数 条款。否则,默认 行为是返回的数量 行实际上已经改变了。
使用 mysqli ,您可以使用MySQL documentation指定CLIENT_FOUND_ROWS。
$db = mysqli_init();
$db->real_connect('host', 'username', 'password', 'dbname', '3306', null, MYSQLI_CLIENT_FOUND_ROWS);
在 PDO 中,常量名为PDO :: MYSQL_ATTR_FOUND_ROWS
$db = new PDO('mysql:dbname=mydatabase;host=myhost', 'username', 'password', array(
PDO::MYSQL_ATTR_FOUND_ROWS => true
));
使用旧的和不推荐使用的MySQL扩展,您可以指定CLIENT_FOUND_ROWS,将值2作为mysql_connect(mysqli::real_connect)的第5个参数传递。
答案 1 :(得分:7)
您也可以使用
功能$variable = mysql_info();
该函数检索如下字符串:
匹配的行数:1已更改:0警告:0
您可以使用变量上的字符串函数来提取具有匹配行数的子字符串,您应该拥有它!