为什么要抑制PHP错误?

3

我想知道为什么你要“抑制”PHP错误。显然,我看到了错误产生的额外警告行的区别,但是抑制它是否有好处?

 Access denied for user 'user'@'localhost' (using password: YES) 

vs

Warning: mysql_connect() [function.mysql-connect]: Access denied for user 'user'@'localhost'       (using password: YES) in (deleted) on line 8
Access denied for user 'user'@'localhost' (using password: YES)

如果是这样,那我在我的PHP程序中的MySQL查询开头是否应该养成输入@的习惯呢?
1个回答

7

您绝对不应该养成忽略错误的习惯。错误存在是有原因的。相反,应该在代码中妥善、防御性地处理它们,并不断完善代码,直到错误消失。

您应该做以下事情:

$conn = mysql_connect($host, $user, $pass);

// Always test to see if your action/connection/whatever was successful
if (!$conn) {
  // something went wrong.  handle the error
  // Display a message for the user, write a message to `error_log()`, whatever's appropriate
}
else mysql_select_db($dbname);

在生产系统中,您不应该显示错误,因为这样会冒着泄露代码和数据库细节的风险。相反,在php.ini中关闭display_errors或在运行时进行关闭:

// In development and production, make sure all errors are reported
error_reporting(E_ALL & E_STRICT);

// In development show all errors on screen so you handle them as they occur
ini_set('display_errors', 1);

// In production turn them off
ini_set('display_errors', 0);

实际上,使用@进行错误抑制是PHP中第二个被投票为不良实践的问题(在这个经典问题中)


+1:一个注意事项:这些错误消息应该对用户进行抑制;广播有关代码内部的信息不是一个好的安全功能。 - Oliver Charlesworth
@Oli Charlesworth 当然可以。我会添加关于 display_errors 的一些内容。 - Michael Berkowski
哦,亲爱的,看来你比我更快地回答了问题。迈克尔,你的回答非常出色。 - Winfield Trail
哇!谢谢你提供这么详细的信息,我学到了很多。不过我还有一些后续问题……但首先,我应该在你的评论区添加它们,还是应该在“回答你的问题”文本框中发布? - Matt
@user672178 如果您有后续问题,请不要将它们作为答案添加。如果只有一个或两个小问题,您可以在评论中提出,但通常最好编辑原始问题并在那里附加它们。 - Michael Berkowski
哦,好的,谢谢你。实际上,在我仔细看了你的答案之后,你已经回答了我的问题。你超出了我的问题范围,帮助我学习了一些关于PHP的知识。再次感谢你! - Matt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接