2014-10-23 7 views
5

Sto tentando di visualizzare uno stato del server, in base al fatto che il database possa essere collegato o meno. Con la vecchia scuola mysql_connect() e mysqli_connect() è stato facile. Sto cercando di rimanere moderno, quindi sto usando PDO, ma non riesco a capire come sopprimere l'avviso predefinito. Da quello che posso dire, è necessario utilizzare la funzione getMessage() per stampare l'avviso PDO, ma non lo sto utilizzando.Soppressione degli avvisi PDO

Ecco il mio codice:

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 } 

Tutte le variabili di collegamento sono forniti e corretta, ad eccezione del $dbhost, che è intenzionalmente rotto per testare questo. Ora, produce i risultati desiderati, ma è stampa anche un messaggio di avviso troppo:

Attenzione: PDO :: __ construct(): php_network_getaddresses: getaddrinfo fallito: No Host sconosciuto. in C: \ xampp \ htdocs \ cd \ include \ dbconnect.php on line

Se ho corretto la variabile $dbhost, funziona benissimo, quindi so che il problema non è con la DOP dichiarazione essere utilizzabile.

Qualche idea su cosa mi manca?

Soluzione

ho usato una variante di ciò che è stato fornito da 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; 
} 

Grazie per l'aiuto e spero che questo aiuta a qualcun altro! ^^

+0

All'interno di una chiamata ajax che restituisce un avviso l'avviso (sembra essere inaffidabile) sta rendendo inutili i miei ultimi due giorni di lavoro. Questo fa schifo –

risposta

2

L'unica cosa che posso vedere qui è che dici a PDO di generare eccezioni dopo il che hai provato ad aprire la connessione. Probabilmente è troppo tardi.

Che cosa si potrebbe fare, invece, è inviare l'opzione al costruttore direttamente utilizzando il 4 ° parametro:

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

che probabilmente risolvere il problema.

Modifica: Se il nome host viene fornito dall'utente, è possibile convalidarlo prima di inviarlo al costruttore PDO.

Ad esempio, utilizzando:

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

che lavorerà per i nomi di dominio, localhost e indirizzi IP.

+0

La modifica della dichiarazione degli attributi non ha impedito il caricamento dell'avviso. –

+0

@AoN Strano, non ho provato esattamente lo stesso, ma ottengo eccezioni qui (usando l'indirizzo IP di google.com ...): http://codepad.viper-7.com/dLZi8R – jeroen

+0

Penso di vedere dove sta avendo problemi. Sto interrompendo la connessione aggiungendo uno spazio nel mezzo dell'indirizzo e questo sta producendo l'errore.Quando inserisco un dominio appropriato (google.com) o un indirizzo IP, non genera l'avviso. L'utilizzo di un "localhost" errato o IP fornisce l'avviso. È fantastico per un tecnico, ma non tanto per un utente che vuole solo sapere se il DB è attivo. Sapere comunque per compensare questo? Ho provato 'rawurlencode()' sulla variabile '$ dbhost', ma questo non ha fatto nulla per l'avviso. : S –