Bonjour,
Je bloque depuis quelques semaines sur une erreur liée au PDO.
En effet j'obtiens le message d'erreur suivant :
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.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 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 :
J'utilise des procédures stockées, le problème pourrait-il venir de là ? Avez-vous d'autre piste de résolution ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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); }
PS : Les deux procédures stockées sont les suivantes :
InformationsMsp :
Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
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 sql : Sélectionner tout - Visualiser dans une fenêtre à part
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 ;
Partager