Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Непонятный глюк с PDO 
:(
    Опции темы
mlitkin
Дата 27.3.2008, 08:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 10.7.2007

Репутация: нет
Всего: нет



Странные вещи творятся... Вот такой скрипт отрабатывает:

Код

$pdo = new PDO("mysql:dbname=im_net;host=localhost", "root", "a");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$query = $pdo->prepare("select NAME from SYS_SYNC_TABLES");
$query->execute();
$res = $query->fetchAll();
echo $res[0][NAME]."<br>";

$query = $pdo->prepare("call SYS_GET_SYNC_TABLE_COLUMNS(1)");        
$query->execute();
$res = $query->fetchAll();
foreach ($res as $col)
echo "------".$col[NAME]."<br>";


А если сначала вызвать ХП, а потом сделать селект, то уже ругается:
Код

$pdo = new PDO("mysql:dbname=im_net;host=localhost", "root", "a");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$query = $pdo->prepare("call SYS_GET_SYNC_TABLE_COLUMNS(1)");        
$query->execute();
$res = $query->fetchAll();
foreach ($res as $col)
echo "------".$col[NAME]."<br>";

$query = $pdo->prepare("select NAME from SYS_SYNC_TABLES");
$query->execute();
$res = $query->fetchAll();
echo $res[0][NAME]."<br>";


Вот текст ошибки:
Fatal error: Uncaught exception 'PDOException' with message '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

Не подскажите, в чем тут дело?
PM MAIL   Вверх
skyboy
Дата 27.3.2008, 09:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 14
Всего: 260



аттрибут
Цитата(mlitkin @  27.3.2008,  07:51 Найти цитируемый пост)
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY

какое значение имеет?
впрочем, ещё вопрос - как получить все данные при выполнении небуфферизированного запроса. у меня логика такая, что fetchAll должен был бы получать все строки небуфферизированного заропса... впрочем, я могу ошибаться и fetchAll может для небуфферизированного запроса получать только последнюю запись. попорбуй вместо fetchAll использовать конструкцию типа
Код

while($row= $query->fetch())
...


Это сообщение отредактировал(а) skyboy - 27.3.2008, 09:21
PM MAIL   Вверх
mlitkin
Дата 27.3.2008, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 10.7.2007

Репутация: нет
Всего: нет



Параметр PDO::MYSQL_ATTR_USE_BUFFERED_QUERY установлен в true, но его переустановка ситуации не менят - ошибка все равно выпадает :(
Использование fetch() вместо fetchAll() тоже не помогло. Вот такой скрипт по-прежнему ругается:
Код

$query = $pdo->prepare("call SYS_GET_SYNC_TABLE_COLUMNS(1)");        
$query->execute();
while ($row = $query->fetch())
  echo "------".$row[NAME]."<br>";

$query = $pdo->prepare("select NAME from SYS_SYNC_TABLES");
$query->execute();
$row = $query->fetch();
echo $row[NAME]."<br>";

PM MAIL   Вверх
IZ@TOP
Дата 28.3.2008, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: 4
Всего: 73



mlitkin, а можно структуру таблицы и процедуры в студию?


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
mlitkin
Дата 1.4.2008, 01:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 10.7.2007

Репутация: нет
Всего: нет



Вот текст процедуры:
Код

CREATE DEFINER=`root`@`localhost` PROCEDURE `SYS_GET_SYNC_TABLE_COLUMNS`(TABLE_ID int)
BEGIN
    /* Возвращает список столбцов таблицы для синхронизации */
    select c.ID, c.NAME, upper(ic.DATA_TYPE) as DATA_TYPE,
        ifnull((select kcu.ORDINAL_POSITION from INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc, 
            INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu
        where upper(tc.TABLE_NAME) = upper(t.NAME)
        and tc.CONSTRAINT_TYPE = 'PRIMARY KEY'
        and kcu.CONSTRAINT_SCHEMA = tc.CONSTRAINT_SCHEMA
        and kcu.TABLE_NAME = tc.TABLE_NAME
        and kcu.CONSTRAINT_NAME = tc.CONSTRAINT_NAME
        and kcu.COLUMN_NAME = c.NAME), 1000) as PK_ORD
    from SYS_SYNC_COLUMNS c, INFORMATION_SCHEMA.COLUMNS ic, SYS_SYNC_TABLES t
    where t.ID = TABLE_ID and upper(ic.TABLE_NAME) = upper(t.NAME)
        and c.TABLE_ID = t.ID and c.NAME = ic.COLUMN_NAME
    order by PK_ORD, ic.ORDINAL_POSITION;
END


В процедуре используется таблица SYS_SYNC_TABLES, из которой я впоследствии делаю select. Я так понимаю, что там какая-то блокировка на нее ставится... А каким образом ее снять?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Базы Данных | Следующая тема »


 




[ Время генерации скрипта: 0.0484 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.