Многостраничный вывод информации при работе с MySQL (c массивами)
---------------------------------------------------------------------------------------
Привет всем читателям !
Сегодня мы поговорим о теме, которая теребила мои нервы довольно долго, когда я в процессе поиска информации по ней, находил лишь только всякую фигню, которая не объясналя всех аспектов данной технологии.
Поискав день другой, я всё же собрался с мыслями и как-то сделал это сам, и теперь, хочу чтобы вы не повторяли моих ошибок, ведь как говорит мудрость: "Умный человек учиться на своих ошибках, а глупый на ошибках других", так давайте приобретать и свой опыт, но и не отбрасывать советов и наставлений других.
Что ж, некое вступление мы прошли, теперь можно перейти к делу.
Традиционно скажу, что для работы с материалом данной статьи вам понадобиться интерпретатор РНР,
и поддержка базы данных MySQL.
Если этого нет, то все пути ведут в http://denwer.ru.
Для редактирования РНР файлов, я посоветовал бы вам отличный редактор, который называеться phpEdit Svoi.NET, и скачать его можно на http://phpedit.svoi.net/.
Что ж, ну, а теперь ближе к делу.
Мы ведь собрались здесь не для пустой болтовни и обсуждений, а для изучения конкретной темы, так вот и
перейдём к ней.
На протяжении данной статьи мы рассмотрим не только технологию постраничного вывода данных из БД,
но и перебор и постраничный вывод данных массива, что так же будет очень полезным, если вы
держите те или иные данные в массивах.
Сейчас мы приступим к расмотрению метода перебора и вывода данных в массиве, а далее уже будем работать с базой.
Итак, давайте отложим все лишние мысли и дела на потом, поскольку данная тема нуждается в более детальном анализе, и раздумиях.
Но самое главное, что же я имею ввиду под фразой постраничный вывод данных массива ?
Это ничто иное, как вывод всей информации массива D, начиная с элемента i и заканчивая элементов i+max.
То есть, мы будем выводить все элементы массива, начиная с определённого при просчёте данных элемента, и после прибавив к нему
значение переменной, которая носит информацию о количестве элементов, которые нужно вывести на одну страницу.
После нам нужно будет создать навигацию по страницам, для этого мы просчитаем количество страниц, получив количество элементов массива, и разделив их на максимальное количество на страницу.
После имея количество страниц, мы просто создадим ссылки, которые будут содержать информацию, добавляемую в QUERY_STRING, которой мы будем манипулировать через $_GET интерфейс.
Что ж, немного теории мы прошли, теперь о главном. Для проверки всего этого на практике, нам потребуеться создать массив, с количеством элементов, отличным от единицы. Это может быть массив с любыми данными, любым количеством элементов, но это не должен быть ассоциативный массив, поскольку в данной лекции мы будем рассматривать работу с массивом, у которого индексы элементов, строго числовые. Это производиться потому, что работа с ассоциативным массивом немного отличается от работы с массивом, у которого индексы числовые.
Что ж, я предлагаю немного отойти от обсуждений, и попробовать всё это осуществить на практике. Вы не против ?
<?php
//Объявляем массив данных
$articles=array('Статья №1','Статья №2','Статья №3','Статья №4','Статья №5',
'Статья №6');
//Количество элементов для вывода на одной странице
$count_per_page=2;
//Получаем номер текущей страницы,и если он не существует,ставим в значение нуль
$page=isset($_GET['page'])? $_GET['page']:0;
/**
Теперь, если бы я был музыкантом, а вы студентами, я бы сказал что музыка
подходит к крещенто,ведь сейчас мы рассмотрим главный этам данной темы,
вывод элементов, и поиск первого и последнего элемента для вывода на данной
странице
**/
//Находим первый элемент для вывода
$begin=$page*$count_per_page;
//Теперь делаем срез массива
$new_array=array_slice($articles,$begin,$end);
//Для проверки
print_r($new_array);
?>
Как видите, получилось.
Но теперь, нам нужно сделать навигацию по страницам.
Это делаеться довольно просто.
Сначала, как я уже говорил, мы находим общее число страниц,
после этого мы в цикле запускаем вывод страниц, с ссылкой на данную страницу, однако с параметром
QUERY_STRING - page, который и будет служить индификатором страницы.
Давайте поробуем это осуществить:
<?php
//Сначала считаем страницы
$pages=ceil(count($articles)/$count_per_page);//Обязательно округляем
//Теперь запускаем цикл
for($i=0;$i<$pages;$i++){
//Если мы уже находимся на странице i, то не ставим ссылки на неё
if($i!=$page){
print"<a href=\"".$_SERVER['PHP_SELF']."?page=".$i."\">".$i."</a>::";
}else{
print $i."::";
}
}
?>
Вот, как видите всё банально просто, особенно в нашем случае.
Что ж, на этом работу с массивами мы заканчиваем, и переходим к теме более практичной теме, а именно работе с MySQL.
Могу сказать, что сами принципы не очень отличаються от принципов работы с обычными индексированными массировами,
однако тут есть небольшое отличие.
Мы не будем делать срез данных, полученного из БД массива, а для получения определённых данных, будем задавать соответствующие параметры в запросе SQL.
Для этого мы введём в наш запрос параметр LIMIT, который будем возвращать данные,
которые находяться начиная с элемента $begin, при этом их число будет не более $count_per_page.
Так что в этом смысле, работа с данной технологией в БД не отличаеться почти ничем.
Что ж, а чтобы окончательно в этом убедиться, давайте напишим следующий скрипт:
<?php
//Количество элементов для вывода на одной странице
$count_per_page=2;
//Получаем номер текущей страницы, и если он не
//существует, ставим в значение нуль
$page=isset($_GET['page'])? $_GET['page']:0;
//Находим первый элемент для вывода
$begin=$page*$count_per_page;
$conn_id=@mysql_connect("localhost","root","")
or die("Ошибка при соединении !");
@mysql_select_db("db");
$q=@mysql_query("SELECT * FROM `portfolio` WHERE status='on' LIMIT ".$begin.",
".$count_per_page) or die("Ошибка в запросе №1");
if(@mysql_num_rows($q)==0){
print"Данные не найдены !";
}else{
while($row=@mysql_fetch_array($q)){
//Здесь пошёл вывод данных из БД, и его я не описую
}
}
$pages=ceil(@mysql_num_rows($q)/$count_per_page);//Обязательно округляем
//Теперь запускаем цикл
for($i=0;$i<$pages;$i++){
//Если мы уже находимся на странице i, то не ставим ссылки на неё
if($i!=$page){
print"<a href=\"".$_SERVER['PHP_SELF']."?page=".$i."\">".$i."</a>::";
}else{
print $i."::";
}
}
?>
Вот, как я же говорил, отличия минимальны.
Что ж, на протяжении сегодняшней лекции мы рассмотрели такую полезную технологию,
как многостраничный вывод данных, как из массива данных, так и при работе с базой данных.
Так же нужно заметить, что примеры не тестировались, и если вы найдёте ошибки, и ваши
умения по "ловле блох" не так хороши, то обращайтесь к автору всего этого бардака,
а именно ко мне, всегда выслушаю ваши проблемы, и помогу, если что.
Ну что ж, мне остаёться лишь попрощаться со всеми, кто меня внимательно слушал, и
даже с теми кто иначе, до скорых встреч.
Неравнодушным писать на Ik1990@list.ru
|