[PHP] Једноставна пагинација

[:sr]Ако програмирате у PHP, готово сигурно ћете једном доћи у ситуацију у којој је потребно велики број уноса из базе приказати на више страница.Ово је можда и најједноставнији начин да ово обавите.Обратите пажњу и на коментаре у самом коду, могу вам пружити корисне информације.

Не заборавите да направите повезивање са базом пре него што почнете.
Прво „бројимо“ број уноса који постоје у бази, а затим одређујемо и колико ће се уноса приказивати на једној страни.Затим једноставним дељењем добијамо број страница.

//ukupan broj unosa u bazi//
$brojunosa = mysql_num_rows(mysql_query("SELECT * FROM table")); 

//broj unosa koji ce se prikazivati po (jednoj) strani//
$prikaz = 5; 

//deljenjem ukupnog broja unosa i broja unosa koji će se prikazivati
// na jednoj strani izračunato je koliko će strana postojati
$strukupno = ceil($brojunosa/$prikaz); 

Ceil функција ће добијени резултат дељења заокружити на први већи број, тако да ћемо у случају да је број уноса 11 и када га поделимо са 5 добити 3 стране за приказ (уместо 2.2 које је немогуће приказати).Идемо даље…

Као што можете видети испод, захтеве за одређеном страницом ћемо добијати путем GET методе.Затим контролишемо добијену вредност, да се не би десиле грешке при наредним корацима: ако је захтевана страна неким случајем не псотоји (на пример постоји 10 страна, а захтевана је страна број 12), скрипти се говори да се прикаже последња страница.

$trenutnastr = $_GET['pagе'];

if ($trenutnastr < 1) { $trenutnastr = 1; } elseif ($trenutnastr > $strukupno) {
$trenutnastr = $lastpage;
}

У ко́ду испод можемо видети MySQL операцију LIMIT помоћу које ограничавамо приказ уноса.Како посетилац бира страну, ми динамички одређујемо вредност ($poc) од које ће почети приказивање следеће групе уноса.Пример: LIMIT 10, 3 ће нам приказати ставке 11, 12, 13.Стринг $prikaz смо већ дефинисали на почетку.

$poc = ($trenutnastr - 1) * $prikaz; 
//-1 je neophodno da ne bi prikazali pogrešne unose na trenutnoj strani
//npr. bez ovoga bi na strani 4 prikazali unose za stranu 5

$result = mysql_query("SELECT * FROM tabela LIMIT $poc, $prikaz");

Испод израчунавамо претходну и следећу страну једноставним одузимањем или додавањем 1 на тренутну страну:

$prethodna = $trenutnastr - 1;

$naredna = $trenutnastr + 1;

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


// ako smo trenutno na prvoj strani, u paginaciji ne prikazujemo
// link ka prethodnoj strani, jer ona ne postoji

if ($strukupno &gt; $trenutnastr &amp;&amp; $trenutnastr &lt;= 1){
echo ("Strana &amp;nbsp ". $trenutnastr ."&amp;nbsp od &amp;nbsp {$strukupno} &amp;nbsp <a href="?pgi={$naredna}">SLEDECA-&gt;</a> &amp;nbsp <a href="?pgi={$strukupno}">POSLEDNJA</a>");
}

// ako nemamo dovoljno unosa u bazi da bi ih podelili na stranice, u paginaciji ćemo
//prikazati samo to da postoji jedna jedina strana, a možete jednostavno
//obrisati taj deo i ostaviti echo (""); da ne prikazujete ništa.

elseif ($trenutnastr == $strukupno &amp;&amp; $strukupno == 1){
echo ("Strana &amp;nbsp ". $trenutnastr ."&amp;nbsp od &amp;nbsp {$strukupno} &amp;nbsp ");
}

// ako nismo ni na prvoj, a ni na poslednjoj strani prikazaćemo linkove
//i za prethodnu i za narednu stranu
elseif ($strukupno &gt; $trenutnastr &amp;&amp; $trenutnastr &gt;= 1){
echo ("<a href="?pgi=1">PRVA</a> &amp;nbsp <a href="?pgi={$prethodna}">&lt;-PRETHODNA</a>&amp;nbsp Strana &amp;nbsp ". $trenutnastr ."&amp;nbsp od &amp;nbsp {$strukupno} &amp;nbsp <a href="?pgi={$naredna}">SLEDEĆA-&gt;</a> &amp;nbsp <a href="?pgi={$strukupno}">POSLEDNJA</a>");
}

