Php 抑制PDO警告
我试图根据数据库是否可以连接显示服务器状态。有了老式的mysql_connect和mysqli_connect,一切都很简单。我试图保持现代感,所以我使用PDO,但我不知道如何抑制默认警告。据我所知,您需要使用getMessage函数来打印PDO警告,但我没有使用它 这是我的密码:Php 抑制PDO警告,php,mysql,pdo,exception-handling,suppress-warnings,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=' .
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 }
谢谢你的帮助,我希望这对其他人有帮助^^ 我在这里看到的唯一一件事是,您告诉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
}
这适用于域名、本地主机和ip地址。更改属性声明并没有阻止加载警告。@AoN奇怪的是,我没有完全测试相同的内容,但我使用google.com的ip地址在这里遇到了异常…:我想我知道它有什么问题了。我通过在地址中间添加一个空间来破坏连接,并且它产生了错误。当我输入正确的域名google.com或IP地址时,它不会产生警告。使用输入错误的localhost或IP会发出警告。这对于一个技术人员来说是很好的,但对于一个只想知道数据库是否正常的用户来说就不那么好了。你知道怎么补偿吗?我在$dbhost变量上尝试了rawurlencode,但对警告没有任何作用:S@AoN为了避免可能出现的问题,您可以验证主机名,请参阅我的编辑。在if语句中包装try-catch时,错误仍然没有更改。在返回json的ajax调用中,警告似乎不可捕获,这使得我最后两天的工作毫无用处。这太糟糕了
if (filter_var(gethostbyname($user_provided_host_name), FILTER_VALIDATE_IP)) {
// valid hostname / ip address
}