transaction validée malgrès une erreur
Bonjour à tous,
J'ai une transaction dans laquelle je cherche à effectuer plusieurs UPDATE dans la même table.
J'ai pu constater que parfois tous les UPDATE ne sont pas effectués et pourtant cela ne déclenche pas le ROLLBACK...
Je l'ai vérifié en supprimant l'une des lignes dont je demande l'UPDATE dans la table "clients", je pense que dans la mesure on je demande l'UPDATE d'une ligne qui n'existe pas, cela doit bien lever une erreur ?
Je précise que comme cela m'est déjà arrivé, j'ai bien vérifié que les Tables concernées sont de type InnoDB
Voici le script :
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 69 70 71 72
| $guidAcc=(isset($_POST['guidAcc'])) ? ($_POST['guidAcc']=="a") ? 1 : 0 : 0;
$tabClient=array();
$tabType=array();
$tabIDRef=array();
$tabMontant=array();
for($i=0; $i<=$_POST['nbr']; $i++){
$tab=explode("|",$_POST['acti_'.$i]);
$tabMontant[]=$_POST['montant_'.$i];
$tabClient[]=$tab[0];
$tabType[]=$tab[1];
$tabIDRef[]=$tab[2];
}
$clientBdd=implode("/",$tabClient);
$refBdd=implode("/",$tabIDRef);
$typeBdd=implode("/",$tabType);
$montantBdd=implode("/",$tabMontant);
///////////////////////////////// ECRITURE DANS LA TABLE FACTURES ////////////////////////////////////////////////
${"dbh".$rep}->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
${"dbh".$rep}->beginTransaction();
try{ // DEBUT DE TRANSACTION
$query_inFacture="INSERT INTO factures_vendeurs SET
date='".date('Y-m-d')."',
IDVendeur=".$IDvendeur.",
IDClients='".$clientBdd."',
actis='".$refBdd."',
type='".$typeBdd."',
guidAcc=".$guidAcc.",
montant='".$montantBdd."'";
${"dbh".$rep}->exec($query_inFacture);
$IDFacture=${"dbh".$rep}->lastInsertId();
foreach($tabClient as $key=>$value){
$query_rsClient="SELECT revendPaye, typeRef, IDRef FROM clients WHERE ID=".$value;
$rsClient=${"dbh".$rep}->query($query_rsClient);
$row_rsClient = $rsClient->fetch(PDO::FETCH_ASSOC);
$tabPaye=explode("/",$row_rsClient["revendPaye"]);
$tabIDRefClient=explode("/",$row_rsClient["IDRef"]);
$tabTypeClient=explode("/",$row_rsClient["typeRef"]);
$tabCompare=array();
foreach($tabTypeClient as $cle=>$valeur)$tabCompare[]=$valeur."_".$tabIDRefClient[$cle];
$num=array_search($tabType[$key]."_".$tabIDRef[$key], $tabCompare);
$tabPaye[$num]=$IDFacture;
$majPaye=implode("/",$tabPaye);
$query_rsMajClient="UPDATE clients SET revendPaye='".$majPaye."' WHERE ID=".$value;
${"dbh".$rep}->exec($query_rsMajClient);
$tabCompare="";
}; // FIN DE FOREACH
${"dbh".$rep}->commit();
echo 1;
}
catch(Exception $e){
${"dbh".$rep}->rollBack();
echo 0;
}; // FIN DE TRANSACTION |
Dans un premier temps quelqu'un peut-il me dire pourquoi il n'y a pas de rollback lorsqu'une erreur se produit ?
Dans les cas que j'ai testé l'UPDATE doit se faire sur une trentaine de lignes de la TABLE "clients", ce qui veut dire une trentaine de requêtes UPDATE...
Je ne vois pas comment faire une seule requête d'UPDATE pour mettre à jour 30 lignes en même temps...
Est-ce possible ? est-ce que ça changerai quelque chose ?
Merci d'avance pour vos réponses :D