Сброс указателя массива в результатах PDO

У меня возникли проблемы с переходом от методов SELECT MySQL к методам PDO. Я хочу выполнить итерацию по выделенному массиву дважды, начиная с нулевой строки. В mysql я бы использовал:

mysql_data_seek($result,0); 

Используя методы PDO, я не уверен, как выполнить одно и то же. Ниже приведен код, как я пытаюсь это сделать. Первый цикл while работает нормально, а второй, пока цикл ничего не возвращает. Может кто-нибудь, пожалуйста, скажите мне, где я ошибаюсь?

 $pdo = new PDO('mysql:host=' . $host . ';dbname='.$database, $username, $password); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $stmt = $pdo->prepare('SELECT * FROM mytable WHERE active = 1 ORDER BY name ASC'); $stmt->setFetchMode(PDO::FETCH_ASSOC); $stmt->execute(); while($row = $stmt->fetch()) { //do something starting with row[0] } while($row = $stmt->fetch()) { //do something else starting with row[0] } 

Спасибо за вашу помощь.

Solutions Collecting From Web of "Сброс указателя массива в результатах PDO"

Сохраните результаты в массиве и затем дважды запустите этот массив.

 $pdo = new PDO('mysql:host=' . $host . ';dbname='.$database, $username, $password); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $stmt = $pdo->prepare('SELECT * FROM mytable WHERE active = 1 ORDER BY name ASC'); $stmt->setFetchMode(PDO::FETCH_ASSOC); $stmt->execute(); $rows = $stmt->fetchAll(); foreach ($rows as $r) { // first run } foreach ($rows as $r) { // seconds run } 
 fetch — Fetches the next row from a result set 

поэтому, когда он выходит из первого, пока он уже прибыл в последний элемент вашего набора результатов, поэтому второй пока ничего не возвращает.

используйте fetchAll, чтобы сохранить все ваши результаты, а затем пройти через них.

иногда сохранение результата fetchAll () не является опцией. Вместо этого вы можете просто клонировать объект pdo перед вызовом fetchAll () следующим образом.

 $pdo_copy = clone $pdo; $num_rows = count($pdo_copy->fetchAll()); 

Теперь я все еще могу использовать объект pdo для выполнения операторов типа fetchObject ();

Согласно также руководству php, вы можете выдать запрос несколько раз, если вы подготовите объект PDOStatement с помощью PDO :: prepare (), вы можете выдать инструкцию с несколькими вызовами PDOStatement :: execute (). Таким образом, ваш код будет выглядеть так.

 $stmt = $pdo->prepare('SELECT * FROM mytable WHERE active = 1 ORDER BY name ASC'); $stmt->setFetchMode(PDO::FETCH_ASSOC); //First execute $stmt->execute(); while($row = $stmt->fetch()) { //do something starting with row[0] } //Second execute $stmt->execute(); while($row = $stmt->fetch()) { //do something else starting with row[0] } 

источник: http://php.net/manual/en/pdo.query.php

 if($stmt->fetchColumn() >= 0) { $stmt->execute(); //Reset cursor while($rs = $stmt->fetchObject()) { echo "Data: ".$rs->data; } } else { echo '0'; }