#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