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

时间:2014-08-06 18:44:02

标签: php mysql sql pdo rowcount

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

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

userId | itemsAdded | itemsChecked | itemsUnChecked | itemsTotal
     1 |          5 |            2 |              3 |          5

所以,当我update items set itemTotals = itemsChecked+itemUnCheckeditemsTotal列保持不变,除非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!';
}

我也可以使用:

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

$result = $query->execute(array(

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

if($result) {
    echo 'Updated succeeded';
} else {
    echo 'Updated failed!';
}

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

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

2 个答案:

答案 0 :(得分:7)

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

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

$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

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

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

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

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


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

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

} else {
   echo 'Update failed!';

}

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

答案 1 :(得分:2)

即使没有影响行也不意味着更新失败,就像你说的那样,没有任何改变。如果抛出异常,它只会失败。要处理这个问题,你需要实现一个try / catch块。

http://php.net/manual/en/language.exceptions.php

try{
    $query = $conn->prepare($sql);      
    $result = $query->execute(array(    
        ":itemCount" => $itemCount
        ":itemId" => $itemId
    ));
    echo 'Updated succeeded';
} catch(Exception $e) {
    echo 'Updated failed!';
}