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:
La connexion à la base fonctionne.
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; }
Par contre, si je laisse les lignes:
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.
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()); }
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!
Partager