Многократные операторы PDO в одном запросе-вызове заканчиваются ошибкой "небуферизованными запросами" - PullRequest
3 голосов
/ 14 февраля 2011

Я пытаюсь реализовать некоторые вложенные операции над множествами в PHP / PDO для MySQL. После выполнения операции вставки (как указано здесь: http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/) Я не могу выполнить другой запрос из-за ошибки HY000 / 2014:

Невозможно выполнить запросы, пока другие небуферизованные запросы активны. Рассмотреть возможность использования PDOStatement :: fetchAll (). В качестве альтернативы, если ваш код только когда-нибудь побежишь против mysql, ты может включить буферизацию запроса, установив PDO :: MYSQL_ATTR_USE_BUFFERED_QUERY атрибут.

Код, который выдает ошибку (ошибка выдается в последнем «SELECT * FROM tree» внизу кода):

// insert a node into a nested set as child
$queryParts = array(
    'LOCK TABLE tree WRITE',
    'SELECT @myLeft:= lft FROM tree WHERE id = :parentuid',
    'UPDATE tree SET rgt = rgt + 2 WHERE rgt > @myLeft',
    'UPDATE tree SET lft = lft + 2 WHERE lft > @myLeft',
    'UPDATE tree SET lft = @myLeft + 1, rgt = @myLeft + 2 WHERE id = :childuid',
    'UNLOCK TABLES',
);

$parentuid = $parent->getUid();
$childuid = $node->getUid();

$stmt = self::$connection->prepare(join(";\n", $queryParts) . ';') or die (print_r(self::$connection->errorCode(),1));
$stmt->bindParam(':parentuid', $parentuid);
$stmt->bindParam(':childuid', $childuid);

$res = $stmt->execute() or die (print_r($stmt->errorCode(),1));

// that does not help :(
if ($res) {
    do {
        $stmt->fetchAll(); // empty array
        $stmt->closeCursor();
    } while($stmt->nextRowset());
}

// is not executed
$rset = self::$connection->query('SELECT * FROM tree')
     or die (print_r(self::$connection->errorInfo(),1)); // that kills the code
while($row = $rset->fetchObject()) {
    var_dump($row);
}

По моему мнению, нет открытого запроса. Как решить эту ошибку? В настоящее время я застрял, поэтому любая помощь будет принята с благодарностью:)

1 Ответ

0 голосов
/ 31 октября 2018

Ошибка «Невозможно выполнить запросы, когда другие небуферизованные запросы активны» возникает, если запрос содержит несколько операторов, разделенных точкой с запятой и выполняется в небуферизованном режиме.

Решение будет следующим:

  • выполнять каждую часть запроса отдельно, каждая часть должна быть одним запросом без точки с запятой ";"
  • или переключиться в буферный режим.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...