Можно ли выполнить оставшийся код, если возникнет исключение pdo?

#php #pdo #error-handling

Вопрос:

У меня есть 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) даже в части (здесь часть подключения) включенного файла будет ошибка. Поскольку нет ошибки в определении ДОМЕНА и повторении его из index.php, Я хочу, чтобы он показал «Добро пожаловать в mydomain.com» и затем отобразится сообщение об ошибке, полученное при подключении pdo.

Как это сделать?

Комментарии:

1. Если вы замените throw new PDOException($e->getMessage()); его на какой-то другой, например $pdo_error = 1; $message = $pdo->getMessage() , чем вы можете бросить его после приветственного сообщения

Ответ №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);
}
 

Комментарии:

1. Спасибо…. Я хорошо это понял, и это работает! Но сообщение об ошибке не отображается, если в файле .htaccess установлено значение php_value display_errors 0. Но если я использую только echo $error_message, только SQLSTATE[28000] [1045] Доступ запрещен для пользователя «root» @ «localhost» (с использованием пароля: НЕТ) отображается как для 0, так и для 1 для php_value display_error. Не могли бы вы объяснить, пожалуйста, функцию броска здесь?

2. Это происходит потому, что display_errors 0 отменил весь вывод ошибок. Но если на вашем сервере есть журнал ошибок, его выходные данные будут записаны в этот журнал. Но эхо-это не вывод ошибок. И эхо отображается всегда, даже если display_errors равно 0