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:
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:
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 !! :cry: Et la transaction est ignorée :calim2:
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!