使用PDO,如何确保UPDATE语句成功?

ale*_*186 18 php mysql

似乎对于INSERT语句,可以使用if (isset($connect->lastInsertId()))以检查INSERT语句是否成功.(如果我错了,请纠正我.)

但是对于UPDATE语句,我怎么知道它是否成功?

例如,我有一个像这样的基本的:

$statement=$connect->prepare("UPDATE users SET premium='1' WHERE userid=?");
$statement->execute(array($id));
Run Code Online (Sandbox Code Playgroud)

非常感谢提前.问候

FtD*_*Xw6 25

这取决于你对"成功"的意思.如果你的意思是在没有失败的情况下执行查询,那么PDO将在失败时返回异常或FALSE从中返回PDOStatement::execute(),这取决于你设置的错误模式,因此在这种情况下"成功"查询只是执行方法执行的查询不归还FALSE或抛出异常.

如果你的意思是"成功",实际上有更新的行(只更新了0行),那么你需要检查使用PDOStatement::rowCount(),这将告诉你上一个查询中受影响的行数.

警告:对于newvalue = oldvalue PDOStatement::rowCount()返回零的更新.您可以使用

$p = new PDO($dsn, $u, $p, array(PDO::MYSQL_ATTR_FOUND_ROWS => true));

为了禁用这种意外行为.

  • 注意依赖于rowCount结果:PDOStatement-> rowCount - 返回受上一个SQL语句影响的行数如果您尝试更新一行但新字段值与一个(s)相同已存储在DB中的rowCount将返回0(因为没有实际更新!).这并不意味着您的UPDATE语句未成功执行! (4认同)

小智 9

$stmt->execute();
$count = $stmt->rowCount();

if($count =='0'){
    echo "Failed !";
}
else{
    echo "Success !";
}
Run Code Online (Sandbox Code Playgroud)

  • rowCount 返回受最后一个 SQL 语句影响的行数。因此,如果计数为 0,则没有行受到影响。因此更新失败。我会删除数字零周围的引号,因为 rowCount 方法返回一个 int。无论如何它都会起作用,因为您没有使用三等号进行比较。 (3认同)
  • 您最好解释一下您的答案,仅代码答案不是很有帮助。 (2认同)