$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 ?
Вообщем это ужасный баг, самый самый дурной баг похоже ))
Искал в инете, то ли библиотека 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 оттуда дёрну либы может.
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’
Если кого-то еще интересует этот вопрос, могу выложить код классов в общий доступ