如何获取PDO语句以生成安全错误消息?我不希望用户看到错误消息。我希望他们能够被定向到一个页面,上面写着一个干净的信息,“哎呀发生意外的事情!”。我还想记录数据库中的错误,以查看并捕获其他人正在生成的错误。
我正在使用PHP和MySQL。
我发现当您建立连接时,可以像这样设置错误处理。
$dbh = new PDO($dsn, $user, $password);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
之前有人做过这样的事吗?
答案 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个站点中的每一个站点。上述方式。