Я пишу установщик для одного из моих приложений, и я бы хотел проверить некоторые настройки базы данных по умолчанию.
Возможно ли использование 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.
благодаря
вам необходимо установить режим ошибки при подключении к базе данных:
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));