我已经使用 PDO 几年了,但我从未充分研究过何时应该使用try和准备和执行catch。
我的理解是,当数据可能包含用户输入时,您应该使用tryand 。catch
所以这个例子的代码是安全的:
public function getDetails($filename, $what){
$query = $this->handler->prepare('SELECT * FROM videos WHERE v_fileName = :v_fileName');
try{
$query->execute([
':v_fileName' => $filename
]);
}catch(PDOException $e){
return $e->getMessage();
}
}
Run Code Online (Sandbox Code Playgroud)
$filename在此示例中,内容来自 URL。
例如,当没有从 URL 中获取任何内容时,它也会完全保存:
$query = $this->handler->prepare('SELECT * FROM videos WHERE u_id = :u_id ORDER BY v_id LIMIT :climit,1');
$query->execute([
':u_id' => $this->user->getChannelId($userid),
':climit' => $optional[1]
]);
$fetch = $query->fetch(PDO::FETCH_ASSOC);
Run Code Online (Sandbox Code Playgroud)
我对准备陈述的理解是否正确?如果不正确,我该怎么做?
仅当您有充分的理由时才这样做。
这不仅仅适用于 PDO 例外。对于任何例外情况也是如此。仅当您的代码可以从中恢复并执行其他操作时才捕获异常。
仅仅捕获异常echo或return $e->getMessage();不是一个有效的原因。您的代码无法从问题中恢复,您只是阻碍了异常。
您可能想要恢复的一个很好的例子是,如果您正在使用数据库事务,并且在发生故障时,您想要回滚并执行其他操作。您可以调用PDO::rollBack()您的代码catch,然后让您的代码执行一些替代逻辑。
Try-catch 不是一种安全措施。它与用户输入无关。它仅在您预计代码会失败但您有 B 计划来处理这种情况的情况下使用。
有关更多信息,您可以阅读我的 PDO 语句不起作用和文章PHP 错误报告