2

我将如何获取 PDO 语句以生成安全的错误消息?我不希望用户看到错误消息。我希望他们被引导到一个页面,该页面显示一条干净的消息,“哎呀,发生了意外的事情!”。我还想在数据库中记录错误以查看和捕获其他人正在生成的错误。

我正在使用 PHP 和 MySQL。

我发现当您建立连接时,您可以像这样设置错误处理。

$dbh = new PDO($dsn, $user, $password);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

以前有人做过这样的事情吗?

4

3 回答 3

2

所以这只是一个建议,因为我从未尝试过,但经过一番思考后,我认为这将是一个有趣的探索选择。由于我对 PHP 和 PDO 还很陌生,我相信还有其他更好的方法。

也许您可以尝试使用tryPHP 的函数,然后代替回显(如果失败) PDOException,您可以运行另一个将其打印到文本文件的函数。就像是。

<?php
try {
    $dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
    foreach($dbh->query('SELECT * from FOO') as $row) {
        print_r($row);
    }
    $dbh = null;
} catch (PDOException $e) {
    $strFileName = 'whatever.txt';

    if(!is_writable($strFileName))
        die('Change permisions to ' . $strFileName);

    $handle = fopen($strFileName, 'a+');

    fwrite($handle, "\r" . $e->getMessage() . "\r");
    fclose($handle);
}
?> 

这样你可以避免数据库连接(我猜这是问题),但仍然保存错误。您可能希望在 if 语句中的 die 之后省略回显的文本。

于 2013-05-08T18:22:56.840 回答
1

我认为将日志写入文件而不是数据库会更好。特别是因为您想记录 PDO 错误,这表明您的数据库连接有问题。

您可以通过捕获错误向用户显示一个漂亮的错误页面。然后,您可以将用户重定向到错误页面,以防出现问题。

于 2013-05-08T18:00:53.863 回答
1

您必须了解 PDO 不会生成“安全”或“不安全”错误消息。它确实会生成一条错误消息。就这样。剩下的就是全站 PHP 设置的责任。

PDO 不是唯一的错误来源。为什么只关心 PDO 错误?为什么不以同样的方式处理所有错误?

想要记录错误?这是一个 PHP ini 设置的问题。想要不显示错误?这是一个 PHP ini 设置的问题。想要显示通用错误页面?这是一个简单的函数,可以一次处理所有错误。

一切都可以正确而直接地完成,而无需将每个语句都包装到 try catch 中。无需手动写入日志。甚至没有额外的一行代码。

您需要设置 PHP 错误处理,而不是 PDO。

当然,尝试将数据库错误存储在您现在失败的同一个数据库中是绝对没有意义的。错误必须进入实时服务器和屏幕上的错误日志 - 在本地开发 PC 上。

以前有人做过这样的事情吗?

当然。世界上 1000000 个站点中的每一个。方式如上。

于 2013-05-08T20:43:32.717 回答