2013-02-15 1 views
1

Получение Zend\Db\Adapter\Exception\RuntimeException на файлдважды итерации над PDO базы данных ResultSet, выбрасывая исключение в рамках ZEND 2

\library\Zend\Db\Adapter\Driver\Pdo\Result.php:159 

мой код настройки базы данных

array(
    'db' => array(
     'driver'   => 'Pdo', 
     'pdodriver'  => 'mysql',    
     'driver_options' => array(
      PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'', 
      'buffer_results' => true 
     ), 
     'username'  => 'root', 
     'password'  => '', 
     'host'   => 'localhost', 
     'dbname'   => 'db_name', 
), 
) 

результат выборки код

$statement = $this->sql->prepareStatementForSqlObject($select); 
$results = $statement->execute(); 

и я попробовал $results->buffer(); & & $results->rewind()

Мой итерация код подобен

foreach ($results as $result){  
     // code goes here .. 
} 
.... 

foreach ($results as $result){  
     // code goes here .. 
} 

ответ

4

Исключение вы видите говорит:

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

Поэтому простым решением было бы сохранить результаты в массиве, после чего вы можете выполнять итерацию по tha t несколько раз.

$records = array(); 

foreach ($results as $result) 
{ 
    $records[] = $result; 
} 
+0

После этой же проблемы и с использованием того же решения, что и в этом ответе, я нашел [iterator_to_array] (http://php.net/) manual/en/function.iterator-to-array.php), которая достигает тех же результатов. Определенно ударяет написание 5 строк шаблона каждый раз, когда вам нужен такой набор результатов. – floorz

9

Это происходит потому, что ResultSet ПДО Только вперед (так что вы не можете перемотать его).

Вы можете попробовать окружив его с ResultSet:

$results = $statement->execute(); // generate your results 

$resultSet = new ResultSet; // Zend\Db\ResultSet 
$resultSet->initialize($results); 

// You should now be able to iterate over this multiple times.. 
foreach($resultSet as $row) { 
    // .. 
} 

// You can now buffer if you need.. 
$resultSet->buffer(); 
// Or get an array of all items 
$arrayOfResults = $resultSet->toArray(); 
+2

Это решение кажется мне лучше, потому что вы продолжаете обменивать ResultSet в объекте ZF2 для управления. Подход @drbeza следует рассматривать в методе toArray(), если это было намерение команды ZF2. –