Постраничный вывод записей из БД

Невозможно представить себе сайт (не визитную карточку) с большим количеством информации и чтобы вся эта информация хранилась в виде отдельных статических страниц, а не выводилась из базы данных динамическим образом. Однако, бывает что необходимо вывести большое количество записей, но в таком случае страница становиться очееень большой в высоту, что как минимум неудобно.

Данную проблему решить очень просто – необходимо всего лишь сделать постраничный вывод записей, например, по 20 записей на страницу. Как это сделать – об этом я и хочу вам сейчас рассказать.

Предположим: нам надо вывести из таблицы “news” все записи, разбив их на страницы по 20 новостей на каждой, если это потребуется.

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

Добавлено: Итак, начнём с подключения к базе данных, ведь именно с ней мы и будем работать в дальнейшем.

$link=mysql_connect("localhost","user","password"); // Подключаемся к серверу БД расположенном по адресу localhost используя логин user и пароль password.
mysql_select_db("dbname"); // Подключаемся к базе данных с именем "dbname"

Для начала, нам необходимо проверить, запросил ли пользователь какую-либо определённую страницу или нет. Номер запрашиваемой страницы будет передаваться в переменной “page”, передаваемой методом get.

if(isset($_GET['page'])) { $page=$_GET['page']; } else { $page="0"; } 

Затем, мы делаем запрос в базу данных, где просим вернуть 20 записей, начиная с определённой записи. Этой самой определённой записью, будет запись, которая является первой записью на странице, и её номер будет определяться как: номер страницы минус единица и умноженный на количество записей на страницу. Например: первая запись на третьей странице будет иметь номер 2*20=40, при условии вывода по 20 записей на страницу.

$query=mysql_query("SELECT * FROM news ORDER BY id DESC LIMIT ".($page*20).",20");

Далее используя цикл while() выводим на экран необходимую нам информацию в необходимом виде. Эту часть кода я опишу кратко и очень условно.

while($news=mysql_fetch_array($query)) {
        echo "<strong>".$news['title']."</strong><p>".$news['messaage']."</p>";
}

Всё, часть задачи мы решили: вывели на экран определённое количество записей, начиная с определённой записи. Теперь осталась ещё одна задача: сделать возможность навигации по страницам. Для этого нам надо узнать, сколько всего записей имеется в таблице. Сделаем это таким образом.

$q=mysql_query("SELECT * FROM news");

Зная количество записей мы можем определить сколько страниц у нас будет. Для этого мы разделим общее количество записей на количество записей, выводимых на одной странице, а затем полученное число (скорее всего дробное) мы округлим до целого в бОльшую сторону.

$numpages=ceil(mysql_num_rows($q)/20);

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

if($numpages > 1) {
	if($page!=0) { echo "<a href=\"/index.php?page=0\">Первая</a> "; }
	for($i=0;$i<$numpages;$i++) {
		if($page != $i) { echo "<a href=\"/index.php?page=".$i."\">".($i+1)."</a> "; }
		else { echo "<strong><a href=\"/index.php?page=".$i."\">".($i+1)."</a></strong> "; }
	}
	if($page!=($numpages-1)) { echo "<a href=\"/index.php?page=".($numpages-1)."\">Последняя</a>"; }
}
	echo "<a href=\"/index.php?gotopage=$numpagess\">Последняя</a>";
}

Во второй и седьмой строках кода, представленного выше, мы выводим постоянные ссылки на первую и последнюю страницы соответственно. В третьей строке мы задаём цикл от единицы до n-1, где n – количество страниц. В теле данного цикла (4-5 строчки) мы выводим ссылку на каждую страницу, с указанием номера данной страницы, предварительно проверив, является ли ссылка, ссылкой на текущую страницу. Если условие выполняется, то ссылка выделяется жирным шрифтом. Проще говоря, мы выделяем жирным ссылку на ту страницу, на которой пользователь находиться в данный момент.

Добавлено: Теперь нам остаётся лишь закрыть соединение с базой данных и очистить память, от теперь уже ненужной информации. В первой строке представленного ниже кода, мы очищаем память от массива данных, содержащегося в переменной $query – это все наши записи из базы данных. Во второй строке, мы закрываем соединение с базой данных.

mysql_free_result($query);
mysql_close($link);

Вот и всё, как видите, ни чего сложного здесь нет. Требуется лишь немного смекалки и небольших знаний php.

Удачи вам, в ваших разработках!
________________
Отдохните от работы и потратьте пару часов своего свободного времени на лучшие игры различных жанров и направлений: от одиночных стрелялок и симуляторов, до многопользовательских ролевых и стратегических игр.

28 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
13 лет назад

А можно всё же описать момент подключение и отсоединения от базы данных?

13 лет назад

Ругается вот так:
Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING, expecting ‘,’ or ‘;’ in Z:\home\work.pan\www\testim.php on line 32

на эту строчку:
if($page != $i) { echo ““.$i+1.”“; }

Ответить на  Илья
13 лет назад

🙂 спасибо!

Макс
13 лет назад

Огромое “ДЯКУЮ”!! 😉

артёмка
12 лет назад

помогите! У меня страницы отображаются так:
первая()+11+12+1последняя
🙁

Denizz
12 лет назад

Домомента вывода кол-ва статей все норм.
А с момента где прописываю ссылки ругается на эту строку:
if($page != $i) { echo ““.$i+1.” “;

Что бы это могло быть?

Denizz
Ответить на  Denizz
12 лет назад

с этим разобрался, нужно было кавычки экранировать
теперь на закрытие базы плюется
mysql_close($link);

12 лет назад

Denizz у меня тожесамое( на закрытие базы

Кирилл
12 лет назад

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

Кирилл
12 лет назад

да кстати забыл спросить что значит нулевая страница?
Первая 0 2 Последняя

и почему при нажатии на последнюю

Not Found

The requested URL /test.php was not found on this server.

зачем кривой скрипт выкладывать?

Кирилл
12 лет назад

ну и где результат то?

Кирилл
12 лет назад

ок спасибо