PHP+;MySQL:如何知道更新查询何时与WHERE语句不匹配?

PHP+;MySQL:如何知道更新查询何时与WHERE语句不匹配?,php,mysql,mysqli,Php,Mysql,Mysqli,执行更新查询时,我希望能够知道操作是否: 已成功执行,并已更改值 已成功执行,但该值与以DB为单位的值相同 未成功执行 因此,假设我在DB中只有一行,它有列id=1和my_value=“abc”,我执行以下查询: 1) UPDATE goals SET my_value = 'xyz' WHERE id = '9' (it would fail on where) 2) UPDATE goals SET my_value = 'xyz' WHERE id = '1' (it will go

执行更新查询时,我希望能够知道操作是否:

  • 已成功执行,并已更改值
  • 已成功执行,但该值与以DB为单位的值相同
  • 未成功执行
因此,假设我在DB中只有一行,它有列id=1my_value=“abc”,我执行以下查询:

1) UPDATE goals SET my_value = 'xyz' WHERE id = '9' (it would fail on where)
2) UPDATE goals SET my_value = 'xyz' WHERE id = '1' (it will go fine)
3) UPDATE goals SET my_value = 'abc' WHERE id = '1' (it is exactly the same as the already stored column)
使用
$stmt->infected_rows
我可以将查询2与其他查询区分开来(
$stmt->infected_rows
值将为1),但我无法区分查询13(两个
$stmt->infected_rows
值都将为0)

有没有一种方法可以知道,如果不使用
WHERE id=''
语句执行SELECT查询?

这里有一个技巧:

SET @i = 0;
UPDATE goals SET my_value = 'xyz', id = id+(@i:=@i+1)-@i WHERE id = '1';
运行此操作后,
@i
将按匹配行数递增,无论更新是否更改了值


诀窍是加上和减去
@i
,这将是一个0的净变化。

一种方法
更新目标设置my_值='abc',其中id='1'和my_值!='abc'
,或使用事务,在更新前执行选择以检查值。也可以查看
UPDATE IGNORE
。您可以先运行select来检查案例1,然后运行更新,您知道行存在,
受影响的_行
将为案例2返回1,为案例3返回0。