IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Exception après une requête [PDO]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de tigunn
    Homme Profil pro
    Développeur de bug
    Inscrit en
    Janvier 2003
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de bug

    Informations forums :
    Inscription : Janvier 2003
    Messages : 608
    Par défaut Exception après une requête
    Bonjour,

    Cela faisait quelques temps que je n'avais développé en php et utilisé pdo et les requêtes préparées; or, dans une fonction, je rencontre un problème que je ne comprend pas.

    Voici le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    public function deleteGazette($dblogin, $dbpassword) {
    	try {
    		$db = new PDO('mysql:host=localhost;dbname='.DBPROJECT, $dblogin, $dbpassword);
    	}
    	catch(Exception $e) {
    		echo 'Erreur : Pas de connexion avec la base de données';
    		exit;
    	}
    	try{
    		//	Debut de la transaction
    		$db->beginTransaction();
    		//	suppression gazette
    		$req = $db->prepare("DELETE FROM gazettes WHERE ID = :id_gzt");
    		$res = $req->execute(array(':id_gzt'=>$this->getId()));
    /*		    if ($res)==false) {
    			throw new Exception('La gazette n\'a put être supprimée.', $db->errorCode());
    		    }*/
    		$req->closeCursor();
    		//	livraisons
    		$req2 = $db->prepare("DELETE FROM livraisons WHERE ID_gazettes = :id_gzt");
    		$res2 = $req2->execute(array(':id_gzt'=>$this->getId()));
    /*			if ($res===false) {
    				throw new Exception('Les livraisons n\'ont put être supprimées.', $db->errorCode());
    			}*/
    		$req2->closeCursor();
    		//	livraisons pages
    		$req3 = $db->prepare("DELETE FROM `livraisons_pages` WHERE `ID_livraisons` NOT IN (SELECT `ID` FROM `livraisons`)");
    		$res3 = $req3->execute();
    /*			if ($res===false) {
    				throw new Exception('Les pages livrées n\'ont put être supprimées.', $db->errorCode());
    			}*/
    		$req3->closeCursor();
    		//	relations
    		//		avec provenances:
    		$req4 = $db->prepare('DELETE FROM `R_livraisons_pages_provenances` WHERE `ID_livraisons_pages` NOT IN (SELECT `ID` FROM `livraisons_pages`)');
    		$res4 = $req4->execute();
    /*			if ($res===false) {
    				throw new Exception('Les relations entre les pages livrées et les bibliothèques n\'ont put être supprimées.', $db->errorCode());
    			}*/
    		$req4->closeCursor();
    		//		avec fichiers:
    		$req5 = $db->prepare('DELETE FROM `R_livraisons_pages_fichiers` WHERE `ID_livraisons_pages` NOT IN (SELECT `ID` FROM `livraisons_pages`)');
    		$res5 = $req5->execute();
    /*			if ($res===false) {
    				throw new Exception('Les relations entre les pages livrées et les fichiers n\'ont put être supprimées.', $db->errorCode());
    			}*/
    		$req5->closeCursor();
    		//	fichiers
    		$req6 = $db->prepare('DELETE FROM `fichiers` WHERE `ID` NOT IN (SELECT `ID_fichiers` FROM `R_livraisons_pages_fichiers`)');
    		$res6 = $req6->execute();
    /*			if ($res===false) {
    				throw new Exception('Les fichiers n\'ont put être supprimés de la base de donnée.', $db->errorCode());
    			}*/
    		$req6->closeCursor();
    		// valide la transaction
        		$db->commit();
    	}
    	catch(Exception $e){
    		//on annule la transaction
    		$db->rollback();
    		//	debug
    		echo 'Erreur : '.$e->getCode().' - '.$e->getMessage();
    		exit;
    		//return false;
    	}
    	//[...]
    	return true;	
    }
    La connexion à la base fonctionne.
    Par contre, si je laisse les lignes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if ($res===false) {
    	throw new Exception('La gazette n\'a put être supprimée.', $db->errorCode());
    }
    et les autres commentées; alors l'exécution s'arrête à la suppression dans la table livraisons (la 2ème requête) -> Exception catchée. Je ne comprend pas pourquoi mais au moins la transaction fonctionne.
    SI je comment ces mêmes lignes, là c'est dingue: il semble faire toutes les requêtes sauf la 1ère !! Et la transaction est ignorée

    Remarques:
    - les closeCursor n'affecte en rien les résultats.
    - les requêtes sql sont corrects (pour les noms de table et de champs)
    - $this->getId() est défini
    - $db->beginTransaction() = 1

    Si cela vous parle, merci de m'éclairer!

  2. #2
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2012
    Messages : 631
    Par défaut
    bonjour,

    tu peux utiliser cette classePDOException pour capturer les messages d'erreurs liées à SQL au lieu de Exception.
    Le moteur de tes tables en BD sont-elles InnoDB?

    Si tes tables sont en InnoDB dans ce cas ta 2ème requête est inutile car la suppression de l'id dans la table gazette devrait entraîner systématiquement la suppression de ID_gazettes dans la table livraison.

  3. #3
    Membre éclairé Avatar de tigunn
    Homme Profil pro
    Développeur de bug
    Inscrit en
    Janvier 2003
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de bug

    Informations forums :
    Inscription : Janvier 2003
    Messages : 608
    Par défaut
    Le moteur de tes tables en BD sont-elles InnoDB?
    oui
    Si tes tables sont en InnoDB dans ce cas ta 2ème requête est inutile
    euh Cela ne marche que si des contraintes d'intégrité sont définies et que l'on utilise CASCADE?!
    Ce n'est pas le cas, il n'y aucune contraintes sur ces tables.
    Mais je vais finir par les ajouter pour me simplifier la tâche.

  4. #4
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2012
    Messages : 631
    Par défaut
    Citation Envoyé par tigunn Voir le message
    oui
    euh Cela ne marche que si des contraintes d'intégrité sont définies et que l'on utilise CASCADE?!
    :
    bien sûr que la contrainte d’intégrité doit être définie au niveau des tables filles pour pouvoir propager les modification de la table père à la table fille.

    Il te faut attraper les messages d'erreurs sql avec PDOException :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    try{
         $db->beginTransaction();
    }
    catch(PDOException $e){
        $db->rollBack(); 
        echo "erreur sql:" ,$e->getMessage();
        exit;
    }

  5. #5
    Membre éclairé Avatar de tigunn
    Homme Profil pro
    Développeur de bug
    Inscrit en
    Janvier 2003
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de bug

    Informations forums :
    Inscription : Janvier 2003
    Messages : 608
    Par défaut
    Merci pour ta réponse.
    Remarque : pour PDOException, j'avais compris , je n'ai pas eu le temps hier.

    Maintenant, je découvre des contraintes d'intégrité que phpMyAdmin n'affiche pas. Je vais donc reprendre ce code et je reviendrais ensuite.


    Edit: C'est ma faute, je ne fais pas assez attention au dump (ou les contraintes sont évidemment définies ).

    Problème résolu. Utiliser PDOException m'a bien aidé.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] Affichage personalisé aprés une requète Mysql.
    Par Caizzii dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 14/05/2007, 11h34
  2. [MySQL] Récupération dans un text area de données apres une requète
    Par sexy-meta dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 14/12/2006, 17h29
  3. Trier une table après une requête d’ajout
    Par Meduse dans le forum Access
    Réponses: 6
    Dernier message: 30/05/2006, 15h54
  4. Etat après une requête
    Par platoon64 dans le forum Bases de données
    Réponses: 2
    Dernier message: 22/05/2006, 14h03
  5. [MySQL] Afficher une date correctement après une requête
    Par Nerva dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 12/04/2006, 16h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo