Тест соединения PDO - PullRequest
       10

Тест соединения PDO

31 голосов
/ 07 июня 2011

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

Возможно ли это с помощью PDO для проверки действительных и недействительных соединений с базой данных?

У меня есть следующий код:

try{
            $dbh = new pdo('mysql:host=127.0.0.1:3308;dbname=axpdb','admin','1234');
            die(json_encode(array('outcome' => true)));
        }catch(PDOException $ex){
            die(json_encode(array(
                'outcome' => false,
                'message' => 'Unable to connect'
            )));
        }

Проблема, с которой я столкнулся, заключается в том, что сценарий пытается подключиться, пока не истечет 60-секундное время выполнения сценария, вместо того, чтобы сказать, что он не может подключиться к БД.

Спасибо

Ответы [ 4 ]

43 голосов
/ 07 июня 2011

необходимо установить режим ошибки при подключении к базе данных:

try{
    $dbh = new pdo( 'mysql:host=127.0.0.1:3308;dbname=axpdb',
                    'admin',
                    '1234',
                    array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
    die(json_encode(array('outcome' => true)));
}
catch(PDOException $ex){
    die(json_encode(array('outcome' => false, 'message' => 'Unable to connect')));
}

для получения дополнительной информации см. Следующие ссылки:

Использование MySQL с PDO

Ошибки и обработка ошибок

10 голосов
/ 07 июня 2011

Как уже упоминал @Sascha Galley, вы должны установить режим ошибки в режим исключения. Однако вам также следует установить атрибут PDO::ATTR_TIMEOUT, чтобы в некоторых случаях долгое время не получалось ожидать ответа.

Хотя в документации сказано, что поведение этого атрибута зависит от драйвера, в случае MySQL это время ожидания соединения. Вы не найдете ничего об этом документации , но вот небольшой фрагмент из исходного кода драйвера:

long connect_timeout = pdo_attr_lval(driver_options, PDO_ATTR_TIMEOUT, 30 TSRMLS_CC);
2 голосов
/ 25 апреля 2014

Как видно, например, в комментариях на этот ответ (но вряд ли где-либо еще, поэтому я сделал его более заметным здесь), "классическое" PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION решение не всегда работает .

Реализация PDO::ERRMODE_EXCEPTION не работает , поэтому в некоторых случаях она выглядит "протекающей".

Например:

Предупреждение: PDO :: __ construct () [pdo .-- construct]: [2002] Не удалось установить соединение, поскольку целевой компьютер активно отказал ему.(пытается подключиться через tcp: // localhost: 3306) в [...] db.php on line 34

Код там:

try {
    $this->pdo = new PDO($cfg['DB'], $cfg['DB_USER'], $cfg['DB_PASS'],
        array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
} catch {
    echo("Can't open the database.");
}

Исключение выброшено (и я вижу, что вижу свое сообщение).

Итак, в качестве необходимого обходного пути, вынужно также поставить @ (в нашем случае назовем это «оператором подгузника») перед new pdo(...), чтобы фактически сохранить его в чистоте.

1 голос
/ 05 января 2016

Отсутствует закрывающая скобка в конце PDO :: ERRMODE_EXCEPTION.

Должно быть:

$this->pdo = new PDO($cfg['DB'], $cfg['DB_USER'], $cfg['DB_PASS'],
    array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...