Názory ke článku Stránkovanie v PHP
nechapu, proc vymyslels zrovna takovyto tzpusob pro vyber z databaze:
select * from tabulka order by id
- taky zbytecne zatezujes databazovy server razenim. Na co potrebujes mit pri zjitovani velikosti serazene data podle ID.
A co kdybys mel v databazi treba jenom 100 000 zaznamu, to je vsechny vyberes?
Na SQL serverech jsou optimalizovane dotazy, ktere zjisti pocet radku.
SELECT COUNT(*) FROM TABLE_NAME WHERE 1;
A kdyz uz je tada mas vybrane vsechny, tak proc je v tom limitu jenom nevypises, ale delas dalsi vyber z dtabaze u urcitem limitu?
Mne sa toto riešenie až tak nepáči, videl som omnoho lepšie stránkovania (napr.: svoje ;)), ale musim povedať, že je to fajn podané, a tak aby to šlo ľahko pochopiť.... Mnoho dobrých skriptov začínajúci php-čkari jednoducho nevedia rozchodiť, toto by snáď mali ;)
chcel som pouzit tento script, no upravit si ho trochu podla mojich zvyklosti, aby som nepouzival zbytocne vela roznych nazvov premennych a tak, no po mojej uprave mi to sice zobrazi len 5 zaznamov, lebo mam nastavene $limit=5, ale pri kliknuti na druhu stranu mi zase zobrazi tieto iste zaznamy. Cim to je???
<?
require_once "otvordb.inc";
do {
if (!Otvordb()) break;
$výsledok = mysql_query("SELECT * FROM hry");
$pocet=mysql_num_rows($výsledok);
echo "$pocet" ;
}
while (false);
if ($ctrl1<>1)
{
$strana=1;
}//endif
$limit=5;
$celkovy_pocet=$pocet;
$pocet_stran=ceil($celkovy_pocet/$limit);
$pociatok=($strana*$limit)-$limit;
for ($i=1; $i<=$pocet_stran; $i++)
{
if ($i<>$strana)
{
echo "<a href=\"strankovanie.php?ctrl=1&strana=",$i,"\">",$i,"</a> | ";
}
else
{
echo "<font color=\"#ff0000\">",$i,"</font> | ";
}//endif
}//endfor
if ($strana<>$pocet_stran)
{
echo "<a href=\"strankovanie.php?ctrl=1&strana=",$strana+1,"\">nasledujúca strana</a>";
}//endif
echo "</p>";
$query="select * from hry order by id desc limit $pociatok, $limit";
$result=mysql_query($query) or die ("spojenie s databázou bolo neúspešné");
$num=mysql_num_rows($result);
while ($bunka=mysql_fetch_array($result))
{
echo "<p><i>",$bunka["id"],"</i></p>
";
}//end while
mysql_free_result($result);
?>
jo taky sem chtel pouzit tohle strankovani a dela me to to same co tobe
Zdravim,zkousel jsem si podle Vaseho serialu nasrtrankovat svoje stranky ale mam mensi problem.
Vytvori se mi sice odkaz na dalsi stranky,ale kdyz na ne kliknu tak se nic nestane,Jako ze se neprehodi na dalsi vypisy atd.Jenom se v adrese zmeni cislo straniky,obsah je stejny.
Predem dekuju
Zde je muj kod.
<pre>
<?
//pripojenie na databazu
$dbserver = "******";
$dbuser = "*******";
$dbpassword = "*****";
$dbname = "********";
$link=mysql_pconnect ($dbserver,$dbuser,$dbpassword) or die ("spojenie neúspešné.");
$db = mysql_select_db($dbname, $link) or die ("nepodarilo sa otvoriť databázu.");
//samotné stránkovanie
$query="select * from vyroky order by id";
$result=mysql_query($query, $link) or die ("spojenie s databázou bolo neúspešné");
$num=mysql_num_rows($result);
//$ctrl je pomocná premenná
if ($ctrl1<>1)
{
$strana=1;
}//endif
$limit=2;
$celkovy_pocet=$num;
$pocet_stran=ceil($celkovy_pocet/$limit);
$pociatok=($strana*$limit)-$limit;
for ($i=1; $i<=$pocet_stran; $i++)
{
if ($i<>$strana)
{
echo "<a href=\"index.php?ctrl=1&strana=",$i,"\">",$i,"</a> | ";
}
else
{
echo "<font color=\"#ff0000\">",$i,"</font> | ";
}//endif
}//endfor
if ($strana<>$pocet_stran)
{
echo "<a href=\"index.php?ctrl=1&strana=",$strana+1,"\">nasledujúca strana</a>";
}//endif
echo "</p>";
//výpis danej množiny prvkov
$query="select * from vyroky order by id desc limit $pociatok, $limit";
$result=mysql_query($query, $link) or die ("spojenie s databázou bolo neúspešné");
$num=mysql_num_rows($result);
while ($row=mysql_fetch_array($result))
{
echo " <div id=\"vyroky\">
<span class=\"vyroky-kdo\">Dokumnetarista<br></span>
<span class=\"vyroky-co\">".$row["dokumentarista"]."</span><br>
<span class=\"vyroky-kdo\">".$row["kdo"]."</span><br>
<span class=\"vyroky-co\">".$row["co"]."</span><br>
<span class=\"vyroky-kdo\"> ".$row["kdo1"]."</span><br>
<span class=\"vyroky-co\">".$row["co1"]."</span><br>
<span class=\"vyroky-kdo\">".$row["kdo2"]."</span><br>
<span class=\"vyroky-co\">".$row["co2"]."</span><br>
<span class=\"vyroky-kdo\">".$row["kdo3"]."</span><br>
<span class=\"vyroky-co\">".$row["co3"]."</span><br>
</div>
<br>" ;
}
mysql_free_result($result);
?>
</pre>
Dekuji
Tento skript nefunguje, jak má, protože je v něm docela malá chyba (ale udělá své):
<pre>//$ctrl je pomocná premenná
if ($ctrl1<>1)
{
$strana=1;
}//endif</pre>
ale správně to je takhle:
<pre>//$ctrl je pomocná premenná
if ($ctrl<>1)
{
$strana=1;
}//endif</pre>
Pokud však máte v nastavení register_globals = off, tak to musí být ještě trochu jinak (vlastně celkově jinak, ale to už nechám na vás):
<pre>//$_GET["ctrl"] je pomocná premenná
if ($_GET["ctrl"] <>1)
{
$strana=1;
}//endif</pre>
Teď by to již mělo bez problémů fungovat. Zádrhel totiž byl v tom, že se pokaždé vypisovala první stránka, neboť proměnná $ctrl1 neexistovala.
15. 12. 2006
tak zjistil jsem ze kdyz zmenis hodnotu v $stranka = 1 na treba 2 tak se ukaze druha stranka ale nevim bouzel jak to udelat aby to slo napadlo me GET ale co kdyz mate index.php a ne index.php?stranka=1 to je otazka velka
13. 6. 2007
pomozte mi prosim vyresit zahadu, diky
<?php
require 'pripojeni_k_db.php';
require 'sql_dotaz.php';
//require 'diskuse_akce.php';
$sql="select * from `diskuse` order by `id` desc";
$vysledek=mysql_query($sql);
if($vysledek==false)
{
return mysql_error();
exit();
}
$pocet_radku=mysql_num_rows($vysledek);
if ($page<>1)
{
$strana=1;
}
$limit=2;
$celkovy_pocet=$pocet_radku;
$pocet_stran=ceil($celkovy_pocet/$limit);
$pocatek=($strana*$limit)-$limit;
for ($i=1; $i<=$pocet_stran; $i++)
{
if($i<>$strana)
{
echo "<a href='index.php?page=diskuse&stranka=",$i,"'>",$i,"</a> | ";
}
else
{
echo "<font color='#FF0000'>",$i,"</font> | ";
}
}
if($strana<>$pocet_stran)
{
echo "<a href='index.php?page=diskuse&stranka=",$strana+1,"'>další</a>";
}
echo "</p>";
$sql="select * from `diskuse` order by `id` desc limit $pocatek, $limit";
$vysledek=mysql_query($sql);
if($vysledek==false)
{
return mysql_error();
exit();
}
$pocet_radku=mysql_num_rows($vysledek);
for($a=1;$a<=$pocet_radku;$a++)
{
$radek=mysql_fetch_object($vysledek);
require 'formular_zobrazit.php';
}
mysql_free_result($vysledek);
?>
6. 10. 2007
nejak nechapu proc je tam ta promenna $ctrl. dalo by se to prece napsat i bez ni, treba takto:
if (!isset($strana))
{
$strana=1;
}
nebo ne?
4. 7. 2008
Reagoval na komentář od uživatele rwr :
Jj da sa, poriesil som to takto :
if (!isset($_GET['strana'])){
$strana = 1;
}else{
$strana = _ai($_GET['strana']);
}
7. 8. 2008
caute chlapci ... take nieco potrebujem, no spominali ste, ze je to nie velmi dobre spravene ...
mohli by ste zverejnit dobre riesenie? alebo mi ho poslite na marek.dulius@gmail.com
vopred vdaka ...
11. 12. 2008
co tu mam zle ze mi stale zobrazuje vsetko a nerozdeli mi to do stranok... stranky mi sice vytvori ale na vsetkych je to iste a vsetko co v DB je
//samotné stránkovanie
$query="SELECT * FROM ajaxim_users ORDER BY id";
$result=mysql_query($query, $link) or die ("Spojenie s databázou bolo neúspešné");
$num=mysql_num_rows($result);
//$ctrl je pomocná premenná
if (!isset($_GET['strana'])){
$strana = 1;
}else{
$strana = ($_GET['strana']);
}//endif
$limit=10;
$celkovy_pocet=$num;
$pocet_stran=ceil($celkovy_pocet/$limit);
$pociatok=($strana*$limit)-$limit;
for ($i=1; $i<=$pocet_stran; $i++)
{
if ($i<>$strana)
{
echo "<a href=\"users.php?ctrl=1&strana=",$i,"\">",$i,"</a> | ";
}
else
{
echo "<font color=\"#FF0000\">",$i,"</font> | ";
}//endif
}//endfor
if ($strana<>$pocet_stran)
{
echo "<a href=\"users.php?ctrl=1&strana=",$strana+1,"\">nasledujúca strana</a>";
}//endif
echo "</p>";
//výpis danej množiny prvkov
$query="SELECT * FROM ajaxim_users ORDER BY id DESC LIMIT $pociatok, $limit";
$result=mysql_query($query, $link) or die ("Spojenie s databázou bolo neúspešné");
$num=mysql_num_rows($result);
while ($row=mysql_fetch_array($result))
{
echo "<p><i>",$row["text"],"</i></p>
";
}//end while
mysql_free_result($result);
2. 1. 2009
Mne tento clanok velmi pomohol. som v php lama, ale aj pre nas slnko svieti, nie? :P
...kujeeeeeeem
21. 2. 2009
databaza ide aj pridavanie prispevkov a ked pridam 5 prispevkov na stranku dalej sa vytvori odkaz na dalsiu ale prispevky stale pridava na prvu a po kliknuti mi ukaze len Error 404 - Not Found
The requested URL /index.php was not found on this server.
Požadovaná stránka /index.php nebyla nalezena.
stranku si mozete pozriet http://www.infinity.yw.sk/kniha_navstev.php
Kód:
<?
$dbServer = " ";
$dbUser = " ";
$dbPassword = " ";
$dbName = " ";
$link=mysql_pconnect ($dbServer,$dbUser,$dbPassword) or die ("Spojenie neúspešné.");
$db = mysql_select_db($dbName, $link) or die ("Nepodarilo sa otvoriť databázu.");
$query="SELECT * FROM kniha_navstev ORDER BY datum";
$result=mysql_query($query, $link) or die ("Spojenie s databázou bolo neúspešné");
$num=mysql_num_rows($result);
//$ctrl je pomocná premenná
if ($ctrl1<>1)
{
$strana=1;
}//endif
$limit=5;
$celkovy_pocet=$num;
$pocet_stran=ceil($celkovy_pocet/$limit);
$pociatok=($strana*$limit)-$limit;
for ($i=1; $i<=$pocet_stran; $i++)
{
if ($i<>$strana)
{
echo "<a href=\"index.php?ctrl=1&strana=",$i,"\">",$i,"</a> | ";
}
else
{
echo "<font color=\"#FF0000\">",$i,"</font> | ";
}//endif
}//endfor
if ($strana<>$pocet_stran)
{
echo "<a href=\"index.php?ctrl=1&strana=",$strana+1,"\">nasledujúca strana</a>";
}//endif
echo "</p>";
// -- Připojení k databázi a správné nastavení češtiny --
// Připojení k databázi.
$db_spojenie = mysqli_connect
('server', 'user', 'heslo', 'tabulka');
// Otestování, zda se připojení podařilo.
if (!$db_spojenie)
{
echo 'Připojení se nepodařilo, sorry';
echo '';
echo 'Popis chyby: ', mysqli_connect_error();
exit();
}
// Správné nastavení češtiny.
$objekt_vysledku = mysqli_query($db_spojenie, "SET NAMES 'cp1250'");
if (!$objekt_vysledku)
{
echo 'Poslání SQL příkazu se nepodařilo, sorry';
echo '';
echo 'Popis chyby: ', mysqli_error($db_spojenie);
exit();
}
// -- Vlož nový zápis, pokud byl odeslán formulářem --
// Test, jestli přišla data z formuláře.
if (isset($_POST['sprava']))
{
// Vytvoření SQL příkazu typu INSERT.
$sql_prikaz =
"INSERT INTO kniha_navstev(datum,meno,email,zapis) "
."VALUES(NOW(),'"
.mysqli_real_escape_string($db_spojenie,$_POST['meno'])
."','"
.mysqli_real_escape_string($db_spojenie,$_POST['email'])
."','"
.mysqli_real_escape_string($db_spojenie,$_POST['sprava'])
."')"
;
// Zaslání SQL příkazu do databáze.
$objekt_vysledku = mysqli_query($db_spojenie, $sql_prikaz);
if (!$objekt_vysledku)
{
echo 'Poslání SQL příkazu se nepodařilo, sorry';
echo '';
echo 'Popis chyby: ', mysqli_error($db_spojenie);
exit();
}
echo 'Nový zápis do knihy návštev pridaný.';
}
// -- Vypiš všechny zápisy v knize návštěv --
// Zaslání SQL příkazu do databáze.
$objekt_vysledku = mysqli_query($db_spojenie,
'SELECT * FROM kniha_navstev order by datum DESC');
if (!$objekt_vysledku)
{
echo 'Poslání SQL příkazu se nepodařilo, sorry';
echo '';
echo 'Popis chyby: ', mysqli_error($db_spojenie);
exit();
}
// Zobrazení všech vrácených dat.
while ($riadok = mysqli_fetch_array($objekt_vysledku))
{
echo '<hr />';
echo 'Dátum a čas: ',$riadok['datum'],'';
echo 'Napísal: ',$riadok['meno'],' (',$riadok['email'],')';
echo 'Zápis: ',$riadok['zapis'],'';
echo '';
}
?>
</body>
</html>
<form name="kniha" action="" method="post">
<b>Meno:</b>
<input name="meno" size="40">
<b>Mail:</b>
<input name="email" size="40">
<b>Správa:</b>
<textarea name="sprava" rows="5" cols="30"></textarea>
<input type="submit" value="Odoslať správu">
</form>
</body>
</html>
Reagoval na komentář od uživatele G-zdenek :
Mám ten samí problém :(
Chtělo by to napsat novější článek, přece jen tohle je trochu neoptimalizovaný ne?
já používám:
function strankovani($konec,$akt,$cesta="./")
{
echo "<div class='strankovani'>\n";
For($i=1;$i<=$konec;$i++):
echo "\t<a href=\"{$cesta}strana$i\"".($i==$akt ? "class=\"oznacene\" onClick=\"return false\"" : null).">$i</a>".($i+1<$konec ? ", " : null)."\n";
EndFor;
echo "</div>\n";
}
$strana=(int)$_GET['strana']>1 ? (int)$_GET['strana'] : 1;
strankovani($kat['pocet']/10,$strana,"/vtipy/$kategorie/");
$od=Floor(($strana-1)*10);
potom v Query: LIMIT $od,10
27. 11. 2010
Jde aplikovat strankovani i na samotni Html tabulku bez databaze?
Vim ze jo a ze je to neefentivni jen by mne zajimal ten postup, diki
17. 3. 2012
Takze takto som to vyriesil ja a je to funkcne, hoci si myslim, ze keby som sa so strankovanim trochu hral urobil by som aj lepsie strankovanie. :D
<?php
$con = mysql_connect("localhost","root","");
if (!$con)
{
die('Nie je možné sa pripojiť k mysql serveru: ' . mysql_error());
}
mysql_select_db("Nazov_databazy", $con);
$result = mysql_query("SELECT * FROM nazov_tabulky");
$num=mysql_num_rows($result);
if (!isset($_GET['strana'])){
$strana = 1;
}else{
$strana = ($_GET['strana']);
}//endif
$limit=10;
$celkovy_pocet=$num;
$pocet_stran=ceil($celkovy_pocet/$limit);
$pociatok=($strana*$limit)-$limit;
for ($i=1; $i<=$pocet_stran; $i++)
{
if ($i<>$strana)
{
echo "<a rel="nofollow" href=\"vysledky.php?ctrl=1&strana=",$i,"\">",$i,"</a> | ";
}
else
{
echo "<font color=\"#0000FF\">",$i,"</font> | ";
}//endif
}//endfor
if ($strana<>$pocet_stran)
{
echo "<a rel="nofollow" href=\"vysledky.php?ctrl=1&strana=",$strana+1,"\">nasledujúca strana</a>";
}//endif
echo "</p>";
$result = mysql_query("SELECT id, ocakavanie FROM dotaznik order by id LIMIT $pociatok, $limit");
$num=mysql_num_rows($result);
while($row = mysql_fetch_array($result))
{
echo "<div><br/><br/>".$row['id']."<br/>".$row['ocakavanie']."</div>";
}
mysql_close($con);
?>
17. 3. 2012
#23 Mariano
Ešte jedna drobná úprava :D
<?php
$con = mysql_connect("localhost","root","");
if (!$con)
{
die('Nie je možné sa pripojiť k mysql serveru: ' . mysql_error());
}
mysql_select_db("Nazov_databazy", $con);
$result = mysql_query("SELECT * FROM nazov_tabulky");
$num=mysql_num_rows($result);
if (!isset($_GET['strana'])){
$strana = 1;
}else{
$strana = ($_GET['strana']);
}//endif
$limit=10;
$celkovy_pocet=$num;
$pocet_stran=ceil($celkovy_pocet/$limit);
$pociatok=($strana*$limit)-$limit;
if ($strana>1)
{
echo "<a rel="nofollow" href=\"vysledky.php?ctrl=1&strana=",$strana-1,"\">predchádzajúca strana</a> |";
}//endif
for ($i=1; $i<=$pocet_stran; $i++)
{
if ($i<>$strana)
{
echo "<a rel="nofollow" rel="nofollow" href=\"vysledky.php?ctrl=1&strana=",$i,"\">",$i,"</a> | ";
}
else
{
echo "<font color=\"#0000FF\">",$i,"</font> | ";
}//endif
}//endfor
if ($strana<>$pocet_stran)
{
echo "<a rel="nofollow" rel="nofollow" href=\"vysledky.php?ctrl=1&strana=",$strana+1,"\">nasledujúca strana</a>";
}//endif
echo "</p>";
$result = mysql_query("SELECT id, ocakavanie FROM dotaznik order by id LIMIT $pociatok, $limit");
$num=mysql_num_rows($result);
while($row = mysql_fetch_array($result))
{
echo "<div><br/><br/>".$row['id']."<br/>".$row['ocakavanie']."</div>";
}
mysql_close($con);
?>
17. 3. 2012
#24 Mariano
Tak teraz prilozim jednu upravenu verziu strankovania, kde som doladil niektore veci. Tiez vychadza z toho isteho zakladu ako v clanku.
<?php
//spojenie s databazou
$con = mysql_connect("host","user","heslo");
if (!$con)
{
die('Nie je možné sa pripojiť k mysql serveru: ' . mysql_error());
}
mysql_select_db("Nazov_databazy", $con);
//strankovanie
$result = mysql_query("SELECT * FROM Nazov_tabulky");
$num=mysql_num_rows($result);
//namiesto pomocnej premennej ctrl
if (!isset($_GET['strana'])){
$strana = 1;
}else{
$strana = ($_GET['strana']);
}//endif
//nastavenie limitu
$limit=10;
//nacitanie poctu riadkov v databaze do premennej celkovy_pocet
$celkovy_pocet=$num;
//vypocet poctu stran
$pocet_stran=ceil($celkovy_pocet/$limit);
/nastavenie zaciatku vypisu z databazy, ak prekrocil limit
$pociatok=($strana*$limit)-$limit;
// Vytvorenie odkazu na prvu stranu
echo "<a href=\"vysledky.php?ctrl=1&strana=1\">Na začiatok</a> ";
if ($strana>1)
{
echo "<a href=\"vysledky.php?ctrl=1&strana=",$strana-1,"\"><<</a> | ";
}//endif
// strankovanie medzi prvou a poslednou stranou
for ($i=1; $i<=$pocet_stran; $i++)
{
//nahradenie cisiel bodkami ked sa prekroci viac ako tri strany od aktualnej
if ((($i > $strana - 3) && ($i < $strana + 3)) || ($i == 1) || ($i == $pocet_stran))
{
// nahrada cisel skrytych stranok za bodky
$bodky_l = '';
$bodky_p = '';
if (($i == 1) && ($strana > 3)) $bodky_l = '.. ';
if (($i == $pocet_stran) && ($strana < $pocet_stran - 3)) $bodky_p = '.. ';
if ($i==$strana)
{
echo "<span style='color: #00aaff; font-size: 130%'>".$i."</span> | "; //zvyraznenie aktualnej strany
}
else
{
//cisla neaktualnych stranok budu ako odkaz
echo $bodky_p."<a href=\"vysledky.php?ctrl=1&strana=".$i."\"><font color=\"##0000FF\">",$i,"</font></a> |
".$bodky_l;
}//endif
}
}//endfor
// nasledujuca strana
if ($strana<$pocet_stran)
{
echo "<a href=\"vysledky.php?ctrl=1&strana=",$strana+1,"\">>></a>";
}//endif
//odkaz na uplny koniec stranok
echo " <a href=\"vysledky.php?ctrl=1&strana=$pocet_stran\">Na koniec</a>";
echo "</p>";
//samotny vypis z databazy
$result = mysql_query("SELECT id, ocakavanie FROM dotaznik order by id LIMIT $pociatok, $limit");
$num=mysql_num_rows($result);
while($row = mysql_fetch_array($result))
{
echo "<div><br/><br/>".$row['id']."<br/>".$row['ocakavanie']."</div>";
}
//koniec prace s databazou
mysql_close($con);
?>
6. 4. 2012
#25 Mariano
K mojmu predchadzajucemu scriptu: Ked este pred riadok " if (!isset($_GET['strana'])){ " pridate podmienku if ($pocet_stran > 1) { if (!isset($_GET['strana'])){ .....zvysok kodu } tak dosiahnete, ze sa vam strankovanie zobrazi, len ked bude viac ako jedna strana.
17. 12. 2013
#24 Mariano Hore v kóde máš maličkú chybu ;)
pri
/nastavenie zaciatku vypisu z databazy, ak prekrocil limit
ti chýba "/" tým pádom je kód nepoužiteľný...
Pre ostatných... Mne sa to stránkovanie celkom páčilo pretože bolo jednoduché a rýchlo sa dalo prispôsobiť... Ale teraz skôr použijem pre svoj projekt stránkovanie ktoré upravil Mariano :) Každopádne dík :)