未捕获的PDOException显示用户名和密码

时间:2014-05-09 17:56:59

标签: php pdo

try {
    self::$dbinstance = new PDO(
        "mysql:host=$c[host];dbname=$c[dbname]", $c['user'], $c['password']
    );

    self::$dbinstance->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e) {
    echo "Errors" . $e->getMessage();
}

在上面的代码中,如果PDO无法连接到主机,则fatal error会显示用户名和密码。

Uncaught exception 'PDOException' with message 'SQLSTATE[HY000] [2003] 
Can't connect to MySQL server on '172.25.102.65' (10060)' in
D:\xampp\htdocs\mytest\wh_client_2.1\classes\importmodule-class.php:33 Stack trace: #0 
D:\xampp\htdocs\mytest\wh_client_2.1\classes\importmodule-class.php(33): PDO- 
>__construct('mysql:host=172....', 'host', 'password') #1

一种可能的方法是在display_error=0中关闭php.ini,但这样我无法知道我的主机没有响应时。

有什么办法可以修改错误信息吗?

4 个答案:

答案 0 :(得分:9)

错误处理和错误报告之间存在差异。

  • 错误处理是阻止最终用户查看任何堆栈跟踪,重要信息或自动生成的错误消息的过程。它还可以使用try catch块修改脚本的运行方式。
  • 错误报告定义了给定脚本将报告哪些信息。

为了正确处理错误,我认为ini_set('display_errors',0);是更好的方法。您不希望屏幕上显示任何错误消息。

但是,我希望获得有关错误的所有可能信息,因此我使用error_reporting(E_ALL);

错误写在一个文件error_log中,它通常与index.php(或任何直接调用的php文件)位于同一级别。您也可以从cpanel访问它。


您的错误可能未被捕获,因为您的代码位于命名空间中,而您希望捕获全局命名空间PDOException。使用\表示您正在寻找全局PDOException的脚本。一旦发现错误,您可以使用PDOException class的常规方法回显所需的内容。

try {
    $db = new PDO (/*connection infos*/);
}
catch (\PDOException $e) {
    switch ($e->errorCode()) {
        case 'HY000':
        // or whatever error you are looking for
        // here it's the general error code
            mail('your@email.com','connection problem',$e->getTraceAsString());
            $db = new PDO (/*rollback connection infos of a local database*/);
            break;
    }
}

这会向您发送一封邮件,其中包含错误的痕迹,阻止您的用户在告诉您错误的同时看到它。

以下是pdo语句返回的错误代码的reference

答案 1 :(得分:6)

当您的主机没有响应时,您就会知道 - 您的主机将停止响应。然后您必须查看错误日志并找到包含特定错误的错误消息。

所以,只需与display_errors=0 保持一致,因为无论如何,必须在生产环境中

答案 2 :(得分:1)

,不要尝试throw异常,因为它会吐出这样的关键信息。请使用一些适当的自定义错误消息处理它们并在您的内部处理这些异常自定义日志记录功能...

你必须做与此类似的事情......

<?php

try {

    $db = new PDO('mysql:host=localhost;dbname=testdb;charset=utf8', 'uname', 'pass');
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    $db->query('bla bla bla bla'); //<---- This will definitely fail !!!!
} catch(PDOException $ex) {
    echo "An Error occured!";
    file_put_contents('somefile.txt',$ex->getMessage(),FILE_APPEND);
}

正如您所看到的,上述查询确实会失败,因此最终用户只会看到发生错误!消息,但错误将记录到您的{{1} }

答案 3 :(得分:-2)

您可以这样做:

<?php
// connect
try
{
    $dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
}
catch (PDOException $e)
{
    $dbh = NULL;
}

// check if connected
if($dbh)
{
    // run queries
}
else
{
    die('Oops! Our server has encountered an error, please try again later');
}
?>