这是一个非常好的问题,但是一开始就有一个错误的前提:您正在为PDO分离错误报告,这些报告与站点范围的错误报告分开.这没什么意义:每种方式的PDO错误都与其他错误相同 – 文件系统错误,HTTP错误等等.因此,没有理由建立仅PDO错误报告.您所需要的只是正确设置站点范围的错误报告.
关于php.ini不可访问性还有一个错误的假设:您始终可以使用ini_set()函数设置任何配置指令.因此,将error_reporting设置为灾难性级别0并不是一个单一的原因.
要回答你剩下的问题,你需要的只是一点常识.
A great number of websites say you should echo your error messages in your catch block.
A large number of users on SO say that you should never echo error messages due to security risks.
你觉得自己怎么样?向用户显示系统错误消息是否有用?对恶意用户显示系统内部是否有用?
Others are recommending logging it to a log file outside the document root.
你有什么异议吗?
Some use error handling to log it to a SQL table.
您是否认为将数据库错误记录到数据库中这是一个相当矛盾的想法?
What is the best practice for handling errors in general in PHP?
您已经显示它:在开发中显示并登录prod.所有这些都通过几个简单的配置选项在站点范围内进
What is the best practice for handling errors in the catch-block?
根本不要使用try-catch块进行错误报告.对于应用中的每个查询,您不会为友好的错误消息编写一个catch块,因为在另一个答案中建议,是吗?
因此你的代码必须是
// Error handling
error_reporting(-1);
ini_set('display_errors',0);
ini_set('log_errors',1);
// Get credentials from outside document root
require_once('../settings.php');
// Tests connection to database
$dbh = new PDO(
sprintf(
'mysql:host=%s;dbname=%s;port=%s;charset=%s',
$settings['host'],
$settings['name'],
$settings['port'],
$settings['charset']
),
$settings['username'],
$settings['password']
);
// Prevents emulated prepares and activates error handling
// PDO::ERRMODE_EXCEPTION
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
现在回答你在评论中提出的问题.
自定义错误屏幕是一个非常不同的问题,你的代码特别糟糕.既不应该是404错误也不应该使用HTTP重定向(这对SEO来说非常糟糕).
要创建自定义错误页面,您必须使用Web服务器功能(首选)或PHP脚本中的错误处理程序.
当遇到致命错误(并且未捕获的异常为1)时,PHP不响应200 OK HTTP状态但具有5xx状态.每个Web服务器都可以捕获此状态并显示相应的错误页面.例如.对于Apache来说就是这样
ErrorDocument 503 server_error.html
在哪里你可以写任何你想要的借口.
或者您可以在PHP中设置一个自定义错误处理程序,它也可以处理所有PHP错误,在我写的关于此事的文章中可以看到一个例子:The (im)proper use of try..catch.