[PHP] stránkování

Webdesign, HTML, CSS, Flash, PHP, ASP, .NET, JavaScript. Kritika www stránek na Smetišti.

Moderátor: Moderátoři Živě.cz

Odeslat příspěvekod medvidek88 2. 5. 2008 09:00

Mam udělané jednoduché stránkování. [ 1 2 3 4 5 6] ... atd
Bohužel pokud je více příspěvků, tak je ten výpis stránek samozřejmě moc dlouhý.Jak udělat stránkování typu: [1 2 3 ... 22 23 24 ... 122 123 124] .
NO IE !!!
medvidek88
Junior
Uživatelský avatar

Odeslat příspěvekod mattthew 2. 5. 2008 09:41

Ak uz mas to strankovanie s vypisom vsetkych stranok, tak si myslim, ze to nie je az take tazke. Zrejme tam mas niekde nejaky foreach alebo nieco podobne, kde vykreslujes tie jednotlive cisla s tranok s odkazmi na ne, tak tam daj nejake pocitadlo a podmienku, nech sa vypisu len prve 3, potom okolo aktualnej stranky po jednej a posledne tri

napr.:
Kód: Vybrat vše
$pocet = count($pole_stranok); // pocet vsetkych stranok
$poradie = 1;
$aktualna stranka = $_GET["page"];
$dots= false;
foreach ($pole_stranok as $stranka) {
  if($poradie <= 3 || ($poradie >= $aktualna_stranka -1 && $poradie <= $aktualna_stranka + 1) || $poradie > $pocet - 3) {
    echo "<a href=\"$stranka[odkaz]\">$poradie</a> ";
    $dots = true;
  } elseif($dots) {
    echo " . . .";
    $dots = false;
  }
  $poradie++;
}


samozrejme to treba spravne zakomponovat do nejakeho objektu alebo funkcie, tu je len hruby naznak nejakej podmienky
mattthew
Junior
Uživatelský avatar

Odeslat příspěvekod medvidek88 2. 5. 2008 20:12

To sem samozrejme zkousel, ale nejak sem se zamotal do podminek :) Musim osetrit pokud bude mene nez 9 stranek, dale pokud ty si zobrazi stranku 1 2 nebo 3 tak se prosredek nebude zobrazovat .. co zobrazit pokud si zobrazi sranu 4 ? atd .... :(
NO IE !!!
medvidek88
Junior
Uživatelský avatar

Odeslat příspěvekod trickIT 2. 5. 2008 20:26

Nuz ked si sa zamotal do podmienok, tak by si mal venovat trochu casu PHPcku a programovaniu vobec, pretoze bez toho, aby si obratne vedel narabat so zakladnymi vecami ako su podmienky sa daleko nedostanes, nic v zlom .. peace
trickIT
Junior
Uživatelský avatar

Odeslat příspěvekod medvidek88 3. 5. 2008 00:38

:) PHPcku mam venovano dost casu, to mi ver :) Programovani taky .. jen sem chtel zjistit, jestli to nekdo jiz resil a nemol by me popostrcit k nejakemu elegantnejsimu reseni :) Takze ono neni probelm to "zbastlit" dohromady ... ale nechci aby to melo kod na 200 radku :) Takze pokud si toto jeste nekdy neresil, tak pis svoje velice uzitene rady nekam, kde je to potreba :)

P.S.: prikladam muj kod:

Kód: Vybrat vše
$stranka=$_GET["pocet"];
$pocet_komentaru=5;
$vysledek=mysql_query("SELECT * FROM diskuze WHERE odpoved='0' ORDER BY datum DESC, cas DESC LIMIT $pocet_komentaru OFFSET " . ($pocet_komentaru * $stranka - 5));
$pocet=mysql_num_rows(mysql_query("SELECT id FROM diskuze WHERE odpoved='0' "));
$pocet_stranek=ceil($pocet/$pocet_komentaru);
echo "Stránky: ";
for($i=0; $i < $pocet_stranek; $i++)
{
$cislo = ($i + 1);
if($stranka != $cislo)
{
echo " <a href=\"/diskuze/".($i + 1)."/\">".($i + 1)."</a> ";
}
else
{
echo "<strong style=\"color: #C60800; padding: 0 2px 0 2px; border: 1px solid #C8C8C8; font-size: 15px;\">".($i + 1)."</strong>";
}
}