// ako se nalazimo na poslednjoj strani, u paginaciji će biti prikazan samo
//link ka prethodnoj strani, jer naredna ne postoji
elseif ($strukupno == $trenutnastr){
echo ("<a href="?pgi=1">PRVA</a> &amp;nbsp <a href="?pgi={$prethodna}">&lt;-PRETHODNA</a>&amp;nbsp Strana &amp;nbsp ". $trenutnastr ."&amp;nbsp od &amp;nbsp {$strukupno} &amp;nbsp ");
}

Скрипту на делу можете видети на ОВОЈ страни.
Да би скинули цео пример, кликните ОВДЕ (величина: ~ 2 Kb, компресија: .ZIP).

Овај пример пагинације је могуће унапредити на пуно начина, уз мало вежбе можете додати drop box из ког посетилац може бирти страну, box у који посетилац може укуцати број стране који жели да посети, бројеве страна на које посетиоци могу да кликну…Могућности је доста.[:en]Ако програмирате у PHP, готово сигурно ћете једном доћи у ситуацију у којој је потребно велики број уноса из базе приказати на више страница.Ово је можда и најједноставнији начин да ово обавите.Обратите пажњу и на коментаре у самом коду, могу вам пружити корисне информације.


Не заборавите да направите повезивање са базом пре него што почнете.
Прво „бројимо“ број уноса који постоје у бази, а затим одређујемо и колико ће се уноса приказивати на једној страни.Затим једноставним дељењем добијамо број страница.

//ukupan broj unosa u bazi//
$brojunosa = mysql_num_rows(mysql_query("SELECT * FROM table")); 

//broj unosa koji ce se prikazivati po (jednoj) strani//
$prikaz = 5; 

//deljenjem ukupnog broja unosa i broja unosa koji će se prikazivati
// na jednoj strani izračunato je koliko će strana postojati
$strukupno = ceil($brojunosa/$prikaz); 

Ceil функција ће добијени резултат дељења заокружити на први већи број, тако да ћемо у случају да је број уноса 11 и када га поделимо са 5 добити 3 стране за приказ (уместо 2.2 које је немогуће приказати).Идемо даље…

Као што можете видети испод, захтеве за одређеном страницом ћемо добијати путем GET методе.Затим контролишемо добијену вредност, да се не би десиле грешке при наредним корацима: ако је захтевана страна неким случајем не псотоји (на пример постоји 10 страна, а захтевана је страна број 12), скрипти се говори да се прикаже последња страница.

$trenutnastr = $_GET['pagе'];

if ($trenutnastr < 1) {
$trenutnastr = 1;
}

elseif ($trenutnastr > $strukupno) {
$trenutnastr = $lastpage;
}

У ко́ду испод можемо видети MySQL операцију LIMIT помоћу које ограничавамо приказ уноса.Како посетилац бира страну, ми динамички одређујемо вредност ($poc) од које ће почети приказивање следеће групе уноса.Пример: LIMIT 10, 3 ће нам приказати ставке 11, 12, 13.Стринг $prikaz смо већ дефинисали на почетку.

$poc = ($trenutnastr - 1) * $prikaz; 
//-1 je neophodno da ne bi prikazali pogrešne unose na trenutnoj strani
//npr. bez ovoga bi na strani 4 prikazali unose za stranu 5

$result = mysql_query("SELECT * FROM tabela LIMIT $poc, $prikaz");

Испод израчунавамо претходну и следећу страну једноставним одузимањем или додавањем 1 на тренутну страну:

$prethodna = $trenutnastr - 1;

$naredna = $trenutnastr + 1;

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

// ako smo trenutno na prvoj strani, u paginaciji ne prikazujemo
// link ka prethodnoj strani, jer ona ne postoji

if ($strukupno > $trenutnastr && $trenutnastr <= 1){
echo ("Strana &nbsp ". $trenutnastr ."&nbsp od &nbsp {$strukupno} &nbsp SLEDECA->   POSLEDNJA");
}

// ako nemamo dovoljno unosa u bazi da bi ih podelili na stranice, u paginaciji ćemo 
//prikazati samo to da postoji jedna jedina strana, a možete jednostavno 
//obrisati taj deo i ostaviti echo (""); da ne prikazujete ništa.

elseif ($trenutnastr == $strukupno && $strukupno == 1){
echo ("Strana   ". $trenutnastr ."  od   {$strukupno}   ");
}

// ako nismo ni na prvoj, a ni na poslednjoj strani prikazaćemo linkove
//i za prethodnu i za narednu stranu
elseif ($strukupno > $trenutnastr && $trenutnastr >= 1){
echo ("PRVA   <-PRETHODNA  Strana   ". $trenutnastr ."  od   {$strukupno}   SLEDEĆA->   POSLEDNJA");
}

