Страниране на резултат от База Данни.
Публикувана от ko6rata на January 19 2011 10:36:50

Разширена новина
Настоящият файл съдържа кода, с който извиквате информацията от ДБ-то и я форматирате според вкуса си. За това как да вкарате тази информация в ДБ-то, потърсете съответния урок ;)
----
Първо, трябва да направите връзка с базата данни:
<?php
// Връзка с ДБ
include 'db.php';

Във файла, който включваме - db.php - се съдържат името на хоста, името на ДБ, паролата за достъп до нея, името на потребителя на ДБ, както и кода за осъществяване на връзката. Пример:

<?php
$dbhost="localhost";
$dbusername="*************";
$dbpassword="************";
$dbname="**************";


$connect = mysql_connect($dbhost, $dbusername, $dbpassword);
mysql_select_db($dbname,$connect) or die ("Could not select database");
?>

След това, трябва да определим дали променливата $page (която съдържа номера на страницата) е зададена и ако не е, ще й зададем стойност 1.

if(!isset($_GET['page'])){
$page = 1;
} else {
$page = $_GET['page'];
}

След това трябва да укажем колко резултата искаме да бъдат показвани на една страница:

// Задаваме броя резултати на страница
$max_results = 10;

След като сме указали максималния брой резултати ($max_results), трябва да определим по какъв начин ще извикаме само част от резултата в MySQL заявката. Както виждате, това е една математическа операция:

// Определяме лимита на заявката на база
// на номера на настоящата страница
$from = (($page * $max_results) - $max_results);

Горният код дефинира стойността на $from като взема номера на настоящата страница ($page) и го умножава по максималния брой резултати ($max_results) и после изважда стойността на $max_results от стойността на $page * $max_results.Получената стойност се използва в израза LIMIT от MySQL заявката. Нужно е да разберем как работи този израз. Структурата му е: LIMIT FROM, OFFSET, т.е. "ОРГАНИЧИ ОТКЪДЕ, ДОКЪДЕ". В нашия случай, за първата страница искаме да сложим органичение на резулатати от 0 до 10 (LIMIT 0, 10) а за втората страница LIMIT 10, 10 и така нататък.

След това трябва да направим MySQL заявката. В нея ще използваме стойностите, определени в горните редове. В тази заявка ще зададем органичение LIMIT $from, $max_results.

// Правим заявка само за резултатите за настоящата страница
$result = mysql_query("SELECT * FROM news LIMIT $from, $max_results");

След това, ще използваме израза while, с който ще обходим резултатите от mysql_fetch_array и ще ги покажем с израза echo. Тук можем да форматираме резултатите според собствения си вкус. Ще ви дам пример с това как аз съм форматирал моите резултати:

while($myrow = mysql_fetch_array($result))
{// начало на цикъла
// Показване на резултатите
echo "<table width=550><tr><td align=left class=newstitle width=80%>";
echo $myrow['title'];
echo "</td><td align=left class=newscat>";
echo "<a xhref="filtered.php?category=$myrow[category]" class=newscat>";
echo $myrow['category'];
echo "</a></td></tr><tr><td align=left colspan=2 height=1 bgcolor=#000000></td></tr><tr><td align=left class=date>[ <i>";
echo $myrow['dtime'];
echo "</i> ]</td></tr><tr><td align=left colspan=2 class=newsbody>";
echo $myrow['description'];
echo "  <a xhref="read_more.php?newsid=$myrow[newsid]" class=more>more >></a></td></tr>";
}
// Край на цикъла

Ако затворим кода дотук, ще можем да видим само една страница с резултати. Остава ни да добавим кода, с който номерираме страниците с резултати.
Ще трябва да преброим колко реда имаме в базата данни. Използвайки израза mysql_result и функцията COUNT в MySQL, ще можем да изпълним едно много ефикасно запитване към таблицата, за да преброим редовете в нея. Стойността на променливата $total_results ще е равна на броя редове, който се съдържа във вашата таблица.

// Изчисли общия брой резултати в ДБ-то
$total_results = mysql_result(mysql_query("SELECT COUNT(*) as Num FROM news"),0);

Сега трябва да изчислим колко страници с резултати ще бъдат показани от кода. Ще вземем променливата общ брой резултати ($total_results) и ще я разделим на максималния брой резултати, който сме задали по-горе ($max_results) и ще получим стойност. С малко логическа мисъл обаче, ще се сетим, че ако в дазата ни с данни има 101 резултата, след умножението, ще имаме стойност 10.1. която ще обърка показването. Затова е нужно да закръглим тази стойност нагоре, като използваме функцията ceil(), която в нашия случай ще даде резултат 11.

// Изчисляваме общия брой страници. Винаги закръгляме с функцията ceil()
$total_pages = ceil($total_results / $max_results);

Сега вече знаем колко са страниците с резултати и трябва да напишем кода, с който ще покажем номерата на страниците. Ще изпишем линк "<< предишна" , който ще е активен, ако сме на страница, различна от първата. Това става с израза if, с който определяме дали номера на настоящата страница е по-голям от 1. Също така ще направим променливата $prev, която е равна на настоящата страница минус 1, за да може да ни върне на предишната страница.

// Показване на линка Предишна Страница
if($page > 1){
$prev = ($page - 1);
echo "<a class=newscat xhref="".$_SERVER['PHP_SELF']."?page=$prev"><<Previous</a> ";
}

Сега следва частта, в която ще напишем един FOR цикъл, в който определяме броя на страниците (първо обяснението, после самия код):


Началната стойност на променливата $i е 1 ($i = 1). Ако $i е по-малко или равно на броя страници ($i <= $total_pages), тогава продължи да увеличаваш стойността ($i++) дотогава, докато $i не е по-малко или равно на $total_pages ($i <= $total_pages). Сега самия код:

for($i = 1; $i <= $total_pages; $i++){
if(($page) == $i){
echo "$i ";
} else {
echo "<a class=newscat xhref="".$_SERVER['PHP_SELF']."?page=$i">$i</a> ";
}
}

Така, сега трябва да покажем линка, който води към СЛЕДВАЩАТА страница с резултати.

// Показване на линка СЛЕДВАЩА страница
if($page < $total_pages){
$next = ($page + 1);
echo "<a class=newscat xhref="".$_SERVER['PHP_SELF']."?page=$next">Next>></a>";
}

А сега трябва да затворим PHP скрипта (и HTML таблицата, в която показвам резултата) и сме готови:

echo "</td><tr></table>";
?>



Този код разбира се няма да работи, ако нямате таблица във вашата база данни, която да се казва "news" или както там сте я кръстили. Не забравяйте да промените името й в кода по-горе! Таблицата, която аз използвам в този пример се казва "news" и има следните редове:
'title' (заглавие), 'category' (категория), 'dtime' (дата на вкарване на записа в ДБ), 'description' (кратко описание) и 'newsid' (ID на новината) и 'text', който не се вижда тук, но се показва, когато натиснете линка

read_more.php?newsid=$myrow[newsid]

който се показва след всеки от резултатите. Вътре в израза echo също така принтирам и малко HTML и CSS клас, за да оформя резултатите си естетически.
За любопитните, ето тук аз използвам гореописания код - след като го прочетох от урока от сайта PHP FREAKS и реших, че може да бъде полезен и на някой новак в PHP като мен (аз се занимавам от 5 месеца) :)

Този урок е превод на урока "Page Numbering With PHP And MySQL Results", взет от http://www.phpfreaks.com/tutorials/73/1.php .