web-dev-qa-db-fra.com

Test de connexion PDO

J'écris un programme d'installation pour l'une de mes applications et j'aimerais pouvoir tester certains paramètres de base de données par défaut.

Est-ce possible d'utiliser PDO pour tester des connexions de base de données valides et invalides?

J'ai le code suivant:

try{
            $dbh = new pdo('mysql:Host=127.0.0.1:3308;dbname=axpdb','admin','1234');
            die(json_encode(array('outcome' => true)));
        }catch(PDOException $ex){
            die(json_encode(array(
                'outcome' => false,
                'message' => 'Unable to connect'
            )));
        }

Le problème que j'ai est que le script essaie de se connecter jusqu'à ce que le temps d'exécution du script de 60 secondes s'épuise au lieu de dire qu'il ne peut pas se connecter à la base de données.

Merci

32
Lee Fenlan

vous devez définir le mode d'erreur lors de la connexion à la base de données:

try{
    $dbh = new pdo( 'mysql:Host=127.0.0.1:3308;dbname=axpdb',
                    'admin',
                    '1234',
                    array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
    die(json_encode(array('outcome' => true)));
}
catch(PDOException $ex){
    die(json_encode(array('outcome' => false, 'message' => 'Unable to connect')));
}

pour plus d'infos voir les liens suivants:

tilisation de MySQL avec PDO

Erreurs et gestion des erreurs

43
Sascha Galley

Comme @Sascha Galley l'a déjà mentionné, vous devez définir le mode d'erreur sur le mode d'exception. Cependant, vous devez également configurer PDO::ATTR_TIMEOUT attribut pour éviter une longue attente de réponse dans certains cas.

Bien que la documentation indique que le comportement de cet attribut dépend du pilote dans le cas de MySQL, il s'agit d'un délai de connexion. Vous ne trouverez rien à ce sujet documentation mais voici un court extrait du code source du pilote:

long connect_timeout = pdo_attr_lval(driver_options, PDO_ATTR_TIMEOUT, 30 TSRMLS_CC);
10
Crozin

Comme vu par exemple dans les commentaires à cette réponse (mais presque nulle part ailleurs, donc je l'ai rendue plus visible ici), la solution "classique" PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION ne fonctionne pas toujours.

L'implémentation de PDO::ERRMODE_EXCEPTIONest cassée , donc elle semble "fuir" dans certains cas.

Par exemple:

Avertissement: PDO :: __ construct () [pdo .-- construct]: [2002] Aucune connexion n'a pu être établie car la machine cible l'a activement refusée. (essayant de se connecter via tcp: // localhost: 3306) dans [...] db.php on ligne 34

Le code là-bas:

try {
    $this->pdo = new PDO($cfg['DB'], $cfg['DB_USER'], $cfg['DB_PASS'],
        array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
} catch {
    echo("Can't open the database.");
}

L'exception est levée (et a cessé: je peux voir mon message).

Donc, comme solution de contournement nécessaire, vous devez également mettre un @ (appelons-le un "opérateur de couches" dans ce cas) avant new pdo(...) pour le garder réellement propre.

2
Sz.

Il y a une parenthèse fermante manquante à la fin de PDO :: ERRMODE_EXCEPTION.

Devrait être:

$this->pdo = new PDO($cfg['DB'], $cfg['DB_USER'], $cfg['DB_PASS'],
    array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
1
Denis St-Michel