抑制 PDO 警告

Posted

技术标签:

【中文标题】抑制 PDO 警告【英文标题】:Suppressing PDO Warnings 【发布时间】:2014-12-19 10:15:05 【问题描述】:

我正在尝试根据数据库是否可以连接来显示服务器状态。使用老派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.php10

如果我更正了 $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;

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

【问题讨论】:

在返回 json 的 ajax 调用中,警告(似乎无法捕获)使我最后两天的工作毫无用处。这很糟糕 【参考方案1】:

我在这里唯一能看到的是,您告诉 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) 
...

这可能会解决你的问题。

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

例如使用:

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

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

【讨论】:

更改属性声明并不能阻止加载警告。 @AoN 奇怪,我没有测试完全一样,但我在这里得到了异常(使用 google.com 的 ip 地址...):codepad.viper-7.com/dLZi8R 我想我知道它哪里出了问题。我通过在地址中间添加一个空格来断开连接,并且由此产生了错误。当我输入正确的域 (google.com) 或 IP 地址时,它不会产生警告。使用输入错误的“localhost”或 IP 会发出警告。这对于技术人员来说非常棒,但对于只想知道数据库是否已启动的用户来说则不然。反正知道要补偿这个吗?我在$dbhost 变量上尝试了rawurlencode(),但这对警告没有任何作用。 :S @AoN 为避免您可能遇到的问题,您可以验证主机名,请参阅我的编辑。 if 语句中包装try catch 时仍然没有改变错误。

以上是关于抑制 PDO 警告的主要内容,如果未能解决你的问题,请参考以下文章

抑制 R 中的 C 警告消息

抑制 OpenGL 运行时警告

C#:有啥方法可以抑制编译器错误,类似于抑制警告消息?

如何抑制 LLVM 自动合成警告?

如何在 Kotlin 中抑制检查式警告

有没有办法抑制 Xcode 中的警告?