Сброс указателя массива в результатах 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]
}

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

Ответы

Ответ 1

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

$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
}

Ответ 2

fetch — Fetches the next row from a result set

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

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

Ответ 3

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

$pdo_copy = clone $pdo;

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

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

Ответ 4

В соответствии с инструкцией 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

Ответ 5

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