Тест соединения 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.
Спасибо
Ответы
Ответ 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));