PDO错误处理和数据库中存储错误

时间:2013-05-08 17:57:26

标签: php mysql pdo

如何获取PDO语句以生成安全错误消息?我不希望用户看到错误消息。我希望他们能够被定向到一个页面,上面写着一个干净的信息,“哎呀发生意外的事情!”。我还想记录数据库中的错误,以查看并捕获其他人正在生成的错误。

我正在使用PHP和MySQL。

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

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

之前有人做过这样的事吗?

3 个答案:

答案 0 :(得分:2)

所以这只是一个建议,因为我从未尝试过这个,但在考虑了一下后,我认为这将是一个有趣的选择。因为我对PHP& PDO我确信还有其他更好的方法。

也许您可以尝试使用PHP的try函数,然后使用PDOException而不是echo'ing(如果失败),您可以运行另一个函数将其打印到文本文件中。像。的东西。

<?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语句中删除之后省略echo'd文本。

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

您必须了解PDO不会生成“安全”或“不安全”错误消息。它确实会生成错误消息。就这样。其余的是站点范围的PHP设置的责任。

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

想要记录错误吗?这是一个PHP ini设置的问题。 想要显示错误吗?这是一个PHP ini设置的问题。 想要显示通用错误页面吗?这是一个简单的功能,可以立即处理所有错误。

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

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

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

  

之前有人做过这样的事吗?

不确定。世界上1000000个站点中的每一个站点。上述方式。