2013-03-26 16 views
7

Sono stato a guardare questo quasi tutto il giorno .. e non riesco a trovare i valori restituiti da nessuna parte. Qualcuno può dirmi:Quali sono i possibili risultati di PDO :: getAttribute (PDO :: ATTR_CONNECTION_STATUS)

  1. Quali valori restituiscono PDO::getAttribute(PDO::ATTR_CONNECTION_STATUS);?
  2. E 'possibile fare affidamento su suo risultato di determinare se la connessione è ancora vivo? (E alla fine, che cosa potevo utilizzare per controllare se la connessione è ancora vivo?)
+0

La domanda è interessante di per sé ma, in pratica, è probabilmente più semplice avviare la query e acquisire l'eccezione. –

+0

Per la mia implementazione vorrei usare 'isConnected()' e se false attiverà un metodo di connessione. Non voglio sostituire PDO con MySQLi .. solo perché 'mysqli :: ping();'. E solo per curiosità =) –

+0

Sono d'accordo con Álvaro G. Vicario totalmente! MA se ho capito bene gli attributi dipendono dal driver del database quindi suppongo che dipenda da quale database/versione di cui stai parlando. Risposta 1: risposta dal database in caso di successo, se non riuscito NULL. Risposta 2: Direi che dipende da quale driver db ... – bestprogrammerintheworld

risposta

3

Finalmente! si scopre che la funzione mysqli::ping() potrebbe essere implementato all'interno PDO come segue:

class PDOExtended extends PDO { 
    public function __construct($dsn, $user, $pass, $options = array()) 
    { 
     $this->link = parent::__construct($dsn, $user, $pass, $options); 
     $this->link->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION) 
    } 

    // some methods 

    public function isConnected() 
    { 
     try { 
      return (bool) $this->link->query('SELECT 1+1'); 
     } catch (PDOException $e) { 
      return false; 
     } 
    } 

    //some other methods 
} 

MOTIVO:
PDO::query(); rendimenti matrice contenente i risultati falsi o, nel caso attuale non ritornerà nulla, perchè la la connessione è morta e la DOP dovrebbe fare un'eccezione a noi. Ed è quello che ci aspettiamo. Il blocco catch restituirà false e non interromperà l'esecuzione del nostro script. La query utilizzata

SELECT 1 + 1;

restituirà sempre 2 ed è consigliabile fare affidamento sul fatto che è calcolato sul lato DB. Nessuna connessione, nessun risultato! Non è eccessivo, perché è una query molto semplice e la maggior parte dei database (sul normale host condiviso) si trovano su localhost e non ci vorrà più di 0.0000s che non è un grosso problema di prestazioni. Non l'ho ancora provato con le transazioni, ma dovrei fare ancora il trucco.