Как пройти объект PDOStatement, т.Е. Получить первый, последний предыдущий следующий и т. Д.?

#php #object #resultset #reusability #pdostatement

#php #объект #набор результатов #возможность повторного использования #pdo

Вопрос:

Я снова и снова пытаюсь получить доступ к данным на веб-странице. Есть ли лучший способ? некоторые вещи, такие как movetofirst(), movetolast(), movetoprevious(), movetonext(), могли бы быть хорошими.

прямо сейчас я извлекаю результирующий набор в виде массива (используя fetchall()) и повторно использую массив снова и снова.

Можно ли сделать что-то вроде приведенного ниже? Мне не нужно выполнять запрос снова и снова. храните данные в массиве и потребляйте ресурсы, если результат / массив состоит из многих сотен строк.

 $sql = 'SELECT cityname, statename FROM TBLPLACES ORDER BY cityname, statename';
$stmt = $conn->query($sql);
if ($stmt) {
    while($row=$stmt->fetch()){
       // do some thing
    }

    // do some more thing
    //
    // now here, can i access same $stmt object
    // to fetch resultset again without executing
    // $stmt = $conn->query($sql); again ?
    // (no change in query sql, need to fetch the same static data again.)
    //
    // something like below will be nice.
    //
    // $stmt->movetofirst();
    // while($row=$stmt->fetch()){
    //   do some thing;
    // } 
}
  

Комментарии:

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

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

3. привет n.b, phihag и mishu, конечно, с array я могу проходить столько раз, сколько пожелаю, в любой последовательности. если результат запроса состоит из тысяч строк, то мне нужен огромный массив (т.Е. Пространство памяти), которого я хочу избежать.

Ответ №1:

Чтобы получить последний результат, вы можете сделать:

$row = $stmt->fetch(PDO::FETCH_NUM, PDO::FETCH_ORI_LAST);

Или напишите номера строк вручную. PDO::FETCH_ORI_* Здесь другие константы, но, по сути, вы хотите уделять больше внимания 2-му и 3-му параметрам в методе PDOStatement::fetch().

Ответ №2:

Просто используйте fetchAll , чтобы получить весь результат в массиве:

 $sql = 'SELECT cityname, statename FROM TBLPLACES ORDER BY cityname, statename';
$stmt = $conn->query($sql);
// You should not silently ignore errors.
// Set PDO error mode to PDO::ERRMODE_EXCEPTION to handle query failure
$data = $stmt->fetchAll();

foreach ($data as $row) {
  // Do one thing
}
foreach ($data as $row) {
  // Do another thing
}
  

Комментарии:

1. привет, я думаю, что лучше всего показать, как получить доступ к свойствам также в forEach

Ответ №3:

с PDO вам не нужно создавать запрос для получения предыдущего или следующего, попробуйте juste : PDO::CURSOR_SCROLL

ссылка (пример 2): http://php.net/manual/en/pdostatement .fetch.php