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

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

Данную проблему решить очень просто — необходимо всего лишь сделать постраничный вывод записей, например, по 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 комментариев

    1. Конечно можно! 😉 Добавил в пост описание моментов подключения и отключения от БД. Перед добавленными частями добавил фразу «Добавлено:», которая выделена жирным шрифтом.

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

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

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

      1. Если у вас скрипт на что-то «плюётся», то пишите сразу что выдаёт php. Я же не телепат — я не знаю что у вас за проблема. А вот по ошибке php можно было бы догадаться. 😉

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

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

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

    Not Found

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

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

    1. хм. Вечером или завтра утром обязательно проверю. Скрипт отлично и долго мне служил на многих сайтах. Хотя, естественно, при написании поста мог и допустить ошибку.

    1. Слегка доработал скрипт — были изменены только третий отрезок кода и предпоследний. Скопируйте его заново.

      Теперь, при нахождении на первой странице — не показывается кнопка «первая», а при нахождении на последней — «последняя».

      з.ы. К сожалению, скрипт был кривоват, из-за того, что визуальный редактор вордпресса некоторые символы почистил или изменил.

  4. Спасибо за статью, при чтении заметил оишбку в арифметике 😳
    «Например: первая запись на третьей странице будет иметь номер 3*20=60, при условии вывода по 20 записей на страницу.»
    Первая запись на 3й странице будет 41й, а последняя 60я 😉
    з.ы. ещё раз спасибо за статью)

    1. Спасибо, исправил. Статью писал давно и для другого проекта, а когда проект загнулся — нашёл эту статью, спустя некоторое время, и сразу же опубликовал. Тогда вот как-то упустил ошибки.

      Если найдёте ещё — пишите, исправлю.

      Ещё раз спасибо.

  5. Возможно ли сделать постраничную навигацию, не только по записям, а по высоте, тоесть, если текст добегает до n px по высоте, на след страницу

    1. Напрямую нельзя — php не умеет считать высоту.. Разве только если у вас записи фиксированной высоту и банальной математикой считать результирующую высоту..

  6. Вообще это можно сделать только не по пикселям рассчитывать, а по словам

    $text = ‘Напрямую нельзя — php не умеет считать высоту… Разве только если у вас записи фиксированной высоту и банальной математикой считать результирующую высоту…’;

    $text = explode (» «, $text); // режим по словам
    $text_array = array_slice ($text, 0, 10); // от 0 до 10 слов
    $unset_array = implode (» «, $text_array);
    echo $unset_array;

    Выводит 10 слов:
    Напрямую нельзя — php не умеет считать высоту… Разве только
    вот теперь осталось все рассчитать…

  7. Во первых огромное спасибо, урок качественный, но есть вопрос как сделать ORDER BY по двум параметрам с приоритетом на один из?

    1. Ответ для Евгений: Попробуйте что-то типа select * from table order by size desc, name asc;.

      О результатах отпишитесь, т.к., к сожалению, не имею в данный момент возможности проверить данный код на работоспособность.

  8. Я извиняюсь, но у меня немного некорректно работает данный код. а именно на сайте lifecs.in

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

    <?
    echo"\n»;
    echo»»;
    if(!$serv_num==0){
    $i=0;
    echo »
    #
    Игра
    Название сервера
    L/A
    Игроки
    Карта
    Адрес сервера
    Голоса

    «;
    $link=mysql_connect(«localhost»,»******»,»*******»); // Подключаемся к серверу БД расположенном по адресу localhost используя логин user и пароль password.
    mysql_select_db(«sm1l3219_mon»); // Подключаемся к базе данных с именем «dbname»
    if(isset($_GET[‘page’])) { $page=$_GET[‘page’]; } else { $page=»0″; }
    $servers = dbquery(«SELECT * FROM «.DB_SERVERS.» order by server_vip desc limit «.$settings[‘num_servers’]);
    while($r=dbarray_fetch($servers)) {
    $players = $r[‘server_players’].»/».$r[‘server_maxplayers’] ;
    if($r[‘server_status’] ==1)
    { $server_full=floor(($r[‘server_players’] / $r[‘server_maxplayers’]) * 70); }
    else
    { $server_full=»0″; }
    if($server_full==’0′) $la = «la0»;
    if($server_full’0′) $la = «la1»;
    if($server_full’20’) $la = «la2»;
    if($server_full’40’) $la = «la3»;
    if($server_full’60’) $la = «la4»;
    if($server_full’80’) $la = «la5»;
    if($r[‘server_players’] == $r[‘server_maxplayers’])
    { $players = «».$r[‘server_players’].»/».$r[‘server_maxplayers’].»»;}
    if($r[‘server_players’] == 0)
    { $players = «».$r[‘server_players’].»/».$r[‘server_maxplayers’].»»;}
    $i++;
    if (isset($r[‘server_lin’])){
    if ($r[‘server_lin’] == «0»){ echo «»; }
    elseif ($r[‘server_lin’] == «1»){ echo «»; }}
    echo» $i</b»;
    echo »
    a.st img {
    width:40px;
    height:30px;
    border:0px solid #c8c8c8;
    }
    «;
    $img = «»;
    if (file_exists(«images/maps/$r[server_map].jpg»))
    {$img = «»;}
    echo «»;
    echo» $r[server_name]«;
    echo»»;
    echo» «.$players.» «;
    echo»«.$img.»«;

    echo»$r[server_ip]»;
    echo»»;
    echo «»;
    if($r[‘server_vip’]==1){ echo «»; }
    else{
    echo «
    «;
    echo $r[‘votes’];
    echo «
    «;
    echo ««;
    echo ««;
    }
    echo «»;
    }

    }
    else {echo » «.$locale[‘017’].»»;
    }
    echo»»;
    if($serv_num !=0)
    {
    echo»»;}
    echo»»;

    $q=mysql_query(«SELECT * FROM `amx_servers`»);
    $numpages=ceil(mysql_num_rows($q)/90);
    if($numpages > 1) {
    if($page!=0) { echo «Первая «; }
    for($i=0;$i<$numpages;$i++) {
    if($page != $i) { echo "«.($i+1).» «; }
    else { echo ««.($i+1).» «; }
    }
    if($page!=($numpages-1)) { echo «Последняя«; }
    }
    echo «Последняя«;

    ?>

    Не подскажете в чем дело?

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *