Пагинация в PHP

12
[Удален]
1638

Возник вопрос по поводу разбивки на страницы спарсенных из xml данных.


<?php
$xml = simplexml_load_file("file.xml");
?>
<table>
<tr>
<th>Название</th>
<th>Размер</th>
</tr>
<?php
foreach ($xml->folder->file as $item) {
echo "<tr>";
echo "<td>", $item->link, "</td>";
echo "<td>", $item->size, "</td>";
echo "</tr>";
}
?>
</table>

Знаю что общее количество выводимых элементов можно получить так:


$all = count($xml);

И например положить в переменную желаемое количество элементов, которые будут выводится на одной странице.


$col = 30;

А вот что с ними делать дальше ума не приложу. Смотрел как реализовано в cms, но для меня это слишком сложный код. Понимаю, что за меня писать никто не будет. Подскажите псевдокодом или может быть есть какая нибудь хитрая функция заточеная под эту задачу.

Милованов Ю.С
На сайте с 24.01.2008
Offline
196
#1

$i=0;

foreach ($xml->folder->file as $item) {

if ($i > $maxLineOnPage)
break;

echo "<tr>";

echo "<td>", $item->link, "</td>";

echo "<td>", $item->size, "</td>";

echo "</tr>";

$i++;

}

Подпись))
M2
На сайте с 11.01.2011
Offline
342
#2

Ну если коротко:

1. Запрашиваем общее количество записей

2. Определяем кол-во записей на одну страницу.

3. Определяем кол-во страниц. Оно равно частному от деления общего кол-ва записей на кол-во записей на одну страницу.

4. Определяем запись, с которой будем выводить данные.

5. Запрашиваем данные начиная от числа, определённого в п.4 заканчивая числом, определённым в п.2.

6. Выводим пагинацию.

Дополнительные меры безопасности:

1. Под указателем страниц будем понимать некий GET-параметр. Пусть $_GET['page'].

2. Если этот параметр меньше первой страницы, устанавливаем в 1.

3. Если этот параметр больше последней страницы, устанавливаем в число, равное последней странице.

------------------- Крутые VPS и дедики. Качество по разумной цене ( http://cp.inferno.name/view.php?product=1212&gid=1 ) VPS25OFF - скидка 25% на первый платеж по ссылке выше
[Удален]
#3
Милованов Ю.С:
$i=0;
foreach ($xml->folder->file as $item) {
if ($i > $maxLineOnPage)
break;

echo "<tr>";
echo "<td>", $item->link, "</td>";
echo "<td>", $item->size, "</td>";
echo "</tr>";
$i++;
}

Это я как понял выполнение скрипта прервётся когда $i станет больше $maxLineOnPage? А как выводить остальные элементы на следующей странице, которые остались в xml?

M2
На сайте с 11.01.2011
Offline
342
#4
getforweb:
Это я как понял выполнение скрипта прервётся когда $i станет больше $maxLineOnPage? А как выводить остальные элементы на следующей странице, которые остались в xml?

Надо выводить список страниц со ссылками, я об этом написал в своём посте.

[Удален]
#5
mark2011:
Ну если коротко:

1. Запрашиваем общее количество записей
2. Определяем кол-во записей на одну страницу.
3. Определяем кол-во страниц. Оно равно частному от деления общего кол-ва записей на кол-во записей на одну страницу.
4. Определяем запись, с которой будем выводить данные.
5. Запрашиваем данные начиная от числа, определённого в п.4 заканчивая числом, определённым в п.2.
6. Выводим пагинацию.

Дополнительные меры безопасности:
1. Под указателем страниц будем понимать некий GET-параметр. Пусть $_GET['page'].
2. Если этот параметр меньше первой страницы, устанавливаем в 1.
3. Если этот параметр больше последней страницы, устанавливаем в число, равное последней странице.

Спасибо, то что нужно. Ушел читать про GET/POST

[Удален]
#6

Появился вопрос, создавать новую тему не буду, спрошу здесь.

Заметил, что если xml документ большого объема, то долго подгружается страничка, так как он полностью грузится в оперативку. Если например документ ~20 мб, то это очень ощутимые тормоза.

Так вот вопрос:

Например если 10 пользователей одновременно заходят на страницу, то как сервер на это будет реагировать?

Получается он загрузит в оперативку: 200 мб = 10 (кол-во пользователей) * 20 мб (вес документа)

или он посмотрит, что есть уже в памяти один экземпляр и будет считывать его?

Блин, надеюсь понятно выразился :)

Милованов Ю.С
На сайте с 24.01.2008
Offline
196
#7

А что мешает провести тест на локалке?

Создаем страницу, которая будет грузить этот самый файл, в конце ставим sleep(60) - прекратить выполнение кода на минуту. Открываем 10 раз эту страницу и смотрим на загрузку оперативки.

[Удален]
#8
Милованов Ю.С:
А что мешает провести тест на локалке?
Создаем страницу, которая будет грузить этот самый файл, в конце ставим sleep(60) - прекратить выполнение кода на минуту. Открываем 10 раз эту страницу и смотрим на загрузку оперативки.

Спс за совет. 10 раз это десять вкладок в браузере?

дани мапов
На сайте с 06.09.2012
Offline
204
#9
getforweb:
Появился вопрос, создавать новую тему не буду, спрошу здесь.

Заметил, что если xml документ большого объема, то долго подгружается страничка, так как он полностью грузится в оперативку. Если например документ ~20 мб, то это очень ощутимые тормоза.

Так вот вопрос:

Например если 10 пользователей одновременно заходят на страницу, то как сервер на это будет реагировать?

Получается он загрузит в оперативку: 200 мб = 10 (кол-во пользователей) * 20 мб (вес документа)
или он посмотрит, что есть уже в памяти один экземпляр и будет считывать его?

Блин, надеюсь понятно выразился :)

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

Написание и доработка скриптов (PHP, MySQL, JavaScript, jQuery) (/ru/forum/811046)
[Удален]
#10

Кому интересно:

Подгружал в 10 вкладок файл размером 30,5 МБ этим скриптом


<?php
simplexml_load_file("file.xml");
sleep(60);
?>

Перед выполнением занятой памяти было 2.74 ГБ

После стало 3.09 ГБ

Получается 0.35 ГБ скушало памяти, и проц тоже грузится прилично 20-25% (у меня core i3)

И ещё апач ошибку выкинул:

Fatal error: Maximum execution time of 30 seconds exceeded
12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий