当使用 try catch block 时,处理 PDO 错误的正确方法是什么?
目前我有这样的东西:
BlogModel.php
class BlogModel extends Model {
public function save($id, $value) {
$stmt = $this->getDb()->prepare('UPDATE setting SET name = :name WHERE id = :id');
$stmt->bindParam(':id', $id);
$stmt->bindParam(':name', $values);
return ($stmt->execute() !== false) ? $id : false;
}
}
所以,在 Controller BlogController.php 中,我会做这样的事情:
<?php
class Blog extends Controller {
public function comments()
{
$data = array();
$model = new BlogModel;
if ($model->save(2,'test')) {
$data['result']['message'] = 'Settings saved';
$data['result']['status'] = 'success';
} else {
$data['result']['message'] = 'Could not save the settings';
$data['result']['status'] = 'error';
}
$view = new View("view.php", $data)
$view->render();
}
}
?>
这是我使用 if
条件处理 PDO 错误的方式。将其转换为 try catch block 的正确方法是什么?我不想对变量 ($data['result']['message']
$data['result']['status']
) 全部进行编码时间。
是否可以通过某种方式在 catch block 中添加“抛出异常”?
如果 Controller 中有很多 try catch block ,它看起来会很乱......对吧?
最佳答案
这里没有一个答案是错误的。但实际上这三者加起来才是真正的答案。 你绝对应该设置
$this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
正如 Cerad 所说。
从现在开始,关于数据库的任何问题都将通过 PDOException
类型的异常抛出。你不必像 ladar 所说的那样抛出你自己的 Exception
因为它没用。只需将 ladar 代码转换成
...
$data = array();
$model = new BlogModel;
try{
$model->save(2,'test');
$data['result']['message'] = 'Settings saved';
$data['result']['status'] = 'success';
}catch(PDOException $e){
$data['result']['message'] = 'Could not save the settings';
$data['result']['status'] = 'error';
}
并且不要自己扔任何东西。
调试 PDO 查询的一个非常好的方法是使用 Basic 链接的 catch 脚本,您可以找到 here再一次。
将这些东西结合在一起,您将拥有一种灵活、干净且易于调试的方法来捕获所有可能出现的错误。
关于php - 如何使用 PDO 的 try-catch block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9252276/