微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PHP,MySQL – 你能区分匹配的行和受影响的行吗?

我正在尝试编写一个有点智能的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.

但是,事实证明PHPMysqL_affected_rows是实际受影响的行,如果行存在但名称已经是“Test”,则可能仍为0. (PHP docs甚至说是这样的).

如果我在命令行中运行它,我会获得有关查询的以下元信息:

Query OK, 0 rows affected (0.01 sec)
Rows matched: 1  Changed: 0  Warnings: 0

有没有办法让我在PHP中获得“Rows matching”值而不是受影响的行?

[编辑]:我应该注意,我知道我可以运行一个单独的查询,但为了性能,我不想这样做.

解决方法:

MySQL documentation for MysqL_affected_rows:

For UPDATE statements, if you specify
the CLIENT_FOUND_ROWS flag when
connecting to MysqLd,
MysqL_affected_rows() returns the
number of rows matched by the WHERE
clause. Otherwise, the default
behavior is to return the number of
rows actually changed.

使用MysqLi,您可以使用mysqli::real_connect指定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(source)的第5个参数传递.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