Toon posts:

[php] paging

Pagina: 1
Acties:
  • 62 views sinds 30-01-2008

Verwijderd

Topicstarter
Het script van mijn website moet een lijst met gebruikers uit de database printen. Gezien dit aantal gebruikers erg hoog kan oplopen, moet het aantal afgebeelde gebruikers over een aantal pagina's verdeeld worden. Zo mogen er maar max 20 gebruikers per pagina worden afgebeeld. De layout is ongeveer dit:

Gebruiker 1
Gebruiker 2
Gebruiker 3
.....
Gebruiker 20

<< < 1 2 3 4 5 6 7 8 9 > >>

De cijfers staan voor de pagina. Als je op cijfer 1 klikt, worden de gebruikers 1 t/m 20 weergegeven, druk je op de 2 dan kun je de gebruikers 21 t/m 40 zien enz..
De knoppen < en > staan respectievelijk voor een pagina terug of een pagina verder. De knoppen << en >> worden gebruikt om onmiddelijk naar de eerste of de laatste pagina te gaan.

Het script berekent zelf hoeveel pagina's er zijn. Deze nummers plus bijbehorende links kan ik in een array zetten.
Stel het volgende probleem:

In de database bevinden zich 4000 gebruikers. 20 gebruikers per pagina levert een slordige 200 pagina's op! Het wordt natuurlijk een ongelooflijke puinhoop als er onder aan de gebruikers 400 cijfers worden weergegeven! Daarom zou ik de volgende oplossing willen gebruiken:

<< < 5 6 7 8 9 10 1112 13 > >>

Het middenste cijfer is de pagina die wordt bekeken. Naast dit cijfer worden links de 4 voorgaande en rechts de 4 opvolgende pagina's weergegeven. Stel dat de gebruiker nu op de knop > klikt, moet de rij er dus zo uit gaan zien:

<< < 6 7 8 9 10 11 12 13 14 > >>

Als er minder dan 9 bladen zijn, bijv slechts 4, dan moet de lijst er zo uit zien:

<< < 1 2 3 4 > >>

Het probleem is echter dat ik niet weet hoe ik dit moet programmeren. Zou iemand mij een creatieve hint/voorbeeld kunnen geven (in PHP) hoe ik dit zo kort mogelijk kan oplossen? Ik heb wel een idee, maar dat levert naar mijn idee te veel code op, vandaar dat ik graag wil zien hoe iemand met meer ervaring dit oplost. Alvast bedankt,

Deus

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 18:52

gorgi_19

Kruimeltjes zijn weer op :9

Ik heb wel een idee,
Beschrijf je idee dan eens? :)

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Not Pingu
  • Registratie: November 2001
  • Laatst online: 01-04 20:36

Not Pingu

Dumbass ex machina

In MySQL kun je de functie LIMIT gebruiken:

code:
1
SELECT veld1, veld2 from tabel1 LIMIT [nr_van_eerste_record], [aantal_records]


Als je dan zegt dat een pagina 20 records laat zien, kun je dat 2e nummer al invullen.
De linkjes met paginanummers geef je een GET variabele mee:
code:
1
<a href="index.php?beginnenbij=21">Pagina 2</a>


Vervolgens lees je $_GET["beginnenbij"] uit en geef je dat als parameter aan je SQL query.

Certified smart block developer op de agile darkchain stack. PM voor info.


Verwijderd

^^ Zie hierboven.

Hier is nog een artikeltje hoe het ongeveer werkt: http://www.phpfreakz.nl/artikelen.php?aid=91&page=3

Je had dit trouwens zelf ook wel kunne vinden denk ik. ;)

  • PanMan
  • Registratie: November 1999
  • Laatst online: 10-05 16:31

PanMan

Spun!

Gunp01nt schreef op zondag 13 maart 2005 @ 14:02:
In MySQL kun je de functie LIMIT gebruiken:

