一尘不染

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

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是实际受影响的行,如果该行存在但已经是“ Test” ,则可能仍为
0name。(PHP文档甚至说是这种情况)。

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

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

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

[ 编辑 ]:我应该注意,我知道我可以运行一个单独的查询,但是出于性能考虑,我不想这样做。


阅读 250

收藏
2020-05-17

共1个答案

一尘不染

MySQL文档中获得mysql_affected_rows

对于UPDATE语句,如果在连接到mysqld时指定CLIENT_FOUND_ROWS标志,则mysql_affected_rows()返回WHERE子句匹配的行数。否则,默认行为是返回实际更改的行数。

使用 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扩展,您可以指定传递值2的CLIENT_FOUND_ROWS作为mysql_connect(source)的第五个参数。

2020-05-17