// ako se nalazimo na poslednjoj strani, u paginaciji će biti prikazan samo
//link ka prethodnoj strani, jer naredna ne postoji
elseif ($strukupno == $trenutnastr){
echo ("PRVA   <-PRETHODNA  Strana   ". $trenutnastr ."  od   {$strukupno}   ");
}

Скрипту на делу можете видети на ОВОЈ страни.
Да би скинули цео пример, кликните ОВДЕ (величина: ~ 2 Kb, компресија: .ZIP).

Овај пример пагианције је могуће унапредити на пуно начина, уз мало вежбе можете додати drop box из ког посетилац може бирти страну, box у који посетилац може укуцати број стране који жели да посети, бројеве страна на које посетиоци могу да кликну…Могућности је доста.
[:]

12 коментара

  1. Izbacuje gresku ako postoji samo jedna strana pa sam umesto ovog koda:
    $trenutnastr = $_GET[‘page’];

    if ($trenutnastr $strukupno) {
    $trenutnastr = $lastpage;
    }

    ubacio ovaj:

    if(isset ($_GET[‘strana’])){
    $trenutnastr = $_GET[‘strana’];
    }

    else{
    $trenutnastr = 1;
    }

    if ($trenutnastr > $strukupno) {
    $trenutnastr = $strukupno;
    }
    Pozdrav!

  2. Džoni scripta je sjajna.
    Da li bi htio da mi pomogneš, meni treba dopuna za ovu skriptu sa pretraživanjem ključne riječi, još kada bi htio da kažeš strukturu baze i gdje da je smjestim.
    Ja koristim WAMP a on se instalacijom setuje c:/wamp/www
    Mnogo bi mi pomogao.
    U svakom slučaju hvala.

    1. Pozdrav Andrija, možeš li da mi objasniš na šat si mislio kad kažeš pretraživanje ključne reči? Pretpostavljam da imaš pretragu i da želiš da dodaš da rezultati budu prikazani sa paginacijom?
      Struktura baze, to je obična tabela sa 2 kolone: „id“ i „text“, smeštaš je gde i sve ostale baze (nisam baš siguran za WAMP, nisam odavno radio sa njim). Inače, evo baze: http://ge.tt/8yxsZRU/v/0?c

  3. Hvala Džoni i pozdrav od Andrije
    Nemam pretraživač. Ova skripta lista bazu od početka do kraja a ja bih želio da se unosi ključna riječ, pretraži po njoj i listaju podaci vezani za ključnu riječ odnosno od nje na dalje.
    Hvala.

  4. Džoni pozdrav od Andrije
    I da ti umjesto nove godine čestitam Božićne blage dane.
    Dobio sam od tebe dva programa prvi za paginaciju i drugi za pretraživanje i listanje po ključnoj riječi. Ja pokušavam da ih povežem u jednu cjelinu ali ne uspijevam. Ne znam koliko je korektno da te zamolim da to povežeš u jednu cjelinu jer si mi i onako dosta pomogao. Ja ipak nemam dovoljno iskustva i znanja za to.
    U svakom slučaju hvala za sve što sam dobio od tebe.

      1. Džoni pozdrav od Andrije.
        Konačno sam uspio da riješim svoj problem uz tvoje sugestije i Mladenovu ispraku.
        Cod je sjajan upravo zato što je jednostavan, Naravno, uvijek se može po nešto novo dodati.
        Još jednom hvala.

  5. Unos podataka u MySQL
    može li mi ko pomoći
    baza se zove: SVE a tabela PROBA
    ima 2 text polja: zbirka i autor
    ja koristim WAMP
    a evo coda
    <?php
    header('Content-Type: text/html; charset=UTF-8');
    putenv("TZ=Europe/Belgrade");
    $host="localhost"; // Lokacija baze
    $user="root"; // username
    $password=""; // lozinka
    $baza="sve"; // ime baze
    mysql_connect($host,$user,$password); // Konekcija na bazu
    mysql_select_db($baza);

    mysql_query('INSERT [INTO] proba [(zbirka, autor)] VALUES (Petar Milic, Negotin)')
    $sql = "insert into proba (zbirka, autor) values (NULL, 'Petar Milic','Negotin')";

    if (mysql_query($sql)){
    echo "Uspesno je pohranjeno";
    }else{
    echo "Nastala je greska pri unosu“;
    }
    ?>
    zašto ovo ne radi

Оставите коментар

Ваша адреса е-поште неће бити објављена. Неопходна поља су означена *