Avec PDO, impossible de récupérer des exceptions en connexion persistante

Nix6800 Messages postés 5 Date d'inscription dimanche 2 mars 2008 Statut Membre Dernière intervention 2 juin 2008 - 8 avril 2008 à 16:34
Nix6800 Messages postés 5 Date d'inscription dimanche 2 mars 2008 Statut Membre Dernière intervention 2 juin 2008 - 2 juin 2008 à 14:18
Bonjour.


J'utilise PDO pour me connecter à ma BDD Oracle et j'aimerais utiliser
des connections persistantes en faisant des envoies multiples (avec un
"prepare").


Cela marche très bien mais... les exceptions ne semblent plus être
attrapées par mon catch (que ce soit une erreur de syntaxe ou une
erreur de type de données le script crash au lieu d'afficher l'erreur).


Mon code est le suivant.

http://www.siteduzero.com/forum-83-261100-p1-avec-pdo-impossible-de-recuperer-des-exceptions-en-connexion-persistante.html#

try {

    $dbh = new PDO("oci:dbname=//localhost/XE", 'TEST', 'TEST',

        array(PDO::ATTR_PERSISTENT => true));

    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

 

    $dbh->beginTransaction();

       

        $stmt = $dbh->prepare("INSERTT INTO membres (id, pseudo) VALUES (?, ?)");

        $stmt->bindParam(1, $id);

        $stmt->bindParam(2, $pseudo);

 

        // insertion d'une ligne

        $id = '';

        $pseudo = 'Jack';

        $stmt->execute();

 

        // insertion d'une autre ligne avec des valeurs différentes

        $id = '';

        $pseudo = 'Marchal';

        $stmt->execute();

 

    $dbh->commit();

 

} catch (Exception $e) {

        $dbh->rollBack();

    echo "Échec : " . $e->getMessage();

}


Merci d'avance pour votre aide !

7 réponses

malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
8 avril 2008 à 19:19
Hello,

execute() ou prepare() renvoient false en cas d'échec.
Donc :
if(false === $stmt->execute()) {
    throw new Exception('erreur dans l\'exécution de la requête préparée');
}
par exemple.
0
Nix6800 Messages postés 5 Date d'inscription dimanche 2 mars 2008 Statut Membre Dernière intervention 2 juin 2008
8 avril 2008 à 19:52
Merci pour ta réponse, mais il semble que cela ne fonctionne pas. J'ai mit

<?php
echo 'test';
try {
    $dbh = new PDO("oci:dbname=//localhost/XE", 'TEST', 'TEST',
        array(PDO::ATTR_PERSISTENT => true));
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $dbh->beginTransaction();
   
    if($stmt = $dbh->prepare("INSERT INTO membres (id, pseudo) VALUES (?, ?)")) {
        $stmt->bindParam(1, $id);
    $stmt->bindParam(2, $pseudo);

    // insertion d'une ligne
    $id = '';
    $pseudo = 'Jack';
    $stmt->execute();

    // insertion d'une autre ligne avec des valeurs différentes
    $id = '';
    $pseudo = 'Marchal';
    $stmt->execute();

    $dbh->commit();

}
else{    throw new Exception('erreur dans l\'exécution de la requête préparée');}
} catch (Exception $e) {
    $dbh->rollBack();
    echo "Échec : " . $e->getMessage();
}
?>

Ca crashe de la même manière, même le "echo'test';" ne fonctionne pas quand je met une requète erronée.
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
8 avril 2008 à 20:01
C'est quoi ce else ??
Ce n'est pas ce que je t'ai dit de faire.

try {if(false ($stmt $dbh->prepare("INSERT INTO membres (id, pseudo) VALUES (?, ?)")))) {
    throw new Exception('erreur dans l\'exécution de la requête préparée');
}
// bla bla
if(false === $stmt->execute()) {
    throw new Exception('erreur dans l\'exécution de la requête préparée');
}
// bla bla
} catch(Exception $e) {
    // bla bla
}
0
Nix6800 Messages postés 5 Date d'inscription dimanche 2 mars 2008 Statut Membre Dernière intervention 2 juin 2008
8 avril 2008 à 22:09
Pardon, j'ai mal inteprété.

J'ai tapé ça :

try {
    $dbh = new PDO("oci:dbname=//localhost/XE", 'TEST', 'TEST',
        array(PDO::ATTR_PERSISTENT => true));
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $dbh->beginTransaction();
    if(false ($stmt $dbh->prepare("INSERTT INTO membres (id, pseudo) VALUES (?, ?)"))) {
    throw new Exception('erreur dans l\'exécution de la requête préparée');
}
        $stmt->bindParam(1, $id);
    $stmt->bindParam(2, $pseudo);

    // insertion d'une ligne
    $id = '';
    $pseudo = 'Jack';
if(false === $stmt->execute()) {
    throw new Exception('erreur dans l\'exécution de la requête préparée');
}

    // insertion d'une autre ligne avec des valeurs différentes
    $id = '';
    $pseudo = 'Marchal';
if(false === $stmt->execute()) {
    throw new Exception('erreur dans l\'exécution de la requête préparée');
}

    $dbh->commit();

} catch (Exception $e) {
    $dbh->rollBack();
    echo "Échec : " . $e->getMessage();
}

Mais j'obtient toujours le même résultat.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
8 avril 2008 à 22:42
Il plante où ton script, dans quel cas ?
0
Nix6800 Messages postés 5 Date d'inscription dimanche 2 mars 2008 Statut Membre Dernière intervention 2 juin 2008
9 avril 2008 à 09:06
Si j'enlève le second T à INSERT il fonctionne très bien. Mais dès que je le rajoute (une erreur donc) ça me fait crasher apache.
0
Nix6800 Messages postés 5 Date d'inscription dimanche 2 mars 2008 Statut Membre Dernière intervention 2 juin 2008
2 juin 2008 à 14:18
Quelqu'un aurait il une nouvelle idée ?
0