【问题标题】:Is it possible to execute the remaining code if pdo exception is occurred?如果发生 pdo 异常,是否可以执行剩余的代码?
【发布时间】:2021-06-26 17:36:48
【问题描述】:

我有一个 config.php 文件如下:

//file name: config.php -------------
define ("DOMAIN","mydomain.com");
//connection parameters
$host = '127.0.0.1';
$db   = 'test';
$user = 'root';
$pass = '';
$charset = 'utf8mb4';

$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$options = [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_SILENT,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES   => false,
];
try {
    $pdo = new PDO($dsn, $user, $pass, $options);
    echo "Database connected successfully!";
} catch (PDOException $e) {
    throw new PDOException($e->getMessage());
}

现在我在 index.php 中包含了这个文件,如下所示:

//file name: index.php -----------
require_once("../path to/config.php");
echo "WELCOME to <h1 style='display:inline;color:#000080;'>".DOMAIN."</h1>";

如您所见,凭据是假的,它将无法连接到数据库,因此错误消息显示如下:

Fatal error: Uncaught PDOException: SQLSTATE[28000] [1045] Access denied for user 'root'@'localhost' (using password: NO) in /home/hosting_account/path to/config.php:20 Stack trace: #0 /home/hosting_account/public_html/index.php(22): require_once() #1 {main} thrown in /home/hosting_account/path to/config.php on line 20

我在这里删除了实际路径,但提到了路径的布局。一切正常。。错误信息也正常。

但是我想要的是,index.php 的第一行将执行/显示(欢迎来到 mydomain.com),即使包含文件的一部分(这里是连接部分)会有错误。由于定义 DOMAIN 并从 index.php 回显它没有错误,我希望它会显示“欢迎来到 mydomain.com”,然后会显示从 pdo 连接捕获的错误消息。

怎么做?

【问题讨论】:

  • 如果您将throw new PDOException($e-&gt;getMessage()); 替换为其他名称,例如$pdo_error = 1; $message = $pdo-&gt;getMessage(),则可以在欢迎信息后抛出它

标签: php pdo error-handling


【解决方案1】:

您不应该在生产服务器上显示任何错误 - 您应该记录它。如果您没有使用任何框架,您可以简单地将其保存到文件中而不是显示它 - 在 catch 块中完成所有操作。

除了你会再次捕获并抛出相同的异常。

} catch (PDOException $e) {
    throw new PDOException($e->getMessage());
}

请根据您的需要编辑此部分以进行处理。

【讨论】:

    【解决方案2】:
     //file name: config.php -------------
     define ("DOMAIN","mydomain.com");
     //connection parameters
     $host = '127.0.0.1';
     $db   = 'test';
     $user = 'root';
     $pass = '';
     $charset = 'utf8mb4';
    
     $pdo_error = 0;
     $dsn = "mysql:host=$host;dbname=$db;charset=$charset";
     $options = [
         PDO::ATTR_ERRMODE            => PDO::ERRMODE_SILENT,
         PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
         PDO::ATTR_EMULATE_PREPARES   => false,
     ];
     try {
         $pdo = new PDO($dsn, $user, $pass, $options);
         echo "Database connected successfully!";
     } catch (PDOException $e) {
         //throw new PDOException($e->getMessage());
         $pdo_error = 1;
         $error_message = $e->getMessage();
     }
    

    然后

    //file name: index.php -----------
    require_once("../path to/config.php");
    echo "WELCOME to <h1 style='display:inline;color:#000080;'>".DOMAIN."</h1>";
    if($pdo_error){
        throw new PDOException($error_message);
    }
    

    【讨论】:

    • 谢谢你....我已经很好地理解它并且它有效!但是,如果 .htaccess 文件中设置了 php_value display_errors 0,则错误消息不会显示。但是,如果我只使用 echo $error_message,则只有 SQLSTATE[28000] [1045] Access denied for user 'root'@'localhost' (using password: NO) 为 0 或 1 显示 php_value display_error。请解释一下 throw 的作用?
    • 这是因为 display_errors 0 取消了所有错误输出。但是如果你的服务器有一个错误日志,它的输出将被写入这个日志。但是 echo 不是错误输出。即使 display_errors 为 0,也总是显示回显
    猜你喜欢
    • 2020-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-14
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 2019-02-16
    相关资源
    最近更新 更多