Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2332 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  [PHP] try catch imbriqués.

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[PHP] try catch imbriqués.

n°2000946
durk
Posté le 11-06-2010 à 16:14:15  profilanswer
 

Salut,
 
J'ai une question sur l'utilisation de try catch imbriqués lors d'opération PDO sur une bdd.  
Le code est schématique mais le principe est là:
 

Code :
  1. try{
  2.       //insertion PDO dans la table1;
  3.       $table1->insert($args);
  4.       $lastid=$db->lastInsertId();
  5.       try{
  6.             //update PDO dans la table 1
  7.             //update PDO dans la table 2
  8.       }
  9.       catch(Exception $e){
  10.             //CODE ERREUR2: erreur de l'update d'une(ou des deux) table 1/2
  11.             $table1->delete($lastid);
  12.             echo 'Une erreur 2 s\'est produite';
  13.       }
  14. }
  15. catch(Exception $e){
  16.       //CODE ERREUR1: Une erreur s'est produite lors de l'insertion dans la table 1
  17.       echo 'Une erreur 1 s\'est produite';
  18. }


 
 
L'idée est d'effectuer des opérations dépendantes entre-elles (une opération ne peut s'effectuer que si la précédent s'est bien déroulée) sur une bdd sans arrêt en cas d'erreur à l'une d'elles et avec la possibilité de déterminer quelle opération à lancé l'exception;  
 
Voila, je cherche à savoir si mon pseudo-code n'est pas bon, alors quelle est la bonne méthode, sachant que mon pseudo code représente deux imbrications mais qu'il peut y en avoir plus...
 
Merci à tous.
 :jap:


Message édité par durk le 11-06-2010 à 16:18:00
mood
Publicité
Posté le 11-06-2010 à 16:14:15  profilanswer
 

n°2000948
flo850
moi je
Posté le 11-06-2010 à 16:19:35  profilanswer
 

je ferai un truc comme ça

Code :
  1. begintransaction();
  2. try{
  3. $table1->insert($args);
  4. $lastid=$db->lastInsertId();
  5. }catch(){
  6.  
  7. //CODE ERREUR1: Une erreur s'est produite lors de l'insertion dans la table 1
  8. echo 'Une erreur 1 s\'est produite';
  9. rollback()
  10. return ;
  11.  
  12. }
  13. try{
  14.     //update PDO dans la table 1
  15.     //update PDO dans la table 2
  16. }catch(){
  17. //CODE ERREUR2: erreur de l'update d'une(ou des deux) table 2
  18.     echo 'Une erreur 2 s\'est produite';
  19. rollback() //il se charge de l'effacement necessaire
  20. }
  21.  
  22. commit()

Message cité 1 fois
Message édité par flo850 le 11-06-2010 à 16:19:46
n°2000953
Pascal le ​nain
Posté le 11-06-2010 à 16:24:58  profilanswer
 

flo850 a écrit :

je ferai un truc comme ça  
[code = php] [/ code]


J'ai eu la même idée, mais le problème, c'est qu'en cas d'erreur lors du premier try, on se tapera quand même le deuxième, qui n'a pas lieu d'être exécuté...


Message édité par Pascal le nain le 11-06-2010 à 16:25:27
n°2000954
flo850
moi je
Posté le 11-06-2010 à 16:32:38  profilanswer
 

il ya un return dans le catch ;)

n°2000955
flo850
moi je
Posté le 11-06-2010 à 16:33:26  profilanswer
 

mais sinon, je fusionnerai , les deux
rollback se chargera de remettre tout en etat en cas de problème


Message édité par flo850 le 11-06-2010 à 16:33:34
n°2000956
stealth35
Posté le 11-06-2010 à 16:34:22  profilanswer
 

pour la gestion des erreurs de PDO y'a plus simple que de faire des try...catch partout
 
http://php.net/manual/fr/pdo.error-handling.php

n°2000957
durk
Posté le 11-06-2010 à 16:37:08  profilanswer
 

Slt, tout d'abord merci de t'intéresser à mon pb.
 
En suite, dis moi si je me trompe mais ton code risque d'exécuter les updates même en cas d'erreur du premier try catch, ce qui fausserait le resultat puisque le dernier id insérer ne correspondrait à ce qu'il serait en cas d'insert reussit.
 
EDIT: ouh, c'est allé vite.. j'avais pas fait gaf non plus au return... je regarde je tiens au courant.


Message édité par durk le 11-06-2010 à 16:38:55
n°2000965
durk
Posté le 11-06-2010 à 16:57:07  profilanswer
 

Re.  
 
En fait je connais le lien mais je ne vois pas comment gérer les erreurs sans interrompre le code d'une meilleurs façon qu'avec les exceptions. Peux-tu détailler ?
 
Si non, le rollback me parait un bon plan. confirmation: le return renvoie où? pq l'idée est de ne pas sortir du script...
 
edit.
 
Peut-être une solution serait de reprendre ton script (flo850) mais d'instencier l'exception et de vérifier par la suite si elle est unset ou pas si non, alors on effectue le deuxième try catch.


Message édité par durk le 11-06-2010 à 17:05:41
n°2000970
stealth35
Posté le 11-06-2010 à 17:16:31  profilanswer
 

en PDO::ERRMODE_WARNING ca s'arrête pas

n°2000973
flo850
moi je
Posté le 11-06-2010 à 17:18:37  profilanswer
 

mieux :

Code :
  1. begintransaction();
  2. try{
  3. $table1->insert($args);
  4. $lastid=$db->lastInsertId();
  5.     //update PDO dans la table 1
  6.     //update PDO dans la table 2
  7. }catch(){
  8. rollback() //il se charge de l'effacement necessaire
  9. }
  10.  
  11. commit()


Message édité par flo850 le 11-06-2010 à 17:20:03
mood
Publicité
Posté le 11-06-2010 à 17:18:37  profilanswer
 

n°2000978
durk
Posté le 11-06-2010 à 17:26:56  profilanswer
 

yep, c'est ce que j'ai fait en re-regardant la doc de begintransaction/rollback/commit j'ai vu qu'on revenait à l'état d'avant; donc qu'il y ait eu une erreur ou dix, la bdd n'est pas modifiée.  
Ce qui fait même gagner en temps d'exécution puisqu'on ne modifie la bdd qu'en étant sûr de pas revenir sur les modifications.
 
Merci à tous ça m'a bien aidé.
 :jap:


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  [PHP] try catch imbriqués.

 

Sujets relatifs
Problème code PHP insertion données form dans DBProblème d'utilisation de DSN avec socket (PHP &PEAR)
Temps d'attent avant d'appler un fonction PHPenvoie un mail eh PHP
zone de séléction sur une image en PHPInsérer un fchier .zip dans BD mysql en PHP
Stocker images et .zip dans une BD via PHPproblème avec la commande exec [PHP]
Sessions PHPProblème formulaire HTML& PHP
Plus de sujets relatifs à : [PHP] try catch imbriqués.


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR