Page 1 sur 1

[PHP] Transaction

Posté : 18 déc. 2008, 16:03
par Wells83
Bonjour, je suis en train de m'essayer uax transactions en php. Voici mon code tt simple:

Code : Tout sélectionner

<?php function rollbacke($error) { global $link; if($error!='') { mysqli_query($link,"ROLLBACK"); throw new exception($error); //return 1; exit; } //else mysql_query("COMMIT",$linker); } $link = mysqli_connect('localhost','root', '', 'testcharset') or die(mysqli_error($link)); mysqli_autocommit($link, FALSE); try { mysqli_query($link,"BEGIN"); mysqli_query($link,"UPDATE race SET Nom_Race=222") or rollbacke(mysqli_error($link)); mysqli_query($link,"select * race WHERE Id_Race=a") or rollbacke(mysqli_error($link)); //echo 'Erreur: '.$errors; //if($errors=='') mysql_query("COMMIT"); //mysql_query("ROLLBACK",$linker); echo 'toto'.mysqli_error($link); mysqli_query($link,"COMMIT"); } catch(Exception $e) {echo "Erreur: " . $e->getMessage();} ?>
Bien sur la seconde requête produit une erreur puisqu'il manque les '.
Malheureusement la première n'est pas rollbacker si j'ose dire.
Je vois pas d'où viens le soucis. si qq'un maitrise bien les rollback, je suis preneur merci.

Posté : 18 déc. 2008, 16:25
par Elie
Montre l'erreur affiché dans le navigateur.

Posté : 19 déc. 2008, 10:26
par Wells83
Aucune erreur, le script marche très bien. Le problème c'est que l'UPDATE n'est pas rollbacker, ce qui est le but de la manœuvre :)

Posté : 23 déc. 2008, 10:37
par Wells83
un ptit up, personne ne maitrise les transaction?

Posté : 25 déc. 2008, 00:17
par Hywan
Hey :),

Ne te prend pas la tête. Utilise PDO qui gère lui-même les transactions (via une exception PDOException). Tu as les méthodes beginTransaction(), commit() et rollBack() à ta disposition. Si le SGBDR utilisé ne supporte pas les transactions, PDO est censé les émuler.

Et au passage, rollback ne prend pas de « e » …

Lien : http://php.net/pdo.

Posté : 27 janv. 2009, 18:12
par Wells83
Moyennement convaincu:
<?php
try {
	$dbh = new PDO("mysql:host=localhost;dbname=testcharset", 'root', '');
	$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
	$dbh->beginTransaction();
	$dbh->exec("UPDATE race SET Nom_Race=111");
	$dbh->exec("UPDATE race SET Nom_Racse=333");
	$dbh->commit();
	//$dbh = null;
    }
catch(PDOException $e)
    {
	$dbh->rollback();
    echo $e->getMessage();
    }
?>
Le script perte bien une erreur (mauvais champ dans le WHERE du second update) mais nom_race a bien prit la valeur 111.....

il n'y a donc aucun rollback de fait. Si qq'un peut me donner l'erreur dans le script je suis preneur parce que la je vois pas :)

Posté : 27 janv. 2009, 19:24
par thehawk
La requete marche bien dans phpmyadmin ?

je serais d'avis de mettre : $dbh->exec("UPDATE race SET Nom_Race='111'");


Bonne journée Hawk

Posté : 28 janv. 2009, 12:40
par x@v
en même temps le rollback est dans un catch pour attraper une erreur, donc si il n'y en pas...

Posté : 28 janv. 2009, 15:25
par Wells83
hum j'ai pas été clair apparemment. y a deux requêtes.

la première marche.
la seconde je fait exprès de la faire planter

donc oui on rentre bien dans le catch (l'erreur apparait à l'écran etc...)

et donc je supose que l'instruction rollback est faites, sauf qu'elle reverse rien du tout puisque Nom_Race egal bien à 111 dans ma table au lieu des valeurs de départ.

Posté : 28 janv. 2009, 15:46
par x@v
tu as essayé d'imprimer
echo ...

Posté : 28 janv. 2009, 18:13
par Wells83
je viens de trouver, le moteur de ma base était en MyISAM et en en innoDB ;)