Przyczyny błędu MySQL 2014 Nie można wykonać kwerendy, gdy aktywne są inne niebuforowane zapytania

Mój serwer obsługuje CentOS 6.4 z MySQL 5.1.69 zainstalowany przy użyciu yum z repozytoriami CentOS, a PHP 5.4.16 zainstalowany przy użyciu yum z repozytoriami ius.Edit3 Uaktualniono do wersji MySQL Server: 5.5.31 Rozproszone przez The IUS Community Project, a błąd nadal istnieje. Następnie zmieniono bibliotekę na mysqlnd i wydaje się, że eliminuje błąd. Mimo to, z tą iz powrotem, trzeba wiedzieć, dlaczego ten błąd tylko czasami się manifestuje.

Podczas korzystania z PDO i tworzenia obiektu PDO za pomocąPDO::ATTR_EMULATE_PREPARES=>false, Czasami pojawia się następujący błąd:

Table Name - zipcodes
Error in query:
SELECT id FROM cities WHERE name=? AND states_id=?
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.
File Name: /var/www/initial_install/build_database.php
Line: 547
Time of Error: Tuesday July 2, 2013, 5:52:48 PDT

Linia 547 to ostatnia linia:

$stmt_check_county->execute(array($data[5],$data[4]));
if(!$county_id=$stmt_check_county->fetchColumn())
{
    $stmt_counties->execute(array($data[5]));
    $county_id=db::db()->lastInsertId();
}
//$stmt_check_county->closeCursor(); //This will fix the error
$stmt_check_city->execute(array($data[3],$data[4]));

Miałem podobny problem kilka lat temu, ale zaktualizowałem go z PHP 5.1 do PHP 5.3 (i prawdopodobnie MySQL również został zaktualizowany), a problem magicznie zniknął, a teraz mam go z PHP 5.5.

Dlaczego manifestuje się tylko wtedy, gdy?PDO::ATTR_EMULATE_PREPARES=>falsei tylko z naprzemienną wersją PHP?

Też to znalazłemcloseCursor() naprawi również błąd. Czy powinno się to zawsze robić po każdymSELECT zapytanie gdziefetchAll() nie jest używany? Zauważ, że błąd nadal występuje, nawet jeśli zapytanie jest podobneSELECT COUNT(col2) która zwraca tylko jedną wartość.

Edytować Nawiasem mówiąc, tak właśnie tworzę moje połączenie. Ostatnio dodałemMYSQL_ATTR_USE_BUFFERED_QUERY=>truejednak nie leczy błędu.Można również użyć następującego skryptu, aby utworzyć błąd.

function sql_error($e,$sql=NULL){return('<h1>Error in query:</h1><p>'.$sql.'</p><p>'.$e->getMessage().'</p><p>File Name: '.$e->getFile().' Line: '.$e->getLine().'</p>');}

class db {
    private static $instance = NULL;
    private function __construct() {}   //Make private
    private function __clone(){}   //Make private
    public static function db() //Get instance of DB
    {
        if (!self::$instance)
        {
            //try{self::$instance = new PDO("mysql:host=localhost;dbname=myDB;charset=utf8",'myUsername','myPassword',array(PDO::ATTR_EMULATE_PREPARES=>false,PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION,PDO::ATTR_DEFAULT_FETCH_MODE=>PDO::FETCH_ASSOC));}
            try{self::$instance = new PDO("mysql:host=localhost;dbname=myDB;charset=utf8",'myUsername','myPassword',array(PDO::ATTR_EMULATE_PREPARES=>false,PDO::MYSQL_ATTR_USE_BUFFERED_QUERY=>true,PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION,PDO::ATTR_DEFAULT_FETCH_MODE=>PDO::FETCH_ASSOC));}
            //try{self::$instance = new PDO("mysql:host=localhost;dbname=myDB;charset=utf8",'myUsername','myPassword',array(PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION,PDO::ATTR_DEFAULT_FETCH_MODE=>PDO::FETCH_ASSOC));}
            catch(PDOException $e){echo(sql_error($e));}
        }
        return self::$instance;
    }
}

$row=array(
    'zipcodes_id'=>'55555',
    'cities_id'=>123
);
$data=array($row,$row,$row,$row);

$sql = 'CREATE TEMPORARY TABLE temp1(temp_id INT UNSIGNED NOT NULL AUTO_INCREMENT, PRIMARY KEY (temp_id) )';
db::db()->exec($sql);

$sql='SELECT COUNT(*) AS valid FROM cities_has_zipcodes WHERE cities_id=? AND zipcodes_id=?';
$stmt1 = db::db()->prepare($sql);

$sql ='SELECT temp_id FROM temp1';
$stmt2 = db::db()->prepare($sql);

foreach($data AS $row)
{
    try
    {
        $stmt1->execute(array($row['zipcodes_id'],$row['cities_id']));
        $rs1 = $stmt1->fetch(PDO::FETCH_ASSOC);
        //$stmt1->closeCursor();
        syslog(LOG_INFO,'$rs1: '.print_r($rs1,1).' '.rand());
        $stmt2->execute();
        $rs2 = $stmt2->fetch(PDO::FETCH_ASSOC);
        syslog(LOG_INFO,'$rs2: '.print_r($rs2,1).' '.rand());
    }
    catch(PDOException $e){echo(sql_error($e));}            
}
echo('done');

questionAnswers(4)

yourAnswerToTheQuestion