Тест соединения 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' ))); } 

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

благодаря

Solutions Collecting From Web of "Тест соединения PDO"

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

 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

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

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

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

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

Как видно, например, в комментариях к этому ответу (но вряд ли где-либо еще, поэтому я сделал его более заметным здесь), решение «классический» 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(...) чтобы на самом деле сохранить его в чистоте.

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

Должно быть:

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