Ошибка - Cannot execute queries while other unbuffered queries are active.

Всем привет )

При выполнении такого куска кода


$id = $_GET['id'];

		// get current menu order

		$sql = "SELECT menuOrder FROM categories WHERE id = $id ";

		

		$cmd =  app()->db->createCommand($sql);

		/*@var $cmd CDBCommand */

		//$cmd->bindValue('id',$id);

		$menuOrder = $cmd->queryScalar();

		

		

		$oldMenuOrder = $menuOrder + 1;

		

		// get id of next 

		$sql1 = "UPDATE categories SET menuOrder = menuOrder -1 WHERE menuOrder = $menuOrder +1 ";

		app()->db->createCommand($sql)->execute();

		 

		$sql2 = "UPDATE categories SET menuOrder = $oldMenuOrder WHERE id = $id";

		app()->db->createCommand($sql)->execute();

Получаю ошибку:

Платформа Winxp, Версия php 5.3.0, MySql 5.1.39-community, получаю эту ошибку при выполнении нескольких запросов к базе подряд, такого не случается если закрывать, а потом снова открывать новое соединение к БД.

Кто сталкивался? Причём на хостинге у меня нет таких проблем, выполняю подряд несколько SELECT, UPDATE, TRUNCATE и всё ок. Под виндой же всё ругается на unbuffered queries. Где ставить эту PDO::MYSQL_ATTR_USE_BUFFERED_QUERY перменную в случае конфига Yii ?

Спасибо )

Я делал так:

Yii::app()->db->pdoInstance->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);

перед своими проблемными запросами

НО оказщалось проще попросить хостера обновить БД (выделенный сервер у меня), потому что вылазили и другие обезьянки. Я не помню какие правда :)

помню что это было не единственно проблемой

сорри, не дочитал пост твой. Поменять домашнюю базу лучше чем ставить такие костыли :)

У меня дома 5.1.37

на сервере 5.1.32

Все ОК и там и там…

дома пхп 5.3, нормально работает (стоит связка XAMPP)


$sql = "SELECT menuOrder FROM categories WHERE id = $id ";

Возможно что-то вроде:


$sql = "SELECT menuOrder FROM categories WHERE id = $id LIMIT 1";

Вообщем это ужасный баг, самый самый дурной баг похоже ))

Искал в инете, то ли библиотека PDO гонит, то ли конкретный драйвер mysql (libmysql ?? ). Хотя вроде 5.3 уже используется нативный драйвер mysqlnd. Это случается только вроде на WIN. На хостинге такого нет )

KJedi способ Yii::app()->db->pdoInstance->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true) - ничего не меняет.

Freezy - limit в конце запроса тоже ни к чему не приводит.

И явное закрытие курсора после SELECT’a тоже не помогает.

Не знаю что делать, поставлю XAMPP оттуда дёрну либы может.

Боже какая глупость ))

Я в такие дебри залез, что снёс свою установку, ставил новый пхп, теперь XAMPP, и очень удивился когда ошибка повторилась…

А дело в том что я выполняю (execute()) первый селект запрос. Да ещё и потом. А надо было выполнять $sql1, $sql2 соответсвенно )))

тема закрыта

PDO не поддерживает 2 и более параллельно запущенных запроса.

Повезло, что получилось решить проблему простым способом. Есть ситуации, когда такой подход не работает

Например, в проекте ситуация: Выполняется sql-запрос, по которому должен построится CGridView, в контроллере получаем количество строк, полученных в результате выполнения (CDbDataReader::rowCount), формируется DataProvider. В зависимости от таблицы в DataProvider-е заполняются данные о пагинации (количество записей на одной странице). Проблема была в том, что между выполнением sql-выражения и построением таблицы в представлении выполняется еще несколько sql-выражений для генерации выпадающих списков.

Изначально решалось выгрузкой всех результатов sql-выражения в контроллере на этапе запроса. То есть все результаты запроса загружались в переменную в контроллере, после чего CArrayDataProvider попадал в CGridView. Все работало нормально, пока данных было не очень много, после 20 000 строк, перестало хватать 128мб на 1 клиента.

В итоге решено было следующим образом:

Сделано 2 класса-эмулятора MyPDO и MyPDOStatement. Классы полностью реализовывали функционал PDO и PDOStatement соответственно, но через mysqli и mysqli_result, при помощи mysqli->multi_query решилась проблема параллельного выполнения запросов.

Соответственно в конфиге в секции db добавил свойство ‘pdoClass’ => ‘MyPDO’


Если кого-то еще интересует этот вопрос, могу выложить код классов в общий доступ