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

标签 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

然而,事实证明 PHP 的 mysql_affected_rows 是实际受影响的行,如果该行存在但 name 可能仍然是 0已经是“测试”了。 (PHP docs 竟然说是这样)。

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

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

有什么方法可以让我在 PHP 中获取“匹配的行”值而不是受影响的行?

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

最佳答案

来自 MySQL documentation对于 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 个参数。

关于PHP,MySQL - 你能区分匹配的行和受影响的行吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2925831/

相关文章:

PHP 为从数据库中选择的多个用户发送邮件

php - 在 PHP 中使用带有匹配表达式的值数组

php - 使用 MYSQL 和 PHP 以 HTML 形式进行搜索

php - 更新 PDO 绑定(bind)键和值

php - 文本预处理的性能改进

PHP Catchable fatal error INI处理类

mysql - SQL如何在值更改时检索第一行?

mysql - SQL:从多个记录中获取满足条件的记录

php - 如何在同一查询中使用 SUM 结果?

mysql - 如何使用代理设置在 Windows 7 上安装 RMysql