Php 什么时候应该准备和执行使用PDO的“try”和“catch”?
我已经使用PDO好几年了,但是我从来没有完全研究过什么时候应该使用Php 什么时候应该准备和执行使用PDO的“try”和“catch”?,php,exception,pdo,Php,Exception,Pdo,我已经使用PDO好几年了,但是我从来没有完全研究过什么时候应该使用try和catch来准备和执行 我的理解是,当数据可能包含用户输入时,应该使用try和catch 例如,这段代码是安全的: public function getDetails($filename, $what){ $query = $this->handler->prepare('SELECT * FROM videos WHERE v_fileName = :v_fileName'); try{
try
和catch
来准备和执行
我的理解是,当数据可能包含用户输入时,应该使用try
和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();
}
}
$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);
我对准备陈述的理解正确吗?如果不正确,我应该如何做?只有在您有充分理由这样做的情况下才能这样做。 这不仅仅适用于PDO异常。任何例外情况也是如此。只有当代码可以从异常中恢复并执行其他操作时,才能捕获异常 捕捉异常,仅限于
echo
或return$e->getMessage()代码>不是有效的原因。您的代码无法从问题中恢复,您只是在限制异常
关于何时可能需要恢复的一个很好的例子是,如果您正在使用数据库事务,并且在出现故障时,您希望回滚并执行其他操作。您可以调用catch
,然后让代码执行一些可选逻辑
试捕不是一种安全措施。它与用户输入无关。它只在您希望代码失败的情况下使用,但您有一个B计划来处理这种情况
有关更多信息,请阅读和阅读本文
我对准备陈述的理解正确吗?如果不正确,如何理解
我应该这样做吗
您使用预先准备好的语句来避免。
准备好的语句将引用参数以避免它
我的理解是,当数据可能丢失时,您应该使用try-and-catch
包含用户输入
try
catch
块用于处理应用程序中的错误,实际上与准备好的语句无关。我通常只在编辑时使用它,当它投入生产时,我会将其更改为一条错误消息,说明出现了问题。不,这是错误处理程序的责任。错误处理程序应该捕获所有异常和错误,将它们记录到文件中,并向用户显示一个漂亮的500错误页面。这在任何方面都不是PDO逻辑特有的。为什么和错误处理程序要对此负责?错误消息的错误或不安全之处是什么?它不是不安全的。这只是一个非常混乱的代码。您可以使用一个全局错误处理程序来处理所有错误,而不是为每一行代码都提供一条错误消息。用户不需要知道到底是什么被破坏了,这就是错误日志的用途。您可以在这里找到更多信息,在本文中,如果您离开ini\u集('display\u errors',1),这将是不安全的代码>在生产代码中。确保生产系统从不向用户显示内部错误。SQL注入不能只在用户输入时发生吗?如果是这样的话,那么我这样做是可以的,对吗?@Tom不,当你把PHP变量和SQL字符串混合在一起时,就会发生SQL注入。当您使用参数绑定时,应该没有SQL注入的风险。但我的问题不是关于参数绑定,而是关于何时使用try
和catch
@Dharman纠正我的错误,但是,PHP中设置的变量(不是来自用户输入)不会有(恶意)SQL注入的风险(当然,除非作者在PHP中设置的字符串本身是恶意的)@GrumpyCrouton可能是,但我不信任任何变量。根据定义,它们的值会发生变化,因此您无法确保直接感染是安全的。只需绑定所有变量输入就更容易了。