Php 什么时候应该准备和执行使用PDO的“try”和“catch”?

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{

我已经使用PDO好几年了,但是我从来没有完全研究过什么时候应该使用
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可能是,但我不信任任何变量。根据定义,它们的值会发生变化,因此您无法确保直接感染是安全的。只需绑定所有变量输入就更容易了。