PHP PDO MySQL在没有行受影响时检查更新查询是否成功的正确方法

jme*_*zes 5 php mysql sql pdo rowcount

使用php pdo和mysql时,确定更新查询是否成功的确定方法是什么?

在我的应用程序中,我更新了提交但是用户的项目总数,表格如下所示:

项目

userId | itemsAdded | itemsChecked | itemsUnChecked | itemsTotal
     1 |          5 |            2 |              3 |          5
Run Code Online (Sandbox Code Playgroud)

因此,当我这样做时update items set itemTotals = itemsChecked+itemUnChecked,itemsTotal除非itemsAdded更改并且itemsUnChecked增加(2 + 3等于5,1 + 4也是5),否则列保持不变.

我曾经使用rowCount()来检查查询是否成功,但在这种情况下,由于itemsTotal列保持不变,因此无法确定sql是否成功.

$query = $conn->prepare($sql);

$query->execute(array(

    ":itemCount" => $itemCount
    ":itemId" => $itemId
));

$queryCount = $query->rowCount();

if($queryCount == 1) {
    echo 'Updated succeeded';
} else {
    echo 'Updated failed!';
}
Run Code Online (Sandbox Code Playgroud)

我也可以用:

$query = $conn->prepare($sql);

$result = $query->execute(array(

    ":itemCount" => $itemCount
    ":itemId" => $itemId
));

if($result) {
    echo 'Updated succeeded';
} else {
    echo 'Updated failed!';
}
Run Code Online (Sandbox Code Playgroud)

但是,如果查询成功或基于更新的行数,它会返回true还是false?

我只需要检查查询是否成功.无需告知已更新的行数.

spe*_*593 7

execute()当SQL语句的执行失败时,该方法将抛出异常或返回FALSE(取决于您为数据库连接设置的错误模式).

如果我们在执行语句之前(通常在建立数据库连接之后立即)将错误模式设置为抛出异常,就像这样

$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
Run Code Online (Sandbox Code Playgroud)

然后我们可以使用try/catch块来处理SQL语句抛出的异常.像这样的东西:

try {
  $query->execute(...);
  echo 'Update succeeded';

} catch(PDOException $e) {
  echo 'Update failed!';
  echo 'Error: ' . $e->getMessage();
}
Run Code Online (Sandbox Code Playgroud)

有关错误模式设置和处理的信息,请参见以下文档:http://php.net/manual/en/pdo.error-handling.php


或者,如果PDO未设置为抛出异常,我们可以使用简单的if测试.(execute()如果语句失败,该方法将返回FALSE.)

if ($query->execute(...)) {
   echo 'Update succeeded';

} else {
   echo 'Update failed!';

}
Run Code Online (Sandbox Code Playgroud)

为了更精确地控制不同类型的故障,我们可以使用该errorCode()方法检索与语句句柄上的最后一个操作相关联的SQLSTATE,并且我们可以对返回的值执行条件测试.http://php.net/manual/en/pdostatement.errorcode.php