Intereting Posts
codeigniter не работает на живой странице не найдена ошибка на сервере Строки таблицы раскраски Symfony2 в зависимости от значения базы данных и параметра конфигурации Функция внутри функции.? PHP случайным образом выбирает из списка Использование хеш-функции MD5 и пароля при хранении в базе данных Facebook PHP SDK Загрузить фото Регулярное выражение PHP – получить номер из строки ODBC и SQL Server 2008: не можете использовать подготовленные заявления? PHP Неустранимая ошибка: «Действие SOAP, указанное в сообщении, '', не соответствует действию HTTP SOAP" получение расстояния между двумя точками с помощью google gps api с php показывая самое длинное расстояние для каждого велосипеда и зеленый значок, если более 100 PHP PREG_REPLACE Возврат неверного результата в зависимости от выбранного заказа Как создать кросс-запрос базы данных в PHP? ZF2 – Как изменить страницу ответов на ошибку / 404? Не только шаблон, но и установка новой модели ViewModel Найти объявление глобальной переменной в PHP

Этот результат представляет собой только результирующий набор только вперед, вызов rewind () после перемещения вперед не поддерживается – Zend

В приложении Zend я использую Zend\Db\TableGateway и Zend\Db\Sql для извлечения данных из базы данных MySQL, как Zend\Db\TableGateway ниже.

Модель –

 public function getCandidateEduQualifications($id) { $id = (int) $id; $rowset = $this->tableGateway->select(function (Sql\Select $select) use ($id) { $select->where ->AND->NEST->equalTo('candidate_id', $id) ->AND->equalTo('qualification_category', 'Educational'); }); return $rowset; } 

Посмотреть –

Я просто перебираю $ rowset и echo. Но он дает ошибку при попытке повторить два или более раз. Работает единственная итерация.

Этот результат представляет собой только результирующий набор вперед, вызывающий перемотку () после перемещения вперед не поддерживается

Я могу решить его, загрузив его в другой массив. Но это лучший способ? Есть ли другой способ справиться с этим?

 $records = array(); foreach ($edu_qualifications as $result) { $records[] = $result; } 

РЕДАКТИРОВАТЬ –

$resultSet->buffer(); решил проблему.

Вы получаете это Exception потому что это ожидаемое поведение. Zend использует PDO для получения Zend\Db\ResultSet\Resultset который возвращается Zend\Db\TableGateway\TableGateway . Наборы результатов PDO по умолчанию используют курсор только для прямого ввода, что означает, что вы можете только прокручивать набор один раз.

Для получения дополнительной информации о курсорах проверьте Википедию и эту статью.

Поскольку Zend\Db\ResultSet\Resultset реализует Iterator PHP, вы можете извлечь массив из набора, используя метод Zend\Db\ResultSet\Resultset:toArray() или используя функцию iterator_to_array() . Будьте осторожны, хотя об использовании этой функции на потенциально больших наборах данных! Одна из лучших вещей о курсорах – это то, что они не позволяют вносить все за один раз, если набор данных слишком велик, поэтому бывают случаи, когда вы не захотите вносить все это в массив сразу.

Конечно, похоже, что когда мы используем Mysql и хотим итерации $ resultSet, эта ошибка будет иметь место, b / c Mysqli выполняет только форвардные результирующие наборы (см. Этот пост: ZF2 DB Позиция результата переадресована? )

Я тоже столкнулся с этой проблемой. Но добавив следующую строку, она решила:

 $resultSet->buffer(); 

но в этом упомянутом сообщении предлагается использовать следующую строку. Мне просто интересно, почему, и в чем их отличие:

 $resultSet->getDataSource()->buffer(); 

Это сработало для меня.

 public function fetchAll() { $select = $this->tableGateway->getSql()->select(); $resultSet = $this->tableGateway->selectWith($select); $resultSet->buffer(); $resultSet->next(); return $resultSet; } 
 $sql = new Zend\Db\Sql($your_adapter); $select = $sql->select('your_table_name'); $statement = $sql->prepareStatementForSqlObject($select); $results = $statement->execute(); $resultSet = new ResultSet(); $resultSet->initialize($results); $result = $resultSet->toArray();