PDO улавливает ошибку PDOException

#php #mysql #class #pdo

#php #mysql #класс #pdo

Вопрос:

Это отлично работает, если соединение действительно, но, похоже, PDOException на самом деле не работает, если соединение не удается. Перехват полностью не выполняется. Если это не удается, это прерывает выполнение этой строки $this->dbh = new PDO("$db_driver:host=$db_host;dbname=$db_name", $db_user, $db_pass); . Поэтому я не могу получить PDOException в блоке catch. Как мне заставить это работать?

 <?php

namespace appHelpers;

use PDO;

/**
* Core class which exists only once through the application
*
*/
class Core
{
public $dbh; // handle of the db connexion
private static $instance;

// constructor to create a MySQLi instance (="MySQL Improved Extension")
private function __construct()
{

    $db_host = ConfigHelper::read('db.host');
    $db_name = ConfigHelper::read('db.basename');
    $db_user = ConfigHelper::read('db.user');
    $db_pass = ConfigHelper::read('db.password');
    $db_driver = ConfigHelper::read('db.driver');
    try {
        $this->dbh = new PDO("$db_driver:host=$db_host;dbname=$db_name", $db_user, $db_pass);
    } catch (PDOException $pdoex) {
        exit("Database connection failed: " . $pdoex->getMessage());
        return false;
    }

}
/**
 * get instance of Core object
 *
 * @return Object self
 */
public static function getInstance()
{
    if (!isset(self::$instance)) {
        $object = __CLASS__;
        self::$instance = new $object;
    }
    return self::$instance;
}

}
  

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

1. echo "$db_driver:host=$db_host;dbname=$db_name" ; chk

2. Вам нужно вернуть ошибку. Помните, что класс — это шаблон (или схема, если хотите). Он ничего не делает сам по себе. Он должен быть создан.

3. @devpro его показать, mysql:host=localhost;dbname=xxxxxxx

4. @icecub но это не печать Database connection failed: blah blah....

5. вы не вводите правильные значения?

Ответ №1:

Это проблема с пространством имен.

Находясь в пространстве имен, вы должны обращаться к каждому имени класса корневого уровня, добавляя к нему обратную косую черту.

Но вы этого не сделали.

Но хуже всего то, что вы вообще не должны улавливать исключение PDOException. Просто оставьте его в покое и позвольте ему сообщать обработчику отчетов для всего сайта

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

1. Разве об этом не use PDO; позаботится?

2. @jeroen, на самом деле нет пространства имен PDO. Таким PDOPDOException образом, нет ни

3. Имеет смысл, но как это может new PDO работать, кроме как при действительном соединении? Я бы подумал, что это тоже не должно работать.

4. @jeroen меня это тоже удивило, но я полагаю, что use это может относиться как к классу, так и к пространству имен. Итак, добавление use PDOException тоже должно было сработать

5. @jeroen кстати, однажды я узнал здесь, на SO, от Джека, что конструктор pdo всегда будет генерировать исключение при ошибке, и на это не влияет настройка режима ошибки