Kom ihåg mig?
Home Menu

Menu


Avancerad sidnumrering i PHP

 
Ämnesverktyg Visningsalternativ
Oläst 2012-07-08, 03:17 #1
jonssondesign jonssondesign är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Oct 2010
Inlägg: 709
jonssondesign jonssondesign är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Oct 2010
Inlägg: 709
Standard Avancerad sidnumrering i PHP

Godmorgon mina kära wn-vänner!

Jag har 2 frågor som jag hoppas att ni kan svara på.

1) Säg att du är inne på en klädbutik på internet, och du sitter och kollar på badbyxor för killar. Sen känner du att du vill gå in på tjej avdelningen, och när du trycker på "kvinnor" i gender-menyn, vilket känns mest naturligt då?

1.1) Att man kommer till avdelningen för tjejer och direkt till kategoryn badkläder.

1.2) Att man kommer till avdelningen för tjejer, men inte in i någon underkategori.

Vad tror ni?

--------------------------------------
--------------------------------------

2) Nu till programmeringsproblemet.

Jag håller på och försöker programmera en sidnumrering, men får (uppenbarligen) inte till det som jag vill.

I dagsläget har jag det såhär:

1 2 3 4 5 ... 25
1 2 3 4 5 6 ... 25
1 2 3 4 5 6 7 ... 25
1 2 3 4 5 6 7 8 ... 25
osv ända tills:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

Som du förstår kan man ju inte ha det så..
Jag försöker eftersträva en version som liknar detta:

1 2 3 4 5 ... 25
1 2 3 4 5 ... 25
1 2 3 4 5 ... 25
1 2 3 4 5 ... 25
5 6 7 8 9... 25
5 6 7 8 9... 25
5 6 7 8 9... 25
5 6 7 8 9 ... 25
osv ända tills:
21 22 23 24 25

Hur ska jag tänka då? Någon som kan ge mig tips, eller ännu bättre, göra om min kod så att den (enligt din tro) fungerar som jag vill ha det. (Förklara inte hur du har gjort till en början, utan låt mig istället få försöka tänka ut det hela själv, och sen får du rätta mig om jag har fel )

Såhär ser min kod ut i function.php:

Tips!:

$num_rows = 49 produkter (rader i databasen)
$page = vilken sida man är på (startar på 0)
$page_amount = hur många sidor det finns (produkter delat på antal per sida, avrundat uppåt)
$dottes = räknare var ... ska finnas


PHP-kod:
function paging(){
    global 
$num_rows;
    global 
$page;
    global 
$page_amount;
    
$dottes 0;
    if(
$page_amount != "0"){

        echo 
"<ul>";

        if(
$page != "0"){
            
$prev $page-1;
            echo 
"<li><a href=\"index.php?p=$prev\">F&ouml;reg&aring;ende</a></li>";
        }

        for ( 
$counter 0$counter <= $page_amount$counter += 1) {

            if (
$counter == $page) {
                echo 
"<li class=\"curr\"><a href=\"index.php?p=$counter\">";
                echo 
$counter+1;
                echo 
"</a></li>";
            } else {

                if (
$counter $page+5) {
                    echo 
"<li><a href=\"index.php?p=$counter\">";
                    echo 
$counter+1;
                    echo 
"</a></li>";
                } else if (
$counter $page_amount-1) {
                    echo 
"<li><a href=\"index.php?p=$counter\">";
                    echo 
$counter+1;
                    echo 
"</a></li>";
                } else {
                    
$dottes++;
                    if (
$dottes == 1) {echo "<li>...</li>";}
                };
            }
        }

        if(
$page $page_amount){
            
$next $page+1;
            echo 
"<li><a href=\"index.php?p=$next\">N&auml;sta</a></li>";
        }
        echo 
"</ul>";

    }

Klarar ni att besvara båda frågorna, och även lyckas hjälpa med mitt eländiga problem med sidnumreringen så tackar jag verkligen mycket! (jag har bara jobbat med php och mysql några veckor... That's why i can't solve it myself..

Vi höres nästa gång jag slår upp ögonlocken! Godnatt!
jonssondesign är inte uppkopplad   Svara med citatSvara med citat
Oläst 2012-07-08, 09:25 #2
Björn Björn är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: May 2004
Inlägg: 1 224
Björn Björn är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: May 2004
Inlägg: 1 224
1. Använd inte kontextberoende huvudmenyer. Ett menyalternativ, om det är en huvudmeny, ska alltid vara till samma sida.
Björn är inte uppkopplad   Svara med citatSvara med citat
Oläst 2012-07-08, 12:53 #3
jonssondesign jonssondesign är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Oct 2010
Inlägg: 709
jonssondesign jonssondesign är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Oct 2010
Inlägg: 709
Björne, du har så rätt. Precis vad jag också kände/tänkte. Men var osäker. Kände att jag bara ville ha någon med samma tänk som mig själv.

Någon som kan lösa programmeringsproblemet?

Nu är jag tillräckligt pigg för att leta på google efter svaret, men de är inte alltid så lätt att förstå vad andra personer skriver. tyvärr. Men får se efter! Hittar jag en lösning berättar jag även den för er

På återseende!
jonssondesign är inte uppkopplad   Svara med citatSvara med citat
Oläst 2012-07-08, 14:12 #4
jonssondesign jonssondesign är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Oct 2010
Inlägg: 709
jonssondesign jonssondesign är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Oct 2010
Inlägg: 709
Jag antar att problemet/lösningen ligger i denna if-satts. Eller hur?

PHP-kod:
if ($counter $page+5
eftersom att: Om $counter är mindre än nuvarande sidan + 5...

Tänk Fredrik, TÄNK!
jonssondesign är inte uppkopplad   Svara med citatSvara med citat
Oläst 2012-07-08, 16:23 #5
Linuus Linuus är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Jan 2009
Inlägg: 890
Linuus Linuus är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Jan 2009
Inlägg: 890
Jag skulle nog rekommendera att göra en som ser ut såhär:

<<Första <Föregående ... 7 8 9 10 11 12 13 ... Nästa> Sista>>

Känns lite tydligare än ditt exempel
Linuus är inte uppkopplad   Svara med citatSvara med citat
Oläst 2012-07-08, 17:30 #6
jonssondesign jonssondesign är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Oct 2010
Inlägg: 709
jonssondesign jonssondesign är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Oct 2010
Inlägg: 709
Smart tänkt där Linuus! Ser mycket bättre ut! Tänkte mig förstå såhär typ:

Föregående 1 ... 7 8 9 10 11 ... 25 Nästa
Egentligen bara för att (Första och Sista) knappar är så fult.. Tänkte då istället använda mig av 1 och 25 (eller högsta siffran).

Men kanske ska testa med vanliga knappar som du säger .
jonssondesign är inte uppkopplad   Svara med citatSvara med citat
Oläst 2012-07-08, 17:34 #7
jonssondesign jonssondesign är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Oct 2010
Inlägg: 709
jonssondesign jonssondesign är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Oct 2010
Inlägg: 709
På PHPportalen fick jag detta som svar:

Om du är på sida p skall det första sidnumret (av de fem) vara 4 * ((p-1) div 4) + 1.
I PHP implementeras x div y som (int)floor(x/y).


Förstår inte riktigt, för han menar på att "p" ska vara den nuvarande sidan. Alltså, p innehåller nuvarande sidans siffra.

Är man tex på startsidan är p = 0.

Vilket gör att hans uträkning blir 0!

Och man får då:

1 ... 25
1 2 ... 25
1 2 3 ... 25
1 2 3 4 ... 25

osv..

Inte riktigt som jag vill :P

Någon som kan förklara vad han menar?

Jag satte in hans kod kanske på fel ställe? Eller så fattar jag bara itne.. hm


PHP-kod:
                    $cut = (int)floor(* (($page-1) / 4)+ 1);
                    if (
$counter $cut) {
                        echo 
"<li><a href=\"index.php?p=$counter\">";
                        echo 
$counter+1;
                        echo 
"</a></li>";
                    } else if (
$counter $page_amount-1) {
                        echo 
"<li><a href=\"index.php?p=$counter\">";
                        echo 
$counter+1;
                        echo 
"</a></li>";
                    } else {
                        
$dottes++;
                        if (
$dottes == 1) {echo "<li>...</li>";}
                    }; 
jonssondesign är inte uppkopplad   Svara med citatSvara med citat
Oläst 2012-07-08, 22:02 #8
Droog Droog är inte uppkopplad
Medlem
 
Reg.datum: Apr 2011
Inlägg: 129
Droog Droog är inte uppkopplad
Medlem
 
Reg.datum: Apr 2011
Inlägg: 129
Här är ett förslag på hur paginering kan se ut. Den har
"till första sidan i listan",
"till föregående sida i listan"
"+/-5 steg i listan"
antal sidor i listan
select för att hoppa till valfri sida
"till nästa sida i listan"

Vad gäller att hoppa till specifika underkategorier beroende på kön, jag hade gärna velat stanna kvar på den nivå jag är, men det kommer att bli så mycket extra pill med att hålla koll på om kategorin finns för respektive kön eller ej, samt att användarna då kommer att landa kors och tvärs beroende på om kategorin finns eller ej, så det kommer bara att framstå som konstigt och förvirrande. Så i slutändan: Skippa det.
Droog är inte uppkopplad   Svara med citatSvara med citat
Oläst 2012-07-08, 22:48 #9
jonssondesign jonssondesign är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Oct 2010
Inlägg: 709
jonssondesign jonssondesign är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Oct 2010
Inlägg: 709
Hej vänner! Jag har gjort om sidnumreringen aningen. Jag gillar den som den är idag faktiskt.

-------
-------

Ser nu ut såhär:

1 2 3 4 5 ... 24 Nästa
Föregående 1 2 3 4 5 ... 24 Nästa
Föregående 1 2 3 4 5 ... 24 Nästa
Föregående 1 2 3 4 5 ... 24 Nästa
Föregående 1 ... 5 6 7 8 9 ... 24 Nästa
Föregående 1 ... 5 6 7 8 9 ... 24 Nästa
Föregående 1 ... 5 6 7 8 9 ... 24 Nästa
Föregående 1 ... 5 6 7 8 9 ... 24 Nästa
Föregående 1 ... 9 10 11 12 13 ... 24 Nästa

tills:

Föregående 1 ... 21 22 23 24


Här kommer även koden!

Index.php:

PHP-kod:
$result mysql_query("SELECT * FROM products WHERE visible = '1'");
$result mysql_query($query);
$items 2// Antal items per sida
$num_rows mysql_num_rows($result);

$nrpage_amount $num_rows/$items;
$page_amount ceil($num_rows/$items);
$page_amount $page_amount-1;

if (isset(
$_GET['p'])) {
$page mysql_real_escape_string($_GET['p']);
} else {
$page 1;
}

$p_num $items*$page;

$result mysql_query("SELECT * FROM products WHERE visible = '1' ORDER BY 'price' ASC LIMIT $p_num , $items");

while(
$product mysql_fetch_array($result)) {
//Här skrivs produkterna ut
};

paging(); 

Function.php:
PHP-kod:
function paging(){
    global 
$num_rows// Antal rader i db (49)
    
global $page// Nuvarande sida
    
global $page_amount// Antal sidor (Antal rader delat på produkter per sida (25))
    
$dottes 0// Räknare för punkter
    
    
if($page_amount != "0"){ // Om det finns fler än 1 sida
        
        
echo "<ul>";
            if(
$page != "1"){ // Om nuvarande sidan inte är första sidan (0 = förstasidan)
                
$prev $page-1;
                echo 
"<li><a href=\"?p=$prev\">F&ouml;reg&aring;ende</a></li>";
                if (
$page 4) {echo '<li><a href="?p=1">1</a></li>';echo "<li>...</li>";}
                
            }
            
            
$first * (int)floor(($page-1) / 4)+ 1;
            
            for (
$p $first$p<$first+&& $p<=$page_amount$p++) {
                if (
$p == $page) {
                    echo 
'<li><div class="curr">'$p'</div></li>';
                } else {
                    echo 
'<li><a href="?p='$p'">'$p'</a></li>';
                }
            }
            
            if (
$page_amount $first >= 5) {
            echo 
'<li>...</li>';
            echo 
'<li><a href="?p='$page_amount'">'$page_amount'</a></li>';
            }
            
            if(
$page $page_amount){ // Om $page (nuvrande sidan) är mindre än $page_amount (antal sidor)
                
$next $page+1;
                echo 
"<li><a href=\"?p=$next\">N&auml;sta</a></li>";
            }
        echo 
"</ul>";
    }

jonssondesign är inte uppkopplad   Svara med citatSvara med citat
Oläst 2012-07-09, 12:06 #10
jonssondesign jonssondesign är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Oct 2010
Inlägg: 709
jonssondesign jonssondesign är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Oct 2010
Inlägg: 709
Ser att uthämtningen av produkter blir fel nu. ehm.

Om jag kör med $page = 1; så hämtar den inte ut, lika många produkter som man vill att det ska synas per sida, i början.

Säg att man har 100 produkter.
och vill visa 20 produkter per sida. (5 sidor).

Har jag då $page = 1; så börjar produkt nr 20 på startsidan.
Produkterna 1 - 20 är alltså inte med, så det listas bara 80 av 100 produkter.
Skriver jag dock index.php?p=0
då får jag fram produkterna 1 - 20.

Någon som ser varför detta kommer sig?

$query .= "LIMIT $p_num , $items";
Det verkar som om det är här de ligger.

$p_num = $items*$page; ($p_num = 20*1)

Så den börjar plocka ut produkter efter den 19 raden i databasen. INTE BRA!

Någon med några idéer?
jonssondesign är inte uppkopplad   Svara med citatSvara med citat
Svara


Aktiva användare som för närvarande tittar på det här ämnet: 1 (0 medlemmar och 1 gäster)
 

Regler för att posta
Du får inte posta nya ämnen
Du får inte posta svar
Du får inte posta bifogade filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är
HTML-kod är av

Forumhopp


Alla tider är GMT +2. Klockan är nu 13:48.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson
 
Copyright © 2017