Подтвердить что ты не робот

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

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

Возможно ли использование 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'
            )));
        }

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

Спасибо

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

long connect_timeout = pdo_attr_lval(driver_options, PDO_ATTR_TIMEOUT, 30 TSRMLS_CC);

Ответ 3

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

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

Например:

Предупреждение: PDO:: __ construct() [pdo.-- construct]: [2002] Соединение не может быть выполнено, потому что целевая машина активно отказалась Это. (попытка подключения через tcp://localhost: 3306) в [...] db.php в строке 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(...) на самом деле держать его в чистоте.

Ответ 4

В конце PDO:: ERRMODE_EXCEPTION отсутствует отсутствующее закрывающее parenthese.

Должно быть:

$this->pdo = new PDO($cfg['DB'], $cfg['DB_USER'], $cfg['DB_PASS'],
    array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));