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