gpt4 book ai didi

php - 使用 PDO 进行错误处理的最佳实践

转载 作者:可可西里 更新时间:2023-11-01 07:08:03 26 4
gpt4 key购买 nike

问题:

寻找使用 PDO 进行错误处理的最佳实践。我在网站、SO、书籍等上找到的选项。

  1. 很多网站都说您应该在 catch block 中回显您的错误消息。
  2. SO 上的大量用户表示,由于存在安全风险,您永远不应回显错误消息。
  3. 其他人建议将其记录到文档根目录之外的日志文件中。
  4. 有些使用错误处理将其记录到 SQL 表中。

有了众多选项,您很容易陷入应该使用的选项之中。当然,您可以使用 MVC 框架并让它为您处理错误日志记录,但如果您不使用 MVC,它会是什么样子。

据我所知,错误处理在开发环境中应该如下所示:

display_errors = On
display_startup_errors = On
error_reporting = -1
log_errors = On

或者如果无法访问 php.ini 文件:

error_reporting(-1);
ini_set("display_errors", 1);

生产环境中:

display_errors = Off
display_startup_errors = Off
error_reporting = E_ALL
log_errors = On

或者如果无法访问 php.ini 文件:

error_reporting(0);

生产环境中的数据库连接为例。

代码:

<?php
// Error handling
error_reporting(0);

// Get credentials from outside document root
require_once('../settings.php');

// Tests connection to database
try {
$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);
}
// Catches errors raised by PDO
catch (PDOException $e) {
// Prints error messages to file
file_put_contents('/home/ubuntu/errors.log', 'Error: ' . $e->getMessage() . PHP_EOL, FILE_APPEND);
// Shows generic error message to user
header('Location: 404.php');
exit;
}
?>

问题:

  • 在 PHP 中一般处理错误的最佳做法是什么?
  • 在 catch block 中处理错误的最佳做法是什么?

最佳答案

这是一个很好的问题,但一开始就有一个错误的前提:您正在将 PDO 的错误报告与站点范围的错误报告分开。这毫无意义:PDO 错误在各个方面都与其他错误相同——文件系统错误、HTTP 错误等等。因此,没有理由建立 PDO-only 错误报告。您所需要做的就是正确设置站点范围的错误报告。

还有一个关于 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?

你已经展示过了:在开发中展示并在生产中登录。所有这些都通过几个简单的配置选项在整个站点范围内进行控制。

What is the best practice for handling errors in the catch-block?

根本不要使用 try-catch block 来报告错误。您不会为应用程序中的每个查询编写带有友好错误消息的 catch block strong>,正如其他答案中所建议的那样,是吗?

因此你的代码必须是

<?php
// 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 非常不利)。

要创建自定义错误页面,您必须使用网络服务器功能(首选)或 PHP 脚本中的错误处理程序。

当遇到 fatal error 时(未捕获的异常就是其中之一),PHP 不会以 200 OK HTTP 状态而是以 5xx 状态进行响应。每个网络服务器都可以捕获此状态并显示相应的错误页面。例如。对于 Apache,它将是

ErrorDocument 503 server_error.html

在这里你可以写任何你想要的借口。

或者您可以在 PHP 中设置一个自定义错误处理程序,它也可以处理所有 PHP 错误,一个例子可以在我写的关于这个问题的文章中看到:The (im)proper use of try..catch.

关于php - 使用 PDO 进行错误处理的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32421702/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com