#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