a tohle mi prijde zbytecne slozity :)
Kód: Vybrat vše
class strankovani {
    var $url;
    var $interval;
    var $sql;
    var $list;
    var $before;
    var $after;
    var $numLists;
    var $numRecords;
    var $errName;
    var $befError = "<div align=\"center\" style=\"color: maroon;\">";
    var $aftError = "</div>";
   

    function strankovani($conUrl = "./diskuze/", $conInterval = 10, $conList = 1, $conBefore = "", $conAfter = "", $conSql = ""){
        $this->errName[1] = "Nebyl zadán SQL dotaz!<br />\n";
        $this->errName[2] = "Nelze zobrazit listování<br/>\n";
        $this->errName[3] = "Nelze zobrazit listování<br />\n";
        $this->url = $conUrl;
        $this->interval = $conInterval;
        $this->list = $conList;
        $this->before = $conBefore;
        $this->after = $conAfter;
        if (Empty($conSql)){
            $this->error(1);
        }
        else {
            $this->sql = $conSql;
        }
    }
   
   
    function dbSelect(){
        $listRecord = @MySQL_Query($this->sql);
        if (!$listRecord){
            $this->error(2);
        }
        $allRecords = @MySQL_Num_Rows($listRecord);
        if (!$allRecords){
            $this->error(3);
        }
        $allLists = ceil($allRecords / $this->interval);
       
        $this->numLists = $allLists;
        $this->numRecords = $allRecords;
       
    }
   
   
    function listNumber(){
        $this->dbSelect();
        echo $this->before;
        for ($i = 1; $i <= $this->numLists; $i++){
            $isLink = 1;
            $spacer = " - ";
           
            if (Empty($this->list)){
                $this->list = 1;
            }
            if ($i == $this->list){
                $isLink = 0;
            }
            if ($i == $this->numLists){
                $spacer = "";
            }
            if ($isLink == 0){
                echo $i." ".$spacer;
            }
            if ($isLink == 1){
                echo "<a href=\"".$this->url."&list=".$i."\" onFocus=\"blur()\">".$i."</a> ".$spacer;
            }
        }
        echo $this->after;
    }
   
   
    function listInterval(){
        $this->dbSelect();
        echo $this->before;
        for ($i = 1; $i <= $this->numLists; $i++){
            $isLink = 1;
            $spacer = " | ";
            $from = ($i*$this->interval)-($this->interval-1);
            $to = $i*$this->interval;
           
            if (Empty($this->list)){
                $this->list = 1;
            }
            if ($i == $this->list){
                $isLink = 0;
            }
            if ($i == $this->numLists){
                $to = $this->numRecords;
                $spacer = "";
            }
            if ($isLink == 0){
                echo $from."-".$to." ".$spacer;
            }
            if ($isLink == 1){
                echo "<a href=\"".$this->url."&list=".$i."\" onFocus=\"blur()\">".$from."-".$to."</a> ".$spacer;
            }
        }
        echo $this->after;
    }
   
   
    function listPart(){
        $this->dbSelect();
        echo $this->before;
        if (Empty($this->list)){
                $this->list = 1;
        }
        $from = ($this->list*$this->interval)-($this->interval-1);
        $to = $this->list*$this->interval;
        $forward = "<a href=\"".$this->url."&list=1\" onFocus=\"blur()\">&lt;&lt;&lt;</a>&nbsp;<a href=\"".$this->url."&list=".($this->list-1)."\" onFocus=\"blur()\">&lt;&lt;</a>&nbsp;";
        $backward = "&nbsp;<a href=\"".$this->url."&list=".($this->list+1)."\" onFocus=\"blur()\">&gt;&gt;</a>&nbsp;<a href=\"".$this->url."&list=".$this->numLists."\" onFocus=\"blur()\">&gt;&gt;&gt;</a>";
       
        if ($this->list == 1){
            $forward = "";
        }
        if ($this->list == $this->numLists){
            $to = $this->numRecords;
            $backward = "";
        }
        echo $forward.$from."-".$to.$backward;
        echo $this->after;
    }
   
   
    function error($errNum = 0){
        if ($errNum != 0){
            echo $this->befError.$this->errName[$errNum].$this->aftError;
        }
    }
}
NO IE !!!
medvidek88
Junior
Uživatelský avatar

Odeslat příspěvekod trickIT 3. 5. 2008 10:20

Riesil som to milion krat ... Ale kedze sa spravas tak, ako sa spravas, radu nedostanes :p A ze mas toho odprogramovaneho dost ma nepresvedcis, pretoze zamotat sa do podmienok moze akurat clovek, ktory toho odprogramovaneho dost nema :P
trickIT
Junior
Uživatelský avatar

Odeslat příspěvekod medvidek88 3. 5. 2008 19:31

Ano ses nejlepsi, svoje rady si strč do .... pokud možno se už raději nevyjadřuj.Vim ze si nejlepsi, nejchytrejsi atd .. takovyhc jako ty znam hodne, takze si res strankovani treba nekonecnekrat a nehon si zbytecne tricko !!
NO IE !!!
medvidek88
Junior
Uživatelský avatar

Odeslat příspěvekod Bask3r 11. 12. 2008 15:30

Ahojte...
ja mam urobene strankovanie takto ale nieco mam zle.. stale mi zobrazuje vsetko na jednej strane a nerozdeli to do stran... stranky mi sice vytvori ale ked si kliknem na hoc aku stranku stale sa mi zobrazi to iste a vsetko z DB... viete niekto co mam zle v tomto code?


Kód: Vybrat vše
//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);
Bask3r
Kolemjdoucí

Odeslat příspěvekod Vebloud 11. 12. 2008 19:29

medvidek88 píše:Ano ses nejlepsi, svoje rady si strč do .... pokud možno se už raději nevyjadřuj.Vim ze si nejlepsi, nejchytrejsi atd .. takovyhc jako ty znam hodne, takze si res strankovani treba nekonecnekrat a nehon si zbytecne tricko !!


TrickIt má pravdu, pokud se chováš takhle, tak to odrazuje od toho aby ti někdo poradil. Krom toho zamotat se do pomínek tohoto charajteru je opravdu programátorská ostuda ,teda pokud nejsi mladý prgátor, s málo zkušenostmi, pak je to co jsi psal výše o svém věnování programování chvastounství, nebo prostě jenom pocit, že po půl roce to musím umět všechno.

Krom toho pokud máš špocit, že pokud ti někdo nepomůže, tak stvoříš bastl na 200 řádků. tak to chce se buďto velmi důkladn věnovat spíše obecně programování, nebo se na to v...t.

Krom toho bývá zvykem se hodit aspoň nástřel vlastního řešení, které nefunguje, pak se poněkud lépe radí.

P.S.: Vůbec nemám pocit, že jsem nejlepší programátor, proto jsem se na to vyprdl a dělám analýzu, ale tohle bych zvládnul snadno, ale tobě nemám potřebu to dokazovat.
Žít a nechat žít, ty máš svůj názor, já mám svůj názor, já ti nebudu nutit svůj, nemusím souhlasit s tvým, ale udělám vše, abys ho mohl svobodně vyjádřit.
Vebloud
Ex-moderátor
Uživatelský avatar

