2014-04-23 10 views
6

Sto usando MySQL PDO per gestire l'interrogazione del database e tutto. Ma la maggior parte delle volte, la connessione MySQL è andata via. Quindi sto cercando nel PDO che verificherà se la connessione db esiste o no e se non è uscita, allora ho bisogno di connettere il database per continuare l'esecuzione della query.Come faccio a pingare il db MySQL e riconnettersi usando PDO

Sono nuovo per il pdo MySQL e non so come gestire questa situazione. Sarebbe meglio se qualcuno lo suggerisse.

+1

Puoi mostrare il tuo tentativo? – Rogue

+0

perché non usare 'mysqli_ping()', se è falso allora prova a riconnettere – user1978142

+2

@ user1978142 come fa mysqli_ping() help quando usa PDO? – user12345

risposta

-1

È possibile utilizzare in questo modo:

# connect to the database 
try { 
    $DBH = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass); 
    $DBH->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

} 
catch(PDOException $e) { 
    echo "Connection error " . $e->getMessage() . "\n"; 
    exit; 
} 
+0

Le domande chiedono come eseguire il ping e riconnettersi non come rilevare un errore di connessione! – transilvlad

+0

C'è una ragione per cui mysql_ping è ammortizzato. Non è più il modo corretto per farlo. Questo è il modo corretto. Anche se avrebbe dovuto approfondire i dettagli – steve

+0

mysql_ping è controllare la connessione mentre l'esecuzione dello script, non solo dopo aver effettuato la connessione, in questo modo è completamente apprezzata. –

6

ho cercato di trovare una soluzione per lo stesso problema e ho trovato la risposta successiva:

class NPDO { 
    private $pdo; 
    private $params; 

    public function __construct() { 
     $this->params = func_get_args(); 
     $this->init(); 
    } 

    public function __call($name, array $args) { 
     return call_user_func_array(array($this->pdo, $name), $args); 
    } 

    // The ping() will try to reconnect once if connection lost. 
    public function ping() { 
     try { 
      $this->pdo->query('SELECT 1'); 
     } catch (PDOException $e) { 
      $this->init();   // Don't catch exception here, so that re-connect fail will throw exception 
     } 

     return true; 
    } 

    private function init() { 
     $class = new ReflectionClass('PDO'); 
     $this->pdo = $class->newInstanceArgs($this->params); 
    } 
} 

completa storia qui: https://terenceyim.wordpress.com/2009/01/09/adding-ping-function-to-pdo/


Qualcun altro stava pensando di utilizzare PDO: ATTR_CONNECTION_STATUS, ma ha capito che: "$db->getAttribute(PDO::ATTR_CONNECTION_STATUS) continua a rispondere" Localhost tramite socket UNIX "anche dopo aver interrotto mysqld".

+1

Apparentemente "DO 1;" è leggermente più corto di SELECT 1 (nel trasferimento di rete, così come nei tempi di risposta) ... non ho ancora provato questo .. ma volevo solo condividere come alternativa ... – RVN

+0

Immagino che "DO 1" sia il metodo migliore per questo processo, eccetto se la funzione dovrebbe verificare che il server risponda veramente (ma siamo su un livello troppo alto per questo) – John

+0

Se stai usando PHP 5.6+, sarebbe meglio decomprimere i tuoi argomenti usando riflessione, come spiegato qui: http://php.net/manual/en/migration56.new-features.php#migration56.new-features.splat $ this-> pdo = new \ PDO (... $ this -> params); – bradynpoulsen

Problemi correlati