Procédure stockées et PDO
Bonjour,
Je bloque depuis quelques semaines sur une erreur liée au PDO.
En effet j'obtiens le message d'erreur suivant :
Citation:
Warning: PDOStatement::execute() [pdostatement.execute]: SQLSTATE[HY000]: General error: 2014 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. in C:\www\Intranet\Service_Deploiement\tickets_clm\MLMAudit.php on line 52
J'ai bien compris que cette erreur survient quand on essaye de lancer une requête alors même que la première à encore des résultats à retourner si je ne dit pas de bêtise.
J'ai trouvé de nombreuse piste de résolution tel que fetchAll(), utilisation du closeCursor(), $bdd->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true), ... Mais rien n'y fait.
Voici le code qui pose problème :
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
| try{
$bdd = new PDO("mysql:host=".$host.";dbname=".$database.";charset=utf8", $user, $passwd);
$bdd->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);
$bdd->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);
}
catch(Exception $e){
die('Erreur : '.$e->getMessage());
}
if(isset($_GET['idMsp'])){
$requete = $bdd->prepare("CALL InformationsMSP(:idMsp)");
$requete->bindParam(':idMsp', $_GET['idMsp']);
$requete->execute();
$msp=$requete->fetchAll();
$requete->closeCursor();
print_r($msp);
$requete = $bdd->prepare("CALL InformationsPraticien(:idMsp)");
$requete->bindParam(':idMsp', $_GET['idMsp']);
$requete->execute();
$prat=$requete->fetchAll();
$requete->closeCursor();
print_r($prat);
} |
J'utilise des procédures stockées, le problème pourrait-il venir de là ? Avez-vous d'autre piste de résolution ?
PS : Les deux procédures stockées sont les suivantes :
InformationsMsp :
Code:
1 2 3 4 5 6 7 8 9 10 11
| DELIMITER $$
DROP PROCEDURE IF EXISTS `InformationsMSP` $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `InformationsMSP`(
IN `idMSP` INT
)
BEGIN
SELECT * FROM msp where ID_Msp=idMsp;
END $$
DELIMITER ; |
InformationsPraticien :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| DELIMITER $$
DROP PROCEDURE IF EXISTS `InformationsPraticien` $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `InformationsPraticien`(
IN `idMSP` INT
)
BEGIN
SELECT p.ID_Prat, p.Nom, p.Adresse, p.Telephone, p.`Type`
FROM praticien p
INNER JOIN contient c ON (p.ID_Prat=c.ID_Prat)
INNER JOIN formulaire f ON (c.ID_Form=f.ID_Form)
INNER JOIN msp m ON (f.ID_Msp=m.ID_Msp)
WHERE m.ID_Msp=idMsp
GROUP BY p.Nom, p.Adresse
ORDER BY p.ID_Prat;
END $$
DELIMITER ; |