Odeslat příspěvekod Bask3r 11. 12. 2008 20:36

to je sice pekne ze a tu takto pekne bavite ale toto je porada a nie debatny kruzok o nicom... ak by ste mi radsej pomohli s mojim problemom ako sa tu natahovali kto je najlepsi na svete >:-(

BTW: to mi fakt nevie nikto poradit co mam v tom kode zle? :roll:
Bask3r
Kolemjdoucí

Odeslat příspěvekod K8 12. 12. 2008 08:35

no pokud se zobrazi vse, tak je asi treba zacit od konce - proc ten dotaz vse vypisuje a neni to omezeno temi promennymi v LIMIT - tedy jake maji hodnoty? jak vypada cely sestaveny dotaz - je spravne?
K8
Pokročilý

Odeslat příspěvekod Bask3r 13. 12. 2008 07:56

no tak to neviem... mam to presne takto alebo si pozri kod co som pisal vyssie... presne ten mam aj na stranke len som tu nedal pripojenie k databze...
ono mi to na stranky rozpocita presne podla prispevkov len mi tie prispevky stale vyhodi vsetky... mam napr 20 prispevkov a ak nastavim aby sa zobrazovalo 5 na stramku tak mi to vytvori 4 strany ak dam 10 na stranku tak mi to vytvori 2 strany... ale na tych stranach je stale tych 20 prispevkov a neroydeli ich...

Kód: Vybrat vše
$limit=10;   
$celkovy_pocet=$num;   
$pocet_stran=ceil($celkovy_pocet/$limit);   
$pociatok=($strana*$limit)-$limit;   
 
for ($i=1; $i<=$pocet_stran; $i++)   
Bask3r
Kolemjdoucí

Odeslat příspěvekod Mareen 13. 12. 2008 09:35

Bask3r píše:no tak to neviem... mam to presne takto alebo si pozri kod co som pisal vyssie... presne ten mam aj na stranke len som tu nedal pripojenie k databze...
ono mi to na stranky rozpocita presne podla prispevkov len mi tie prispevky stale vyhodi vsetky... mam napr 20 prispevkov a ak nastavim aby sa zobrazovalo 5 na stramku tak mi to vytvori 4 strany ak dam 10 na stranku tak mi to vytvori 2 strany... ale na tych stranach je stale tych 20 prispevkov a neroydeli ich...


uvedeny kod funguje spravne, zobrazuje jen 10 prispevku na stranku, jses si jistej, ze to tam mas presne takhle?
jinak pocet prispevku bys mel zjistovat pomoci SELECT COUNT(*) ... a taky ti tam chybi jednou free_result
Mareen
Junior

Odeslat příspěvekod K8 13. 12. 2008 10:44

K8 píše:no pokud se zobrazi vse, tak je asi treba zacit od konce - proc ten dotaz vse vypisuje a neni to omezeno temi promennymi v LIMIT - tedy jake maji hodnoty? jak vypada cely sestaveny dotaz - je spravne?

tim mam na mysli, ze si tam das neco jako echo $query, abys videl jaky dotaz se ti opravdu provadi
K8
Pokročilý

Odeslat příspěvekod Vebloud 13. 12. 2008 12:05

Tak počet řádků rohzodně nezískávat pomocí COUNTU, ale pomoci SQL_CALC_FOUNDS:
Kód: Vybrat vše
mysql> SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name WHERE id > 100 LIMIT 10;
mysql> SELECT FOUND_ROWS();

Viz. http://dev.mysql.com/doc/refman/5.0/en/information-functions.html

Je to mnohem rychlejší.
Žít a nechat žít, ty máš svůj názor, já mám svůj názor, já ti nebudu nutit svůj, nemusím souhlasit s tvým, ale udělám vše, abys ho mohl svobodně vyjádřit.
Vebloud
Ex-moderátor
Uživatelský avatar

Další stránka

Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 0 návštevníků