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!