PDO致命错误显示用户名和密码

Muh*_*han 1 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();
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,如果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
Run Code Online (Sandbox Code Playgroud)

一种可能的方法是display_error=0关闭,php.ini但这样我无法知道我的主机没有响应时.有什么办法可以修改错误信息吗?

Fél*_*ier 9

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

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

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

但是我希望有关于错误的所有可能的信息,所以我使用error_reporting(E_ALL);.

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


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

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

以下是pdo语句返回的错误代码的参考.

  • 这是一个很好的答案(甚至是优秀的答案),但仅限于实际实施的目的.此外,它错过了有关的问题,即:他的错误是*未被捕获*.如果没有任何工作,那么在错误处理和捕获方面没有任何意义.为了帮助你做到正确,让我用一些可怜的OP正在寻找的东西暗示你:1.*名称空间*.2.可以将跟踪视为*数组*.并手动创建他们想要的任何输出,包括他们想要的任何数据. (2认同)
  • 另外,如果你向OP解释堆栈跟踪的重要性会很好,这在任何比通常的单页意大利面稍微复杂的应用程序中绝对必不可少. (2认同)

You*_*nse 6

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

所以,只保留display_errors=0,因为它是必须在生产环境反正.