我试图根据数据库是否可以连接来显示服务器状态。使用旧学校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 failed:没有这样的主机。在 C:\ xampp \ htdocs \ cd \ includes \ 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;
}
感谢您的帮助,我希望这有助于其他人! ^^
答案 0 :(得分:2)
我在这里唯一能看到的是,在尝试打开连接后,告诉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地址。