Qu'est-ce qui provoque une erreur PDO Impossible d'exécuter des requêtes alors que d'autres requêtes sans tampon sont actives?

J'ai le code suivant:

$dbh = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$dbh->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$stmt = $dbh->prepare("SELECT 1");
$stmt->execute();
$result = $stmt->fetch();

$stmt->execute();
$result = $stmt->fetch();

$stmt = $dbh->prepare("SELECT 1");
$stmt->execute();
$result = $stmt->fetch();

Cependant, pour certaines raisons, j'obtiens l'erreur suivante lors de l'exécution de la deuxième déclaration préparée à l'avance:

Fatal error: Uncaught exception 'PDOException' with message
'SQLSTATE[HY000]: General error: 2014 Ne peut pas exécuter des requêtes tout en
d'autres barrettes de mémoire les requêtes sont actifs. Pensez à utiliser
PDOStatement::fetchAll(). Alternativement, si votre code n'est jamais
va à l'encontre de mysql, vous pouvez permettre à une requête de mise en mémoire tampon par la mise en
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribut.'

Je sais ce que cette erreur signifie et comment résoudre le problème (de le faire) unset($stmt); ou $stmt->closeCursor();), donc je ne suis pas à la recherche d'une solution de comment le faire fonctionner. À partir de ce que je comprends, elle est généralement causée par faire fetch au lieu de fetchAll et de ne pas récupérer tous les résultats. Toutefois, dans ce cas, il y a un seul résultat et elle est récupérée. Aussi, si je n'exécuter la première instruction préparée une fois, l'erreur ne se produit pas. Il ne se produit que lors de la première exécution de l'instruction deux fois. De plus, cela ne se produit lorsque PDO::ATTR_EMULATE_PREPARES est false.

Donc ma question est, quelle est la cause de l'erreur ci-dessus à se produire dans ce cas? Il ne semble pas être différente de toute autre requête que j'ai jamais exécutée.

J'ai testé sur deux Ubuntu 13.10 serveurs, Debian et CentOS et produisent tous le même message d'erreur à l'aide de la valeur par défaut des paquets.

Edit:

Pour répondre à Ryan Vincent commentaire, je suis un complet mysqli noob, mais je crois que ce que j'ai ci-dessous est à peu près équivalent à l'exemple ci-dessus. S'il vous plaît corrigez-moi si je me trompe. Cependant, il ne produit pas d'erreurs, de sorte qu'il semble être un AOP seule erreur:

$mysqli = new mysqli($host, $user, $pass, $dbname);
if ($mysqli->connect_errno) {
    die("Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error);
}

if (!($stmt = $mysqli->prepare("SELECT 1"))) {
     die("Prepare 1 failed: (" . $mysqli->errno . ") " . $mysqli->error);
}

if (!$stmt->execute()) {
    die("Execute 1 failed: (" . $stmt->errno . ") " . $stmt->error);
}
$stmt->store_result();
$stmt->bind_result($col1);
$stmt->fetch();

if (!$stmt->execute()) {
    die("Execute 2 failed: (" . $stmt->errno . ") " . $stmt->error);
}
$stmt->store_result();
$stmt->bind_result($col1);
$stmt->fetch();

if (!($stmt = $mysqli->prepare("SELECT 1"))) {
    //The following line is what fails in PDO
    die("Prepare 2 failed: (" . $mysqli->errno . ") " . $mysqli->error);
}

if (!$stmt->execute()) {
    die("Execute 3 failed: (" . $stmt->errno . ") " . $stmt->error);
}
$stmt->store_result();
$stmt->bind_result($col1);
$stmt->fetch();

source d'informationauteur Mike