2014-10-23 7 views
5

Ich versuche, einen Serverstatus anzuzeigen, basierend darauf, ob die Datenbank verbunden werden kann oder nicht. Mit der alten Schule mysql_connect() und mysqli_connect() war es einfach. Ich versuche, modern zu bleiben, also verwende ich PDO, aber ich kann nicht herausfinden, wie man die Standardwarnung unterdrückt. Von dem, was ich sagen kann, müssen Sie die getMessage() Funktion dafür verwenden, um die PDO Warnung zu drucken, aber ich benutze es nicht.Unterdrücken von PDO-Warnungen

Hier ist mein Code:

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 } 

Alle Anschlussgrößen werden geliefert und richtig, mit Ausnahme der $dbhost, die dies zu testen absichtlich gebrochen wird. Nun erzeugt er die gewünschten Ergebnisse, ist aber auch eine Warnmeldung zu:

Warnung: PDO :: __ construct(): php_network_getaddresses: getaddrinfo failed: No such Host bekannt ist. in C: \ xampp \ htdocs \ cd \ enthält \ dbconnect.php on line

Wenn ich die $dbhost Variable korrigieren, es funktioniert gut, so dass ich weiß, dass das Problem nicht mit dem PDO Aussage ist verwendbar.

Irgendwelche Ideen zu was ich vermisse?

Lösung

benutzte ich eine Variation dessen, was von Jeroen geliefert wurde:

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; 
} 

Danke für die Hilfe, und ich hoffe, dass dies jemand anderes hilft! ^^

+0

In einem AJAX-Aufruf, der einen JSON zurückgibt, ist die Warnung (scheint nicht zu greifen), meine zwei letzten Arbeitstage nutzlos zu machen. Das saugt –

Antwort

2

Das einzige, was ich hier sehen kann, ist, dass Sie PDO sagen, Ausnahmen nach zu werfen, die Sie versucht haben, die Verbindung zu öffnen. Das ist höchstwahrscheinlich zu spät.

Was könnten Sie stattdessen tun, ist diese Option an den Konstruktor senden direkt auf den vierten Parameter verwendet:

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) { 
... 

Das wird wahrscheinlich Ihr Problem lösen.

Bearbeiten: Wenn der Host-Name vom Benutzer bereitgestellt wird, können Sie es überprüfen, bevor Sie es an den PDO-Konstruktor senden.

Zum Beispiel mit:

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

Der für Domain-Namen arbeiten, localhost und IP-Adressen.

+0

Das Ändern der Attributdeklaration verhinderte das Laden der Warnung nicht. –

+0

@AoN Seltsam, ich habe nicht genau das gleiche getestet, aber ich bekomme Ausnahmen hier (mit der IP-Adresse von google.com ...): http://codepad.viper-7.com/dLZi8R – jeroen

+0

Ich denke, ich sehe wo es Probleme hat. Ich breche die Verbindung auf, indem ich ein Leerzeichen in der Mitte der Adresse hinzufüge, und daraus ergibt sich der Fehler.Wenn ich eine richtige Domain (google.com) oder IP-Adresse einfüge, wird die Warnung nicht ausgegeben. Die Verwendung eines falsch eingegebenen "localhost" oder IP gibt die Warnung aus. Es ist großartig für eine Technik, aber nicht so sehr für einen Benutzer, der nur wissen möchte, ob die DB läuft. Wissen Sie trotzdem, um das auszugleichen? Ich habe 'rawurlencode()' auf der Variablen '$ dbhost' versucht, aber das hat nichts für die Warnung getan. : S –