[PHP] Transaction

Eléphant du PHP | 113 Messages

18 déc. 2008, 16:03

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.

Mammouth du PHP | 1339 Messages

18 déc. 2008, 16:25

Montre l'erreur affiché dans le navigateur.
Bon sinon tu me fais un message privé et on se fait un TeamViewer

Eléphant du PHP | 113 Messages

19 déc. 2008, 10:26

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 :)

Eléphant du PHP | 113 Messages

23 déc. 2008, 10:37

un ptit up, personne ne maitrise les transaction?

ViPHP
ViPHP | 4674 Messages

25 déc. 2008, 00:17

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.
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Eléphant du PHP | 113 Messages

27 janv. 2009, 18:12

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 :)

Mammouth du PHP | 991 Messages

27 janv. 2009, 19:24

La requete marche bien dans phpmyadmin ?

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


Bonne journée Hawk
DevOps, Symfony4, Hoa

x@v
Mammouth du PHP | 570 Messages

28 janv. 2009, 12:40

en même temps le rollback est dans un catch pour attraper une erreur, donc si il n'y en pas...

Eléphant du PHP | 113 Messages

28 janv. 2009, 15:25

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.

x@v
Mammouth du PHP | 570 Messages

28 janv. 2009, 15:46

tu as essayé d'imprimer
echo ...

Eléphant du PHP | 113 Messages

28 janv. 2009, 18:13

je viens de trouver, le moteur de ma base était en MyISAM et en en innoDB ;)