Bonjour,

Je bloque depuis quelques semaines sur une erreur liée au PDO.

En effet j'obtiens le message d'erreur suivant :

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