6

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

$stmt = $conn->prepare('UPDATE users SET name = :name WHERE id = :id');

$result = $stmt->rowCount(); // 1

if ($result == 1) {echo "success!";}
4

3 回答 3

3

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

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

$stmt = $conn->prepare('UPDATE users SET name = :name WHERE id = :id');

$result = $stmt->execute($params); // <-- execute first!

if ($result) {echo "success!";}
于 2013-11-08T11:47:53.853 回答
2

我同意军团。但不是计数,我曾经添加一个包含上次更新时间的列。这样我就可以使用它来获取在特定时间后更新的条目。通过这种方式,我能够减少发送给客户端的条目数量。最终决定取决于您的要求。

$stmt = $conn->prepare('UPDATE users SET name = :name, updateTime = currentTime WHERE id = :id');   
$result = $stmt->rowCount(); // 1
if ($result == 1) {echo "success!";}
于 2013-11-08T11:45:23.880 回答
0

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

将列添加counterusers表中。然后在每次更新时增加这个值。

$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您可以在更新时使用当前日期时间,而不是使用当前日期时间。

于 2013-11-08T11:37:56.213 回答