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

Nic*_*ole 11 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 */ }
Run Code Online (Sandbox Code Playgroud)

如果,例如,不存在与没有行ID = 1,那么$result将是0.

但是,事实证明,PHP mysql_affected_rows是实际受影响的行,如果行存在但可能仍为"测试" ,则可能仍为0name.(PHP文档甚至说这是事实).

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

Query OK, 0 rows affected (0.01 sec)
Rows matched: 1  Changed: 0  Warnings: 0
Run Code Online (Sandbox Code Playgroud)

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

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

Vin*_*nto 14

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);
Run Code Online (Sandbox Code Playgroud)

PDO中,常量名为PDO :: MYSQL_ATTR_FOUND_ROWS

$db = new PDO('mysql:dbname=mydatabase;host=myhost', 'username', 'password', array(
    PDO::MYSQL_ATTR_FOUND_ROWS => true
));
Run Code Online (Sandbox Code Playgroud)

使用旧的和不推荐使用的MySQL扩展,您可以指定CLIENT_FOUND_ROWS,将值2作为mysql_connect(source)的第5个参数传递.


小智 8

您也可以使用该功能

$variable = mysql_info();
Run Code Online (Sandbox Code Playgroud)

该函数检索如下字符串:

匹配的行数:1已更改:0警告:0

您可以在变量上使用字符串函数来提取具有匹配行数的子字符串,您应该拥有它!