使用php pdo和mysql时,确定更新查询是否成功的确定方法是什么?
在我的应用中,我更新了提交但是用户的项目总数,表格如下所示:
项
userId | itemsAdded | itemsChecked | itemsUnChecked | itemsTotal
1 | 5 | 2 | 3 | 5
所以,当我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!';
}
我也可以使用:
$query = $conn->prepare($sql);
$result = $query->execute(array(
":itemCount" => $itemCount
":itemId" => $itemId
));
if($result) {
echo 'Updated succeeded';
} else {
echo 'Updated failed!';
}
但是,如果查询成功或基于更新的行数,它会返回true还是false?
我只需要检查查询是否成功。无需告知已更新的行数。
答案 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!';
}