PDO:是否需要尝试捕获?

时间:2012-06-30 05:26:14

标签: php mysql pdo

我收到了混合信号。 PDO documentation中的警告似乎很清楚,省略try-catch可能会危及安全性。但是,this thread表明它并非真的有必要。在我看来,将每个查询包装在try-catch中会非常烦人。关于如何处理这个的任何建议?

3 个答案:

答案 0 :(得分:10)

存在安全风险,但您无需在任何地方添加try / catch。风险在于,如果您没有捕获异常,则可能会向用户显示来自异常的错误消息(可能包含敏感信息)。

但正如文档所述,您可以添加exception handler。通过重定向到一般错误消息,您可以避免向用户显示错误消息中的敏感信息。

在任何情况下,设置一般错误处理程序似乎都是非常明智的事情。您不希望向用户显示含义错误的错误消息。即使您使用“try / catch everything”方法,也很难100%确定您已捕获可能发生的每个可能的异常,因此异常处理程序仍应用作后备。

答案 1 :(得分:3)

PDO有three configurable error modes。默认设置只是设置错误代码,而不是抛出异常。

但是,使用PDO::ERRMODE_EXCEPTION。 PHP和PDO通常处理错误的方式(即,默默地按下代码而做错了而不告诉你)绝对是疯狂的,也是PHP可怕的一个重要原因。

如果您的查询出现问题,正确的做法是停止执行并抛出异常,这样您就可以找到并修复问题。

另外,使用try-catch比在每次查询后检查errorCodeerrorInfo要容易得多(即,“不那么烦人”)。如果你期望错误的可能性并且可以对它做些什么,你应该只使用try-catch - 否则你应该让异常冒泡。如果是意外错误,则可能是代码中的错误而您通过异常了解它,以便您可以修复它!

如果您想要报告异常(例如,打印它,发送电子邮件,等等),请注册default exception handler以处理任何未捕获的异常。在生产系统上,您应该注册一个默认的异常处理程序,该处理程序显示一个通用的500页,并且显示错误详细信息,并在其他地方记录完整的回溯以进行调试。

答案 2 :(得分:1)

如果发生错误 ,则最终 。无论您运行的环境如何,您都需要处理PDO查询可能产生的任何潜在错误。做出假设(正如你发布的帖子中的那些人那样),因为这是一个生产系统,try..catch是不必要的是愚蠢的,恕我直言。错误不仅在您调试代码时被抛出,而且还可能在生产系统上发生。就个人而言,我喜欢在我的日志中看到错误的上下文,所以我确实在查询中使用了try..catch。

这也与您最终呈现给用户的错误无关。我发现在这种情况下使用安全这个词会使事情模糊不清。无论您如何处理错误(这不是特定于PDO),您的系统都不应向用户显示含义错误的错误消息(可能包含敏感数据)。

有几种方法可以解决这个问题:

  1. 创建一个函数,通过传递已包含所有内容的预准备语句为您执行PDO查询。
  2. 创建一个全局异常处理程序并捕获那里的任何异常(我不喜欢这种方法,因为你最终失去了上下文...如果它被某个全局处理程序捕获,我会向用户显示什么错误?你如何回溯如果在一些全球范围内被捕获,会出现这样的错误吗?)。
  3. Initialize PDO不要抛出异常并进行手动错误检查,如果这是你的毒药。就个人而言,我发现异常与基于OOP的系统更好地融合,但对于他自己的系统。
  4. 我的2c。