Jelikož na mě přichází neustálé dotazy, jak udělat stránkování na svých stránkách, tak jsem se rozhodl napsat článek i s popisem principu, jak toho docílit. Co se mysli tím „nekonečné“ stránkování? Nejlepší bude si to ukázat: 1 2 3 4 5 6 7 8 ….
A teď k samotnému scriptu. Nejprve si musíte spočítat řádky v tabulce MySQL a to:
$radku = mysql_num_rows(mysql_query("SELECT id FROM tabulka;"));Dále si zvolíte počet řádků na jednu stránku a vypočítáme na kolik stránek vyjde tabulka:
$po = 15; /* počet řádků na stránku */ $max_stranek = ceil($radku / $po); /* počet stránek */ $url_stranka = ($_GET["stranka"] / $po) + 1; /* Aktuální stránka */A nyní samostatný script, který vypíše všechny stránky:
for($i=0; $i < $max_stranek; $i++) { $cislo = ($i + 1); $url_cislo = ($cislo * $po) - $po; if($url_stranka != $cislo) { echo "<a href=\"?stranka=".$url_cislo."\">".($i + 1)."</a>\n"; } else { echo "<strong>".($i + 1)."</strong>\n"; } }Zde si samozřejmě adresu upravte podle své. Jen musíte zachovat ? či & stranka=…
if(empty($_GET["stranka"])) {$stranka = 0;} else {$stranka = $_GET["stranka"];} $cist = mysql_query("SELECT * FROM tabulka ORDER BY id DESC LIMIT ".intval($stranka).",$po"); while($data = mysql_fetch_assoc($cist)) { … }To je celá věda stránkování. Stránkování lze samozřejmě různě formátovat, ale to už jindy. Případné nejasnosti a návrhy směřujte do komentářů.
Štítky:
PHP,
tutoriál,
zobrazit všechny štítky
! Našli jste v článku gramatické či pravopisné chyby? Je to z důvodu autorovy nemoci zvané dysgrafie. Tudíž všem děkuji za pochopení a každý článek pokud možno nechávám projít korekturou. !
Ještě jednou díky!
{16} Koukam, ze jsi to uz vyuzil na svym webu, takze vidim, ze to funguje, takze taky diky za test a za to, ze jsem tim nekomu pomohl a nepsal jsem to nadarmo
{1} Už jsem myslel nezadarmo
Potřebuji při výpisu přiřadit každému řádku pořadové číslo, když na straně 1 bude končit 5, tak aby na straně 2 začínalo od 6…
díky
michalll: Kdyby by ti to stačilo po deseti, tak bych i věděl, ale po pěti mě vážně nic nenapada
to byl pouze příklad, vypsaných řádků na stránku bude asi tak 80…
Nazdar stale mi pise hlasku:
Notice: Undefined index: stranka in … $url_stranka = ($_GET["stranka"] / $po) + 1; /* Aktuální stránka */Kde je chyba? (To vies amateri)
Joe: Asi máš zapnuté vypisováni chyb při nulové hodnotě. V tom případě hoď před tenhle řádek ještě podmínku
if($_GET["stranka"] < 1) {$_GET["stranka"] = 0;}A mělo by to pomoct, kdyby ne, tak mi napiš. Zkusím to nějak vyřešit.
Zdary.Mám takovej malej problém.Chtěl jsem použít u sebe tvoje stránkování ale nemůžu to nějak rozchodit.Né že by nešlo co je popsáno tady to funguje, ale vzhledem k tomu že jsem v phpku a mysql totální lamka nějak to nemůžu aplikovat na svůj web.(1stránka načte správně 5 článů, ale 2,3,4..už všechny.Nerad votravuju,ale už začínám šedivět
Tak je po problému Už jsem to rozběhal,ale stejně děkuji za ten script.Jako začátečníkovi mi ušetřil dost času a ani jsem nezešedivěl Ještě jednou dík
Bra68: Není zač a jsem rád, že jsi to rozběhal i bez mé pomoci, protože teď nemám vůbec čas
CrazyDog: Zdary. Potřeboval bych drobnou(?)radu.Už nějakou chvíli používám tohle tvoje stránkování na svejch stránkách.Teď jsem ho chtěl využít i na stránkování jednotlivých kategorií, ale nějak jsem se do toho zamotal. Sice články z kategorií vypíše ale nestránkuje. Mám tam někde nějakou blbost.Kdybys měl na mě chvilku poslal bych ten script mailem. Předem ďík
Hele Dogu,člověče já s tím asi nehnu.Už jsem rezignoval.
Mořím se s tím od včerejška, hlavu mám jak pátrací balón a jsem zas kde sem byl.Když by sis na mě udělal chvíli jsem ochotnej za to i zaplatit.Když budeš mít zájem napiš mi co mě to bude stát a nějak se domluvíme.Zatím zdar
Bra68: Bohužel nemám čas, tak ti posilám můj kód, který mám na mém stránkovaní těchto článků, tak snad ti to pomůže. Pokud ne, tak se ti na to mrknu…
Tohle mám ve strankovani.php, které includuji:
<div class="center">[ <a class="bold" href="<?=$adresastr?>stranka-c-0/">«</a> <?php $pocet = ceil($pocetkat / $po); /* Vydelime 15 (pocet zobrazeni) a zaokrouhlime */ $url_cislo2 = ($_GET['stranka'] / $po) + 1; for($i=0; $i < $pocet; $i++) { $cislo = ($i + 1); $url_cislo = ($cislo * $po) - $po; /* formatovani */ $kolik2 = 2; $kolik1 = 2; if($url_cislo2 == 2) {$kolik2 = 3;} if($url_cislo2 == 1) {$kolik2 = 4;} if($url_cislo2 == $pocet-1) {$kolik1 = 3;} if($url_cislo2 == $pocet) {$kolik1 = 4;} if ($url_cislo2 <= $cislo + $kolik1 && $url_cislo2 >= $cislo - $kolik2) { /* Konec formatovani */ if ($url_cislo2 != $cislo) { echo "<a href=\"".$adresastr."stranka-c-".$url_cislo."/\">".($i + 1)."</a>\n"; } else {echo "<strong>".($i + 1)."</strong> ";} } /* ukonceni formatovani */ } if($po == 10) { $nahodne = substr(($pocet*$po-$po),0,1); $nahodne = @rand(0, $nahodne); if($nahodne == 0) {$nahodne = 0;} else {$nahodne = $nahodne."0";} } else { $nahodne = ($pocet*$po-$po); $nahodne = @rand(0, $nahodne); } ?> <a class="bold" href="<?=$adresastr?>stranka-c-<? echo ($pocet*$po-$po); ?>/">»</a> | <a href="<?=$adresastr?>stranka-c-<?=$nahodne?>/">Nahodně</a> ]</div>A proměnné zde použité zjistíš:
if(mysql_num_rows(mysql_query("SELECT * FROM B_clanky WHERE stav='1' AND sekce='weblog' AND kategorie='".addslashes($kategorie_id['id'])."';")) != 0) { $pocetkat = mysql_num_rows(mysql_query("SELECT sekce FROM B_clanky WHERE sekce='weblog' AND kategorie='".addslashes($kategorie_id['id'])."' AND stav='1';")); $adresastr = "/blog/".$_GET['kategorie']."/"; $po = 10; }Tak snad ti to pomůže…
Dík moc Dogu. Když to vidím, tak jsem docela rád, že jsem se odhodlal napsat ti už po dvou dnech trápení. Ten způsob co sem si představoval, že to bude makat byl přinejmenším hodně naivní. Dneska se na to nedostanu, ale do konce tejdne k tomu sednu a musím to rozchodit. Pak dám vědět jestli mi to běhá. Ještě jednou dík.
Tak člověče asi to nezvládnu.Sedim u toho od včera a výsledek je bídnej. Nějak to nemůžu dostat z databáze.Píše to Warning: Division by zero in … Upravil jsem jí (neměl jsem v tabulce sekci)ale nevím si rady s tou proměnou adresastr. No ještě to dneska zkusim ale nevim nevim
Bra68: No to zero znamená, že dělíš něco nulou, což je v PHP nepřijatelné.
Zejtra k tomu zasednu a snad se k něčemu doberu.
No, taky bych potřeboval help.
Tvořím fotogalerii, a tabulku s obrázky generuju.
while ( $images = mysql_fetch_array($query) ) { $cislo++; echo (' <td height="150" width="150" align="center" valign="middle" > <div><a id="'.$images['jmeno'].'" href="../../images/'.$images['jmeno'].'" class="highslide" onclick="return hs.expand(this)" > <img align="middle" src="../../images/nahled/nahled_'.$images['jmeno'].'" title="Klikněte pro zvětšení" /> </a> <div id="caption-for-'.$images['jmeno'].'" class="highslide-caption" >'.$images['popis'].'</div></div> </td>'); if ($cislo==3) {echo '</tr><tr>'; $cislo=0;}; } echo ('</tr></table>');
Zkoušel jsem do toho zakomponovat stránkování a vyšlo mi:
$p = mysql_query("SELECT * FROM `images`"); $pocet = mysql_num_rows($p); echo 'Počet obrázků ve fotogalerii : '.$pocet.'<br />'; $cislo=0; echo ('<table border="1"><tr>'); $po = 15; $max_stranek = ceil($pocet / $po); $url_stranka = ($_GET["stranka"] / $po) + 1;for($i=0; $i < $max_stranek; $i++) { $cislo = ($i + 1); $url_cislo = ($cislo * $po) - $po; if($url_stranka != $cislo) { echo "<a href=\"?stranka=".$url_cislo."\">".($i + 1)."</a>\n"; } else { echo "<strong>".($i + 1)."</strong>\n"; } }
if(empty($_GET["stranka"])) {$stranka = 0;} else {$stranka = $_GET["stranka"];} $cist = mysql_query("SELECT * FROM `images` ORDER BY `cislo` DESC LIMIT ".intval($stranka).",$po"); while($images = mysql_fetch_assoc($cist)) { $cislo++; echo (' <td height="150" width="150" align="center" valign="middle" > <div><a id="'.$images['jmeno'].'" href="../../images/'.$images['jmeno'].'" class="highslide" onclick="return hs.expand(this)" > <img align="middle" src="../../images/nahled/nahled_'.$images['jmeno'].'" title="Klikněte pro zvětšení" /> </a> <div id="caption-for-'.$images['jmeno'].'" class="highslide-caption" >'.$images['popis'].'</div></div> </td>'); if ($cislo==3) {echo '</tr><tr>'; $cislo=0;}; }; echo ('</tr></table>');
Obrázky v tabulce ale nebyly v pořadí, v jakym jsou jejich údaje v db, některé obrázky při vložení dvakrát apod.
Co s tím?
cece mam to nejaky rtozbyty nevite cim to je ze mi to tam normalne vypise pocet stranek ale vsechno se vyflusne na jednua ty dalsi sou stejny a pruser mi to pise na tehlech radcich
if(empty($_GET["stranka"])) {$stranka = 0;} else {$stranka = $_GET["stranka"];} $cist = mysql_query("SELECT * FROM tabulka ORDER BY id DESC LIMIT ".intval($stranka).",$po");jestli vite co stim tak poradte diky moc.
aha uz sem prisel na jednu chybu ale jedna mi tam furt prebejva
Warning: mysql_close(): 3 is not a valid MySQL-Link resource in …. nemam vubec tuseni co to je
Lidi můžete mi prosím poradit proč mi to nefunguje jak má skoro všechny chyby sem odstranil jen ta největší přetrvává a to že se to nestránkuje jak má vypíše to počet stránek akorát se všechny příspěvky vyplivnou na tu první. tady je můj zdroják Předem díky moc za radu.
<?php require("options.php");$pripoj=MySQL_Connect($SQL_Server, $SQL_Uzivatel, $SQL_Heslo) or Die(MySQL_Error()); MySQL_Select_Db($Databaze) or Die(MySQL_Error());
$dotaz="SELECT * FROM data ORDER BY datum DESC LIMIT 0, 50";
//vytvoøení sql dotazu $vysledek = MySQL_Query($dotaz); // provedení sql dotazu
while ($zaznam = MySQL_Fetch_Array($vysledek)){ $jmeno=$zaznam["jmeno"]; $datum=$zaznam["datum"]; $text=$zaznam["text"];
$radku = mysql_num_rows(mysql_query("SELECT id FROM data;")); $po = 2; /* poèet øádkù na stránku */ $max_stranek = ceil($radku / $po); /* poèet stránek */ $url_stranka = ($_GET["stranka"] / $po) + 1; /* Aktuální stránka */
print "<div style='background:#315584; color:white; padding-left:10px'><b>".$jmeno."</b><br><small> [ ".$datum." ]</small></div>";
print "<div style='background:#B5C7DE; margin-bottom:10px; padding-left:10px;'>".$text."</div>"; }
for($i=0; $i < $max_stranek; $i++) { $cislo = ($i + 1); $url_cislo = ($cislo * $po) - $po; if($url_stranka != $cislo) { echo "<a href="?stranka=".$url_cislo."">".($i + 1)."</a>"; } else { echo "<strong>".($i + 1)."</strong>"; } }
if(empty($_GET["stranka"])) {$stranka = 0;} else {$stranka = $_GET["stranka"];} $cist = mysql_query("SELECT * FROM data ORDER BY id DESC LIMIT ".intval($stranka).",$po"); while($data = mysql_fetch_assoc($cist)) MySQL_Close($pripoj); ?>
ahoj, já mám zas jiný problém.. mě celý ten skript projede, ale na posledním znaku (})mi to vyhodí parse error :(((
George: U kterého „}“ ? Myslíš while() nebo for()? Pokud while(), tak máš nějakou chybu ve tvem výpisu… Když tak zkus nějaký jednoduchý. Např. jen ID.
Pěkný článek :)
Když jsem ho však víceméně zkopíroval, zjistil jsem, že čísla stránek se někdy hodí na další řádek, někdy ne…jde o to, zda jsou aktuální…je to takové pak podivné a nevím jak to vyřešit, je to obvyklé ?
Mirasek asi odpovídám opravdu pozdě, ale zkus něco takovéhohle:
/*řádkování zobrazení*/ $posun = 3; //definování zobrazení počtu stránek okolo aktuální for($i=0; $i < $max_stranek; $i++) { $cislo = ($i + 1); $url_cislo = ($cislo * $po) - $po; if ($cislo == 1 && $url_stranka > $posun+1) {echo "<a href="?str=".$url_cislo."">[".($i + 1)."]</a>…";} //zobrazení odkazu na 1.stránku if ($cislo == $max_stranek && $url_stranka < $max_stranek-$posun) {echo "…<a href="?str=".$url_cislo."">[".($i + 1)."]</a>";} //zobrazení odkazu na poslední stránku if($url_stranka != $cislo && ($cislo>$url_stranka-$posun-1 and $cislo<$url_stranka+$posun+1)) { echo " <a href="?str=".$url_cislo."">[".($i + 1)."]</a> "; } else { if ($url_stranka == $cislo){echo "".($i + 1)."";} }Sepsal jsem si to pro své stránky přičemž základ je shodný se scriptem zde (proměnné krom GETu a princip fungování), funguje perfektně.} /*řádkování zobrazení*/
Pak se ještě někdo ptal na číslování řádků u výpisu, to zle řešit velice laicky ať už je počet zobrazených řádků na stránku 5,10 nebo 534 a to nějak takto:
<?php while($data = mysql_fetch_assoc($vysledek)){ echo $r + $_GET["stranka"]; //číslování //výpis dat řádku $r++; } ?>a v případě že potřebuješ číslovat sestupně (řádek nahoře = nejv.číslo) pak nějak takto:
while($data = mysql_fetch_assoc($vysledek)){ $poradi = $radku-$i-$_GET["str"]; $i++; echo $poradi; //cislovani //výpis dat řádku }Snad někomu pomůže i když píšu pozdě:)
diky moc, ale DESC se na konci clanku v QUERY moc nehodi:)
mě to stránkování ukazuje Parse error: syntax error, unexpected '}' in C:xampphtdocswwwpo.php on line 23
zuzak: pravděpodobně někde na řádku 22 chybí interpunkční znaménko „;“ (středník).
Nešel by ten kód náhodou okomentovat řádek po řádku? :)) Chtěl bych přesně vědět co se při provádění děje. Díky.
Ahoj, pokud mám v DB hodně článků, tak se zobrazí strašně moc odkazů s čísly. Jak udělat, aby se mi jich zobrazilo třeba jen 5 a pak další, předchozí? (1 2 3 4 5 dalsi)
cau, jsem sice strasna php lama, ale tenhle postup asi vyzkousim. diky za zverejneni :)
Zdravím, pěkný článek, moc super. Akorát nevím jak to rozchodit. Vše klape, ale nezobrazujou se mě ty čísla (1,2,3 další…) Nevíš proč?
$radku = mysql_num_rows(mysql_query("SELECT * FROM clanky;")); $po = 5; /* počet řádků na stránku */ $max_stranek = ceil($radku / $po); /* počet stránek */ $url_stranka = ($_GET["stranka"] / $po) + 1; /* Aktuální stránka */ for($i=0; $i < $max_stranek; $i++) { $cislo = ($i + 1); $url_cislo = ($cislo * $po) - $po; if($url_stranka != $cislo) { echo "<a href="http://www.smonkey.ic.cz/new/clanky.php?stranka=".$url_cislo."">".($i + 1)."</a>"; } else { echo "<strong>".($i + 1)."</strong>"; } } if(empty($_GET["stranka"])) {$stranka = 0;} else {$stranka = $_GET["stranka"];} $cist = mysql_query("SELECT * FROM clanky ORDER BY id DESC LIMIT ".intval($stranka).",$po"); while($data = mysql_fetch_assoc($cist)) { $vypis .= "<center><p><h3>" .$data['nadpis']. "</h3><ul><li>" .$data['text']. "</li></ul></p><hr width="70%" size="2px"></center>"; }
Resp. Co mám vypisovat? Zatím to mám tak:
<h2>Počet publikovaných článků: <? echo $radku; ?></h2> <p><? echo $vypis; ?> <? echo ????; ?></p>
Smonkey: Místo:
echo "<a href="http://www.smonkey.ic.cz/new/clanky.php?stranka=".$url_cislo."">".($i + 1)."</a>";dej
echo "<a href="http://www.smonkey.ic.cz/new/clanky.php?stranka=".$url_cislo."">".($i + 1)."</a>";chyběli ti tam opačné lomítka…
Aha… nějaká chyba ve scriptu webu.. Nějak mi nezobrazuje opačné lomítka
Zdar. Proč skript stránkování nevypisuje data na další stránce?
CrazyDog:
Již vyřešeno, díky :-)
Dobrý den, dělam si fotogalerii v php a potrebuji strankovani jenže každe strankovaní má mysql, ale já bych ho chtěl bez mysql(protože ho moc jeste neumim použivat).Jde to nějak udelat když znám celkový počet fotek ?
Davirrr: Lze, ale museli by být fotografie pojmenované např. fotka001.jpg, fotka002.jpg atd. a nesmělo by žádné číslo chybět. Potom by to šlo, ale spíše se to hodí jen u galerie, která se nemění.
Super článek, moc mi pomohl, díky.
ahojte, ak sa mozem spytat potrebujem presne nieco take ALE moj problem je taky ze to php dava vystup do iframe v hlavnom html (teda nie na celu stranku) to potom pojde?
ondrej: Ahoj, tak generuj adresu s tagetem. Ale když už použiješ PHP stránkovaní, tak nevím proč to rovnou neincluduješ.
Nemohl by me nekdo funkcni kod prosimvas poslat na erosion@seznam.cz? Me to stale pise:
Undefined index: stranka
if($_GET[„stranka“] < 1) {$_GET[„stranka“] = 0;}
a nic to nevypisuje jen 1 a 2
CrazyDog:
sice nejsem moc opravnen jako zacatecnik neco upravovat nebo radit ale jeden kod bych mel misto teto podminky
if($_GET[„stranka“] < 1) {$_GET[„stranka“] = 0;}
pouzivam tuto podminku
/* pokud nenajde cislo stranky pocita vzorec s nulou */
if ( empty($_GET[„stranka“]) ) {
$url_stranka = ( 0 / $po) + 1;
/* Aktuální stránka */
}else {
$url_stranka = ($_GET[„stranka“] / $po) + 1; /* Aktuální stránka */
}
je to sice delsi ale nemusi se nic nikde nastavovat mozna to je i programatorsky nehezke ale ucine.
Zdravim, clanok zaujimavy avsak mam s nim problem.
Pocet stranok, ktore bude strankvoat vypise ( momentalne 3 ) avsak ked kliknem na napr. na 2 tak mi to neotvori nic ( 404 error).
stranky na webe includujem cez $_GET['strana'].
Ako ma vzerat URL na strankovani?
teraz pouzivam ?strana=blog ( vypisovane konkretneho clanku je ?strana=blog-clanok&id=cislo_z_db ).
vdaka za odpoved
warun: Zdravím pravděpodobně takhle ?strana=blog-clanok&id=cislo_z_db&stranka='.$url_cislo.' pokud se zachovali proměnné scriptu.
premenne som zachoval avsak ked dam tvar odkazu ?strana=blog&stranka='.$url_cislo.' tak to vyhodi chybu 404
warun: Script nemuze vyhodit chybu 404. 404 je neexistujici stranka. Takze te odkaz presmeruje na strana=blog ktery neexistuje nebo neco podobneho. Neco mas spatne nastavene. Prekontroluj si include,htacess,promenne… I bez strankovani by ti to vyhodilo chybu 404.
čau, použil jsem script na svůj web a píše mi to chybu
Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in C:ComplexWebServerhttp_docskategorie.php on line 55
řádek 54 vypadá takto:$cist = mysql_query(„SELECT * FROM products ORDER BY products_kategory ='$kategorie' DESC LIMIT“ .intval($stranka).„,$po“);
a řádek 55 takto:
while($data = mysql_fetch_assoc($cist)){