【发布时间】:2015-12-02 00:11:28
【问题描述】:
问题:
寻找使用 PDO 处理错误的最佳实践。我在网站、SO、书籍等上找到的选项。
- 很多网站说您应该在
catch块中回显错误消息。 - SO 上的大量用户表示,出于安全风险,您永远不应回显错误消息。
- 其他人建议将其记录到文档根目录之外的日志文件中。
- 有些使用错误处理将其记录到 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 中处理错误的最佳做法是什么?
【问题讨论】:
标签: php mysql pdo error-handling database-connection