Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Transaction PDO non annulee

6 réponses
Avatar
jacfev
Bonjour,

Dans l'exemple simple ci-dessous, en PDO, la transaction n'est pas annulée
(la première requête est exécutée quand même) alors qu'il y a une erreur
(volontaire) dans la 2ème requête.
Auncune des requêtes ne devrait être exécutée puisqu'il s'agit d'une
transaction.

Il me semble pourtant avoir respecté les indications de :
http://fr.php.net/manual/fr/pdo.transactions.php

Mon exemple qui pose problème :

<?php
include_once('connect.inc.php');
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$dbh->beginTransaction();
try {
$sql = "INSERT INTO auteur (login, nom, prenom)
VALUES ('Max', 'Havelard', 'isGood')";
$dbh->exec($sql);
// syntaxe incorrecte ici volontairement (titlre au lieu de titre)
$sql2 = "INSERT INTO article (titlre, texte, auteur)
VALUES ('PHP 5 V5 !', 'il est sorti', 'Max')";
$dbh->exec($sql2);
$dbh->commit();
} catch (Exception $e) {
$dbh->rollBack();
echo "Echec: ".$e->getMessage();
}
?>

Le fichier connect.inc.php inclus

<?php
define('DSN1', 'mysql:host=localhost;dbname=publication');
define('USER1', 'cyril');
define('PASS1', 'motdepasse');
try {
$dbh = new PDO(DSN1, USER1, PASS1);
//utilisation de la connexion
} catch (PDOException $e) {
print "Erreur ! : ".$e->getMessage()."<br/>";
die();
}
?>

La base et les tables fonctionnent par ailleurs correctement.

Pour connaisseur en PDO;
Où est l'erreur ?
Cordialement
jf.

6 réponses

Avatar
Mickael Wolff
Le 12/08/2010 21:08, jacfev a écrit :
Il me semble pourtant avoir respecté les indications de :
http://fr.php.net/manual/fr/pdo.transactions.php



Tu devrais lire le cadre rose avec le panneau « danger » et vérifier
le type de tes tables ;)

--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org
Avatar
Bruno Baguette
Le 12/08/10 22:08, jacfev a écrit :
Bonjour,

Dans l'exemple simple ci-dessous, en PDO, la transaction n'est pas
annulée (la première requête est exécutée quand même) alors qu'il y a
une erreur (volontaire) dans la 2ème requête. Auncune des requêtes
ne devrait être exécutée puisqu'il s'agit d'une transaction.



Bonjour !

La première idée qui me vient à l'esprit serait de vérifier que votre
table ne serait pas au format MyISAM.

Si tel est le cas, passez votre table au format InnoDB et votre problème
devrait être ainsi résolu !

Très cordialement,

--
Bruno Baguette
Avatar
John GALLET
Bonjour,

La première idée qui me vient à l'esprit serait de vérifier que votre
table ne serait pas au format MyISAM.



Pour des données, je comprendrais, mais sur une erreur de syntaxe SQL,
si c'est la solution, c'est pas intuitif comme comportement.

JGA
Avatar
jacfev
InnoDB OK.
J'avais trouvé depuis (ça fait plus d'une semaine que j'avais envoyé ce post
!)
Merci quand même Bruno.

"Bruno Baguette" a écrit dans le message de news:
i420ad$1pnc$
Le 12/08/10 22:08, jacfev a écrit :
Bonjour,

Dans l'exemple simple ci-dessous, en PDO, la transaction n'est pas
annulée (la première requête est exécutée quand même) alors qu'il y a
une erreur (volontaire) dans la 2ème requête. Auncune des requêtes ne
devrait être exécutée puisqu'il s'agit d'une transaction.



Bonjour !

La première idée qui me vient à l'esprit serait de vérifier que votre
table ne serait pas au format MyISAM.

Si tel est le cas, passez votre table au format InnoDB et votre problème
devrait être ainsi résolu !

Très cordialement,

--
Bruno Baguette
Avatar
Bruno Baguette
Le 13/08/10 18:39, John GALLET a écrit :
Bonjour,

La première idée qui me vient à l'esprit serait de vérifier que
votre table ne serait pas au format MyISAM.



Pour des données, je comprendrais, mais sur une erreur de syntaxe
SQL, si c'est la solution, c'est pas intuitif comme comportement.

JGA



AMHA, on ne peut pas vraiment reprocher ce comportement à PDO.

PDO s'adresse à un SGBD (dans le cas présent : MySQL), mais ne connait
pas le type de table qui se trouve derrière (MyISAM, InnoDB, ...).

Avec le moteur MyISAM, si vous faites un BEGIN; ou que vous déclarez des
constraintes FOREIGN KEY, le moteur acceptera ces commandes, mais ne les
appliquera pas.

Sans connaitre le code de PDO, c'est (une des) raisons que je devine
pour expliquer le comportement de PDO.

--
Bruno Baguette
Avatar
John GALLET
Re,

AMHA, on ne peut pas vraiment reprocher ce comportement à PDO.



Dans ce cas là, je confirme, c'est surtout que j'avais lu les
informations de travers: après une requête qui est correcte, une requête
volontairement incorrecte ne provoquait pas de rollback. Ce que j'avais
lu, c'était l'inverse, i.e. on continuait quand même la requête numéro 2
après une requête syntaxiquement incorrecte.
Aïe, non, pas la tête.

JGA