Bonjour à tous,
J'ai été confronté une fois à un problème qui ne s'est jamais reproduit et que je n'ai pas pu m'expliquer :
Dans un programme de gestion de prestataire, plusieurs validations devaient être effectuées dans la BDD mais l'une d'elle ne s'est pas faite alors qu'elle était indiquée comme faite dans mon récapitulatif.
alors micro coupure de l'alimentation du serveur distant ou autre raison je ne sais pas mais pour le cas que je suis en train de traiter en ce moment (validation d'une commande après retour d'information d'un paiement sécurisé) cela ne doit pas arriver.
J'ai donc décidé d'utiliser une transaction avec gestion des erreurs.
Par contre je me dis que si le problème décrit ci-dessus se reproduisait, je voudrais quand même que le programme ré-essaye de faire cette transaction pour essayer de la faire aboutir.
Je limite le nombre d'essais à 5 parce que si ça n'a toujours pas marché au 5eme essai, inutile de faire une boucle à l'infini...
au delà de 5 essais, l'erreur serait notée dans un fichier texte en recueillant un maximum d'informations pour permettre de retrouver le client sur l'interface du module de paiement sécurisé.
voici donc ma fonction :
les echo me permettent de suivre ce qui se passe et j'ai volontairement introduit une erreur dans le nom de la table "client_transactions" en rajoutant un "s" pour voir ce qui se passe.
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 public function insertClient(){ $this->BDD->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $this->BDD->beginTransaction(); try{ $query_inClient="INSERT INTO client SET ".$this->req; $this->BDD->exec($query_inClient); $this->IDClient=$this->BDD->lastInsertId(); foreach($this->tabClient as $key=>$line){ $this->req='IDClient='.$this->IDClient; foreach($line as $cle=>$valeur){ $this->req.=", ".$cle."='".$valeur."'"; }; $query_inCommande="INSERT INTO client_commandes SET ".$this->req; echo $query_inCommande.'<br>'; $this->BDD->exec($query_inCommande); }; $tabTransac=array('trans_id','trans_date','card_brand','amount','auth_mode','auth_result','auth_number','warranty_result','payment_certificate','result'); $this->req=''; foreach($tabTransac as $element)$this->req.=$element."='".$this->{$element}."', "; $query_inTransac="INSERT INTO client_transactions SET ".$this->req."IDClient=".$this->IDClient; echo $query_inTransac.'<br>'; $this->BDD->exec($query_inTransac); $this->IDTransac=$this->BDD->lastInsertId(); $query_upTransac="UPDATE client SET transac=".$this->IDTransac." WHERE ID=".$this->IDClient; echo $query_upTransac.'<br>'; $this->BDD->exec($query_upTransac); $this->BDD->commit(); $this->suprTableProvisoir(); // fonction qui supprime les tables provisoire } catch(Exception $e){ echo "ERREUR : ".$e->getMessage()."<br/>"; $this->incremTest++; $this->BDD->rollBack(); if($this->incremTest < 5) $this->insertClient(); else { // écrire un message d'alerte dans un log } }; }
et je récupère les erreur suivantes :
on voit que les echo ne sont affichés qu'une fois et que l'erreur indiquée n'est plus la même, pourquoi ?INSERT INTO client_commandes SET IDClient=3, IDProd='4', nom='DDD', prenom='aaa', dateNaiss='2008-03-03', dateDu='2010-07-11', duree='7', tarif='125', remise='0', numClient='0_0'
INSERT INTO client_transactions SET trans_id='073642', trans_date='20100324073642', card_brand='visa', amount='12500', auth_mode='FULL', auth_result='00', auth_number='587412', warranty_result='YES', payment_certificate='68969777322', result='00', IDClient=3
ERREUR : SQLSTATE[42S02]: Base table or view not found: 1146 Table 'maBdd.client_transactions' doesn't exist
ERREUR : SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
ERREUR : SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
ERREUR : SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
ERREUR : SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
cela ne devrait-il pas relancer toute l'exécution de ma fonction ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part if($this->incremTest < 5) $this->insertClient();
Quand j'aurais déjà compris ça, je verrai mieux si j'ai besoin de poser d'autres questions
Merci d'avance pour vos réponses
Partager