Intereting Posts
Как «развить» процесс преобразования видео в фон, в php? Поток разделяет XML-файл на 4 ГБ в PHP Работает ли foreach () для нечисловых ключей массива? Zend Framework 2 отображает представление в представлении Какой механизм баз данных MySQL лучше хранить для сеансов и данных сеанса: MyISAM или InnoDB? Подтвердите введенный пользователем код PHP, прежде чем передавать его в eval () PHP – Как вы находите дубликаты групп значений в массиве Как установить код ошибки Apache HTTP 503 вместо HTTP 500 при ошибке PHP Ответ XML от страницы asp Параметр PHP mail () -f НЕ работает Использовать $ http angularjs Обратный вызов правильно с php? PHP eval () можно использовать в моем коде? (динамические аргументы) Произвольное число полей FORM, готовых для базы данных Выполнить сценарий оболочки в фоновом режиме, пока страница отображается на экране пользователю в php Как получить идентификатор строки таблицы html

Подавление предупреждений PDO

Я пытаюсь показать статус сервера, основываясь на том, можно ли подключить базу данных или нет. Со старой школой mysql_connect() и mysqli_connect() это было просто. Я стараюсь оставаться современным, поэтому я использую PDO, но я не могу понять, как подавить предупреждение по умолчанию. Из того, что я могу сказать, вам нужно использовать функцию getMessage() чтобы она печатала предупреждение PDO, но я не использую его.

Вот мой код:

 8 $dbstatus = 1; 9 try { 10 $db = new PDO($dbms . ':host=' . $dbhost . ';port=' . $dbport . ';dbname=' . $dbname, $dbuser, $dbpasswd); 11 $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 12 } catch(PDOException $e) { 13 $dbstatus = 0; 14 } 15 if($dbstatus == 1) { 16 echo '<span style="color: green">DB Up</span>'; 17 } else { 18 echo '<span style="color: red">DB Down</span>'; 19 exit; 20 } 

Все переменные соединения поставляются и исправляются, за исключением $dbhost , который намеренно нарушен, чтобы проверить это. Теперь он дает желаемые результаты, но также выводит также предупреждающее сообщение:

Предупреждение : PDO :: __ construct (): php_network_getaddresses: getaddrinfo не удалось: такой хост не известен. в C: \ xampp \ htdocs \ cd \ includes \ dbconnect.php в строке 10

Если я $dbhost переменную $dbhost , она работает нормально, поэтому я знаю, что проблема заключается не в том, что инструкция PDO используется.

Любые идеи о том, что мне не хватает?

Решение

Я использовал вариант того, что было дано jeroen:

 if(filter_var(gethostbyname($dbhost), FILTER_VALIDATE_IP)) { $dbstatus = 1; try { $db = new PDO($dbms . ':host=' . $dbhost . ';port=' . $dbport . ';dbname=' . $dbname, $dbuser, $dbpasswd, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)); } catch(PDOException $e) { $dbstatus = 0; } } else { $dbstatus = 0; } if($dbstatus == 1) { echo '<span style="color: green">DB Up</span>'; } else { echo '<span style="color: red">DB Down</span>'; exit; } 

Спасибо за помощь, и я надеюсь, что это поможет кому-то еще! ^^

    Единственное, что я вижу здесь, это то, что вы указываете PDO бросать исключения после того, как вы попытались открыть соединение. Скорее всего, это слишком поздно.

    Вместо этого вы можете отправить эту конструкцию прямо с помощью 4-го параметра:

     try { $opts = array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION); $db = new PDO($dbms . ':host=' . $dbhost . ';port=' . $dbport . ';dbname=' . $dbname, $dbuser, $dbpasswd, $opts); } catch(PDOException $e) { ... 

    Это, вероятно, решит вашу проблему.

    Изменить: если имя хоста предоставлено пользователем, вы можете проверить его перед отправкой его в конструктор PDO.

    Например, используя:

     if (filter_var(gethostbyname($user_provided_host_name), FILTER_VALIDATE_IP)) { // valid hostname / ip address } 

    Это будет работать для доменных имен, адресов localhost и ip.