Résolution de l'erreur « Impossible d'exécuter des requêtes alors que d'autres requêtes sans tampon sont actives » avec MySQL
Introduction :
Le protocole client MySQL impose une limitation selon laquelle une seule requête peut être exécutée simultanément. Lorsqu'ils tentent d'exécuter des requêtes supplémentaires alors que les résultats des requêtes précédentes ne sont pas récupérés, les utilisateurs peuvent rencontrer l'erreur « Impossible d'exécuter des requêtes alors que d'autres requêtes sans tampon sont actives ». Ce problème peut survenir dans des scénarios spécifiques, en particulier lorsque PHP Data Objects (PDO) est utilisé avec l'attribut PDO::ATTR_EMULATE_PREPARES défini sur false.
Cause :
Le La cause première réside dans l'incapacité du protocole client MySQL à avoir plusieurs requêtes en cours simultanément. Une fois qu'une requête est exécutée, la bibliothèque client récupère automatiquement tous ses résultats et les met en cache, permettant aux récupérations ultérieures de parcourir les résultats stockés sans communiquer avec MySQL. Cette approche, connue sous le nom de « requêtes tamponnées », libère le serveur MySQL de tout traitement ultérieur une fois les résultats initiaux récupérés.
À l'inverse, les requêtes sans tampon ne mettent pas les résultats en cache, ce qui oblige le client à les récupérer un par un. Cette contrainte survient lorsqu'une deuxième requête est exécutée avant que les résultats de la première requête n'aient été entièrement récupérés. Le serveur MySQL interprète cela comme un conflit entre requêtes actives et déclenche le message d'erreur.
Résolution :
Pour résoudre ce problème, les stratégies suivantes peuvent être utilisées :
Considérations supplémentaires :
Exemple de code :
Le code fourni peut être modifié pour éviter l'erreur en utilisant fetchAll() ou en définissant explicitement PDO::MYSQL_ATTR_USE_BUFFERED_QUERY sur true .
$sql ='SELECT temp_id FROM temp1'; $stmt2 = db::db()->prepare($sql); $stmt2->execute(); $rs2 = $stmt2->fetchAll(PDO::FETCH_ASSOC); $stmt2->closeCursor(); $sql='SELECT COUNT(*) AS valid FROM cities_has_zipcodes WHERE cities_id=:cities_id AND zipcodes_id=:zipcodes_id'; $stmt1 = db::db()->prepare($sql); foreach($data AS $row) { try { $stmt1->execute($row); $rs1 = $stmt1->fetchAll(PDO::FETCH_ASSOC); $stmt1->closeCursor(); syslog(LOG_INFO,'$rs1: '.print_r($rs1[0],1).' '.rand()); syslog(LOG_INFO,'$rs2: '.print_r($rs2[0],1).' '.rand()); } catch(PDOException $e){echo(sql_error($e));} }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!