code:
1
SELECT veld1, veld2 from tabel1 LIMIT [nr_van_eerste_record], [aantal_records]


Als je dan zegt dat een pagina 20 records laat zien, kun je dat 2e nummer al invullen.
De linkjes met paginanummers geef je een GET variabele mee:
code:
1
<a href="index.php?beginnenbij=21">Pagina 2</a>


Vervolgens lees je $_GET["beginnenbij"] uit en geef je dat als parameter aan je SQL query.
Ik wil je niet afbranden, maar heb je de vraag wel echt gelezen? Hij vraagt hoe hij een mooi dynamisch lijstje van pagina's onderaan z'n pagina kan maken, niet hoe hij een result kan limiten, voor op een pagina.
BTW, Ts: Volgens mij moet je eerst bepalen wat de huidige pagina is, dan een min en een max bepalen (en dus weten of die bestaan. Min zal er wel zijn, maar max moet je ff checken), dan kan je met een eenvoudig for loopje je nr'tjes genereren.

Where a calculator on the ENIAC is equipped with 18,000 vacuum tubes and weighs 30 tons, computers in the future may have only 1,000 vacuum tubes and weigh only 1.5 tons.
– Popular Mechanics, March 1949


  • JeroenT
  • Registratie: Juli 2001
  • Laatst online: 29-04 14:37

JeroenT

hoi!

Zoiets gebruik ik voor een forum , laatste pagina en vorige pagina kun je er zelf heel simpel inmaken

PHP:
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<?php

class pagenav

{
    function pagenav ($totaal, $perpage, $current, $linkstart)
    {
        $this->totaal = $totaal;
        $this->perpage = $perpage;
        if (!$current > 0) $current = 1;
        $this->current = $current;
        $this->linkstart = $linkstart;
    }

    function get_startpoint ()
    {
        $p = $this->current - 1;
        $r = $p * $this->perpage;
        return $r;
    }

    function makenav ()
    {

        $this->pages = $this->totaal / $this->perpage;
        $this->pages = ceil($this->pages);
        for ($i = 1; $i < $this->pages + 1; $i++)
        {

        $start = $this->current-2;
        $end = $this->current+2;

        if ($i < $start OR $i > $end){

        } else {

        if ($this->current == $i) $nav[] = "<a class=\"g\"><b>".$i."</b></a>";
        else $nav[] = "<a class=\"g\" href='?" . $this->linkstart . "&amp;nav=" . $i . "'>".$i."</a>";

        }
        }

        if ($this->current != 1) array_unshift($nav, "<a class=\"g\" href='?" . $this->linkstart . "&amp;nav=" . ($this->current - 1) . "'></a>");
        else array_unshift($nav, "");
        if ($this->current < $this->pages) $nav[] = "<a class=\"g\" href='?" . $this->linkstart . "&amp;nav=" . ($this->current + 1) . "'></a>";
        else $nav[] = "";
        $nav = implode (" <a class=\"r\"> | </a> ", $nav);
        return $nav;
    }
}

?>

[ Voor 18% gewijzigd door JeroenT op 14-03-2005 01:59 ]


Verwijderd

Topicstarter
PHP:
1
2
3
4
5
6
$start = $this->current-2; 
$end = $this->current+2; 

if ($i < $start OR $i > $end){ 

}


Ik snap dit stukje code niet. Hoe volgt start uit current-2? Wat bedoel je hier mee? En wat moet er in die lege if statement er onder?
Zou je aub een klein beetje commentaar bij je code willen zetten?
Bvd,
Deus

  • OkkE
  • Registratie: Oktober 2000
  • Laatst online: 10-11-2025

OkkE

CSS influencer :+

De lege IF is te vervangen door
PHP:
1
if ($i > $start AND $i < $end)


En de $start en $end zijn te vervangen in:
PHP:
1
2
3
$current = intval( $_GET['page'] );
$start = $current - 2;
$end = $current +2;

“The best way to get the right answer on the Internet is not to ask a question, it's to post the wrong answer.”
QA Engineer walks into a bar. Orders a beer. Orders 0 beers. Orders 999999999 beers. Orders a lizard. Orders -1 beers.


  • Brakkie
  • Registratie: Maart 2001
  • Niet online

Brakkie

blaat

Heb wat gebrouwen en het is NIET getest :7

PHP:
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
//Huidige pagina 
$huidige_pagina = 10;
$per_pagina = 30;

//Bepaal vanaf welk record er users gelist moeten worden
$start = ($huidige_pagina * $per_pagina) - $per_pagina;

//Haal de records op
$sql_list = "SELECT * FROM users LIMT ".$start.", ".$per_pagina;

//Tel het totaal 
$sql_count = "SELECT count (*) as totaal_aantal FROM users";
$users['totaal_aantal'] = mysql_fetch_array(mysql_query($sql));

//Bepaal het totaal aantal pagina's
$aantal_paginas = ceil($users['totaal_aantal'] / $per_pagina);

//Maak de terug knop
if(($huidige_pagina - 1) > 0)
    $navigatie .= "<a href=\"index.php?pagina=".($huidige_pagina - 1)."\"><</a>&nbsp;";

//Bepaal bij welke pagina het lijstje met pagina's moet beginnen
$navigatie_start = $huidige_pagina - 4;

//Maak een variabele aan met daarin de string die je navigatie vormt
$navigatie = "";

//Maak de links voor de huidige pagina
for($i = 0; $i <= 4; $i++)
{
    if($navigatie_start <= 0)
        $navigatie_start++;
    else
    {
        $navigatie .= "<a href=\"index.php?pagina=".$navigatie_start."\">".$navigatie_start."</a>&nbsp;";   
        $navigatie_start++;
    }
}

//Maak de link voor de huidige pagina
$navigatie .= "<a href=\"index.php?pagina=".$huidige_pagina."\"><b>".$huidige_pagina."</b></a>&nbsp;";
$navigatie_start++;

//Maak de links na de huidige pagina
for($i = 0; $i <= 4; $i++)
{
    if($navigatie_start <= $aantal_paginas)
    {
        $navigatie .= "<a href=\"index.php?pagina=".$navigatie_start."\">".$navigatie_start."</a>&nbsp;";   
        $navigatie_start++;
    }
}

//Maak de vooruit knop
if(($huidige_pagina + 1) <= $aantal_paginas)
    $navigatie .= "<a href=\"index.php?pagina=".($huidige_pagina + 1)."\">></a>&nbsp;";

//Print de hele meuk
echo $navigatie;

[ Voor 30% gewijzigd door Brakkie op 14-03-2005 15:22 ]

Systeem | Strava


Verwijderd

Topicstarter
Bedankt voor je grote voorbeeld. Hier kan ik wel wat mee. Probleem is dat ik er maar niet in slaag om die *&^%! count() functie werkende te krijgen 8)7.

Zou iemand mij de exact werkende code kunnen geven voor dit probleem:

Tel alle users in de tabel users. Stop dit totaal in de variable $totaal.


Bij wijze van test wou ik het volgende eens testen:
$query="SELECT count (*) as totaal_aantal FROM users";
$result=mysql_query($query);
mysql_numrows($result);
Dit levert een error op.

Ik hoop dat iemand kan helpen want het is zeer frustrerend als je zoveel tijd kwijt raakt met het zoeken naar zo'n query :(

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 18:52

gorgi_19

Kruimeltjes zijn weer op :9

Je bent nu denk ik wel genoeg op weg geholpen. Wat je nu doet is vragen naar een stuk kant en klare code, dat staan we niet toe in Programming & Webscripting :) Je eerste post was in principe op het randje, nu is deze over het randje :)

Digitaal onderwijsmateriaal, leermateriaal voor hbo

Pagina: 1

Dit topic is gesloten.