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.
fonte
2013-03-26 17:44:51
La domanda è interessante di per sé ma, in pratica, è probabilmente più semplice avviare la query e acquisire l'eccezione. –
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à =) –
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