抑制PDO警告

Chr*_*ndt 5 php mysql pdo exception-handling suppress-warnings

我正在尝试根据数据库是否可以连接来显示服务器状态.有了旧学校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 }
Run Code Online (Sandbox Code Playgroud)

提供的所有连接变量都是正确的,除了$dbhost故意破坏以测试它.现在,它会产生所需的结果,但也会打印一条警告消息:

警告:PDO :: __ construct():php_network_getaddresses:getaddrinfo failed:没有这样的主机.在第10行的C:\ xampp\htdocs\cd\includes\dbconnect.php中

如果我更正了$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;
}
Run Code Online (Sandbox Code Playgroud)

感谢您的帮助,我希望这有助于其他人!^^

jer*_*oen 2

我在这里唯一能看到的是,您告诉 PDO在尝试打开连接后抛出异常。这很可能为时已晚。

您可以做的是,使用第四个参数直接将该选项发送给构造函数:

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) {
...
Run Code Online (Sandbox Code Playgroud)

这可能会解决你的问题。

编辑:如果主机名由用户提供,您可以在将其发送到 PDO 构造函数之前对其进行验证。

例如使用:

if (filter_var(gethostbyname($user_provided_host_name), FILTER_VALIDATE_IP)) {
  // valid hostname / ip address
}
Run Code Online (Sandbox Code Playgroud)

这适用于域名localhost和 IP 地址。