PHP PDO как сделать чтобы выполнение скрипта не прекратилось после ошибки если сервер базы данных не работает?

Пишу API которое возвращает JSON. И мне нужно чтобы это API всегда возвращало результат не зависимо ответил ли сервер БД, потому что часть информации хранится в сессии и других файлах, и если сервер БД не доступен то будет просто флаг в возвращённом JSON. Конфигурация софта: PHP 7.3, mariadb 10.3.24, CentOs 7 x64 У меня же происходит следующее:

self::$pdo = new PDO(("mysql:host=" . self::$mysqlhost . ";dbname=" . self::$mysqldb),self::$mysqluser,self::$mysqlpassword,array(PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING,PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'UTF8'"));

Если остановить сервер mariadb то появляется такая ошибка:

Fatal error: Uncaught PDOException: SQLSTATE[HY000] [2002] No such file or directory in /var/www/sitename/dir/scriptname.php:28 
Stack trace: 
    #0 /var/www/sitaname/dir/scriptname.php(28): PDO->__construct('mysql:host=loca...', 'user', 'password', Array)
    #1 /var/www/sitename/dir/scriptname.php(43): myPDO::init()
    #2 /var/www/sitaname/dir/scriptname.php(104): myPDO::get()
    #3 {main} thrown in /var/www/sitename/dir/scriptname.php on line 28

Это при расширенном выводе ошибок

ini_set('error_reporting',E_ALL);
ini_set('display_errors',1);
ini_set('display_startup_errors',1);

Причём при расширенном выводе ошибок, указанный текст ошибки появляется не зависимо обернул ли я строчку с установкой соединения с базой через PDO в try catch или нет. И даже если я помещаю в catch строчку echo "Ошибка при установке соединения с базой данных"; всё равно эта строчка не появляется. То есть выполнение скрипта почему-то прекращается сразу после установки соединения выводом указанной ошибки.

В поисковиках была информация о том что нужно использовать режим исключений PDO - PDO::ERRMODE_WARNING, как Вы можете видеть из кода я его установил. Написано что при таком режиме доступна информация по ошибке, но работа скрипта не должна прерваться, но в описанном случаи она всё равно почему-то прерывается и блок catch всё равно не выполняется.

Как просто отловить ситуацию о отсутствии соединения с базой без прерывания работы скрипта?

Добавляю блок try - catch по просьбе в комментариях:

  public static function init() {
    if (self::$pdo === false) {
      try {
        self::$pdo = new PDO(("mysql:host=" . self::$mysqlhost . ";dbname=" . self::$mysqldb),self::$mysqluser,self::$mysqlpassword,array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'UTF8'"));//ещё вот это в массив пробовал PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING
        return true;
      } catch(PDOExeception $e) {
        echo "Не удалось соединиться с базой данных";
        return false;
      }
    }
    return false;
  }

Опечатка в слове PDOExeception в коде выше оставлена умышленно. Если кто будет использовать код, обязательно исправьте ошибку!


Ответы (1 шт):

Автор решения: Ein

Очепятка в исключении. У вас "PDOExeception", а нужно: "PDOException"

→ Ссылка