Многократное использование объекта PDO

prometex

Новичок
Многократное использование объекта PDO

Столкнулся с аналогичной проблемой http://bugs.php.net/bug.php?id=44576

А именно, многократное использование объекта результата одного запроса. Возможно ли победить?
 

FractalizeR

Новичок
Внимательно читаем документацию:
PDOStatement->fetchAll() returns an array containing all of the remaining rows in the result set

Так что это не баг, а фича.

Только я не пойму, зачем дважды проходить по одному и тому же rowset в одном и том же скрипте? Мне кажется, это признак некорректного дизайна. Подробнее задачу опишите, пожалуйста. Зачем вам это нужно?
 

prometex

Новичок
FractalizeR
Дело в том, что этот метод очень полезен, даёт много возможностей по группировке результата запроса. Мне сперва нужно получить массив сгруппированный по одному полю, затем по другому и т.д. А вызвать этот метод можно только один раз, вот я и подумал, что может есть способ обойти это ограничение.

А вот насчёт баг это или нет, можно ещё поспорить :)
 

FractalizeR

Новичок
Это, конечно же, не баг. В документации сказано, что fetchAll получает все оставшиеся ряды. После fetchAll курсор устанавливается за последней записью, так что множество оставшихся рядов - пустое.

Я не вижу смысла дважды проходить по результату запроса. Проще выполнить запрос, получить данные в массив с помощью fetchAll, затем unset-нуть рекордсет, чтобы память не занимал и дальше работать уже с массивом.
 

prometex

Новичок
Это не так. Я пробовал передвигать курсор, не работает. Если отдана строка методом fetch() она сразу исчезает, видимо php таким образом сразу освобождает память.
 

FractalizeR

Новичок
Что значит - не так? Что именно не так? Вы невнимательно читаете документацию.

PDOStatement->fetch()
To request a scrollable cursor for your PDOStatement object, you must set the PDO::ATTR_CURSOR attribute to PDO::CURSOR_SCROLL when you prepare the SQL statement with PDO->prepare().
 

prometex

Новичок
Да делал я это всё. Двигал курсор назад, вперёд, дело не в этом. Можно двигать курсор только по тем рядам, которые ещё не были получены методом fetch(). Стоит вызвать метод и ряд исчезает из результата, второй раз получить его нельзя.

Ладно, проехали. Спасибо за Ваши ответы и проявленный интерес.
 

FractalizeR

Новичок
скроллируемые курсоры в PDO_MYSQL в настоящее время не работают. Несмотря на то, что драйверу опция передается - он ее тихо игнорирует. Все же остается вопрос - почему не получить один раз датасет в массив, а потом манипулировать им?
 

prometex

Новичок
Автор оригинала: FractalizeR
скроллируемые курсоры в PDO_MYSQL в настоящее время не работают...
Прекрасно работают в MySQL 5.1.25
Все же остается вопрос - почему не получить один раз датасет в массив, а потом манипулировать им?
Потому что эта функция, помимо прочего, умеет группировать массив, без неё приходится запускать по несколько циклов, перебирая каждое значение, что сказывается на производительности при больших объёмах. А в PHP подобной функции нет.
 
Сверху