Mysql5, Procédure stockée et PDO::LastInsertId()
Bonjour à vous tous,
J'ai un petit souci avec la méthode PDO::LastInsertId() et MySQL5.
J'enregistre des données dans une table avec un id autoincrémenté et j'aimerais bien récupérer le dernier Id. Ceci me permettait d'utiliser cet Id pour l'insérer dans une table de liaison.
Quand j'utilise une requête INSERT classique, LastInsertId() me retourne bien le dernier Id inséré dans la table.
- PDO avec requête INSERT classique :
Code:
1 2 3 4 5
| $connectBDD = new PDO($dsn, $login, $mdp);
$insert ="INSERT INTO table(champ1, champ2) VALUES ('valeur1', 'valeur2');
$test = $connectBDD->exec($insert);
print $connectBDD->lastInsertId();
$connectBD=null; |
Par contre en remplaçant cette requête par une procédure stockée, LastInsertId() me retourne 0
- Procédure Stockée :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| DELIMITER $$
CREATE PROCEDURE `database`.`InsertProcedure`(
IN inChamp1 INT(2),
IN inChamp2 VARCHAR(50))
BEGIN
INSERT INTO table(
champ1,
champ2
)
VALUES(
inChamp1,
inChamp2
);
END $$
DELIMITER ; |
- PDO avec Procédure Stockée :
Code:
1 2 3 4 5
| $connectBDD = new PDO($dsn, $login, $mdp);
$insert ="CALL InsertProcedure('valeur1', 'valeur2')";
$test = $connectBDD->exec($insert);
print $connectBDD->lastInsertId();
$connectBDD=null; |
D'où vient le problème ? De la déclaration de ma procédure stockée ? Ou du fait que PDO::LastInsertId() ne fonctionne pas avec une procédure stockée ?
Merci de m'éclairer sur ce point. Il serait dommage que je ne puisse pas utiliser mes procédures stockées dans mon projet.
Et lorsque l'on enchaîne deux procédures de ce type
Maintenant j'ai bien avancé dans mon projet mais les problèmes se déplacent (ou c'est plutôt mon manque d'expérience qui fait surface...) :)
J'essaie d'enchaîner deux procédures de ce type. Je m'explique.
- j'ai une première procédure qui me permet de créer un terrain et de récupérer son id (id_terrain)
- j'ai une deuxième procédure qui me permet de créer une personne et de récupérer son id (id_personne)
Le but de cette opération est d'insérer ces deux id (id_terrain et id_personne) dans une table de liaison (table vendeur).
Donc j'ai comme code :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| $connectBDD = new PDO($dsn, $login, $mdp);
$connectBDD->beginTransaction();
$insertTerrain ="CALL InsertTerrain('valeur1', 'valeur2', @lastID)";
$insertVendeur ="CALL InsertVendeur('valeur1', 'valeur2', @lastID)";
$resultatTerrain = $connectBDD->query($insertTerrain);
$tabResultatTerrain = $resultatTerrain->fetch();
echo $tabResultatTerrain['lastID'];
$resultatVendeur = $connectBDD->query($insertVendeur);
$tabResultatVendeur = $resultatVendeur->fetch();
echo $tabResultatVendeur['lastID'];
$connectBDD->commit();
$connectBDD=null; |
Mais quand j'enchaîne ces deux procédures j'ai une erreur de ce type :
Code:
Cannot execute queries while other unbuffered queries are active. Consider using PDOStatement::fetchAll(). Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute.
J'ai l'impression qu'il manque une commande entre les deux exécutions des procédures mais laquelle ? J'ai beau regardé la doc de PDO, je ne vois pas... :cry: