Подавление предупреждений 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 \ включает \ dbconnect.php онлайн 10

Если я исправлю $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;
}

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

5

Решение

Единственное, что я вижу здесь, это то, что вы говорите 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-адреса.

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector