Сброс указателя массива в результатах PDO - PullRequest
19 голосов
/ 24 февраля 2012

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

mysql_data_seek($result,0);

Используя методы PDO, я не уверен, как сделать то же самое. Код ниже, как я пытаюсь это сделать. Первый цикл while работает нормально, но второй цикл 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]
}

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

Ответы [ 6 ]

25 голосов
/ 25 февраля 2012

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

$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
}
4 голосов
/ 18 марта 2017

Согласно руководству по 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]
}

source: http://php.net/manual/en/pdo.query.php

3 голосов
/ 25 февраля 2012
fetch — Fetches the next row from a result set

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

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

2 голосов
/ 29 декабря 2014

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

$pdo_copy = clone $pdo;

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

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

1 голос
/ 18 мая 2018

Вы должны указать оператору, что его нужно прокручивать, указав PDO::CURSOR_SCROLL в качестве опции при подготовке.И затем вы используете PDO::FETCH_ORI_FIRST, чтобы снова добраться до первого элемента после достижения конца, чтобы вы могли начать все сначала.

Полный код:

$pdo = new PDO('mysql:host=' . $host . ';dbname='.$database, $username, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

//Making cursor scrollable
$options = array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL);
$stmt = $pdo->prepare('SELECT * FROM mytable WHERE active = 1 ORDER BY name ASC',
                $options);

$stmt->setFetchMode(PDO::FETCH_ASSOC);
$stmt->execute();

while($row = $stmt->fetch())
{
    //do something starting with row[0]
}

//For the first row we use PDO::FETCH_ORI_FIRST 
//to get the first element again. This will also 
//move the cursor to that element
$first = true; 
while($row = $stmt->fetch(null, $first ? PDO::FETCH_ORI_FIRST : PDO::FETCH_ORI_NEXT)))
{
    $first = false;
    //do something else starting with row[0]
}
0 голосов
/ 19 сентября 2014
if($stmt->fetchColumn() >= 0)
{
    $stmt->execute(); //Reset cursor
    while($rs = $stmt->fetchObject())
    {
        echo "Data: ".$rs->data;
    }
}
else
{
    echo '0';
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...