Mysql 更新查询,如果值没有改变怎么办?我该如何检查


Mysql update query, what if value didn't change? how do I check for that?

执行 UPDATE 语句时,如果值与新值相同,则 rowCount 不会更改。但就我的申请而言,这也是一个成功。那么,无论值是否更改,如何检查更新是否成功?

$stmt = $conn->prepare('UPDATE users SET name = :name WHERE id = :id');
$result = $stmt->rowCount(); // 1
if ($result == 1) {echo "success!";}

您不是在执行查询,而只是在准备它。因此,rowCount()将报告无效的行数(指上次执行的查询),因为还没有行受到影响,并且一旦您使用特定的参数值执行准备好的语句,系统事先不知道会有多少行。

您应该在执行语句时检查是否成功。如果成功,execute()方法将返回true,否则false。因此,如果执行成功是你唯一需要的,那么你应该按照以下思路去做:

$stmt = $conn->prepare('UPDATE users SET name = :name WHERE id = :id');
$result = $stmt->execute($params); // <-- execute first!
if ($result) {echo "success!";}

我同意Legionar的观点。但是我过去没有添加计数,而是添加包含上次更新时间的列。这样我就可以使用它来获取在特定时间后更新的条目。通过这种方式,我能够减少发送到客户端的条目数量。最终决定取决于您的要求。

$stmt = $conn->prepare('UPDATE users SET name = :name, updateTime = currentTime WHERE id = :id');   
$result = $stmt->rowCount(); // 1
if ($result == 1) {echo "success!";}

我认为这不能正常完成,但您可以使用另一列寻求帮助。

将列counter添加到users表中。然后只需在每次更新时增加此值。

$stmt = $conn->prepare('UPDATE users SET name = :name, counter = counter + 1 WHERE id = :id');
$result = $stmt->rowCount(); // 1
if ($result == 1) {echo "success!";}

所以现在,没关系,值name是否会改变,counter每次都会改变,所以每次都会回来,1如果成功。

或者正如Damodaran回答的那样,您可以在进行更新时使用当前日期时间,而不是counter