Paginate function

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 volgende »

Jasper DS

Jasper DS

30/12/2011 15:23:56
Quote Anchor link
Hoi,

ik wil een soort van paginate functie maken en toen ik begon leek het niet zo moeilijk maar ik denk dat ik het te moeilijk aan het maken ben.
De bedoeling is dat er 4 knopjes staan: eerste, vorige, volgende, laatste. Dit verwijst naar rapporten die gebonden zijn aan users, iedere user moet dus zijn eigen rapporten zien en niet die van een andere. Hoe kan ik zo eenvoudig mogelijk het eerste id, laatste id volgende en voorgaande id ophalen aan de hand van een userid en een rapport id?

Jasper
 
PHP hulp

PHP hulp

22/12/2024 06:55:19
 
Wouter J

Wouter J

30/12/2011 15:44:10
Quote Anchor link
In een array zetten. Even snel bedacht en dus niet getest:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?php
    
    $sQuery
= "SELECT id FROM rapports WHERE user_id = ".(int) $userId." ORDER BY id";
    $result = mysql_query($sQuery, $sqlLink);
    
    if( $result !== false )
    {

        $ids = array();
        while( $row = mysql_fetch_assoc($result) )
        {

            $ids[] = $row['id'];
        }

        
        echo 'Eerste id: '.$ids[0];
        echo 'Current id: '.current($ids);
        echo 'Vorige id: '.prev($ids);
        echo 'Volgende id: '.next(next($ids)); // 2x next omdat we hiervoor 1 terug zijn gegaan
        echo 'Laatste id: '.end($ids);
    }

    else
    {
        echo 'Error!!! '.mysql_error();
    }

    
?>


En kijk ook eens naar de PHP functies: current, prev, next en end
Gewijzigd op 30/12/2011 16:39:31 door Wouter J
 
Erwin H

Erwin H

30/12/2011 15:55:16
Quote Anchor link
Ik zou het anders doen. Als je niet met de id's van de pagina's gaat werken (die denk ik van alle users door elkaar staan en daarmee dus niet simpel oplopend zijn), maar met een virtuele positie wordt het eenvoudiger.

Daarvoor heb je nodig het totaal aantal records in de database dat aan de voorwaarde voldoet (total_records) en de huidige pagina (current).

Totaal aantal records kan je met elke query ophalen met de MySQL functie SQL_CALC_FOUND_ROWS. Huidige pagina moet je elke keer meegeven in een GET parameter van de pagina link. Vervolgens gebruik je die in de LIMIT van je SQL statement om alleen het juiste record op te halen.

De waarde van je pagination buttons worden dan:
eerste: positie = 0;
vorige: positie = max(0, current-1);
volgende: positie = min(current+1, total_records-1);
laatste: positie = total_records-1;

positie zoals boven beschreven gebruik je in de linkjes als de GET parameter voor die pagina.
 
Jasper DS

Jasper DS

31/12/2011 14:03:29
Quote Anchor link
@Erwin, wouter zijn oplossing kan wel kloppen omdat de id's per user wel oplopend zijn bijvoorbeeld 5, 13, 25, 78, 164, 167, 170, ... Stel nu dan 25 current is dan is de vorige in de array 13 en dus niet 24 zoals jij het bedoel denk ik?

@Wouter, bedankt ik ga het eens bekijken. Ik heb wel nog één vraagje hoe weten we wat current is? In de url staat natuurlijk id=getal maar ik zie dit nergens terug komen in het script. De bedoeling is natuurlijk als we aan het kijken zijn naar rapport 164 dat de volgende 167 is, de vorige 78 de eerste 5 en de laatste 170.
 
Wouter J

Wouter J

31/12/2011 14:52:34
Quote Anchor link
@Jasper, ik heb even een voorbeeldje gemaakt, daarop kan je het zien: http://waldio.webatu.com/phphulp/forum/pagination.php?id=25

(voor id kun je ook andere getallen invullen)

Geef een code get variabele mee in de url als je de broncode wilt zien (dus ?code of &code)
 
Jasper DS

Jasper DS

31/12/2011 15:36:19
Quote Anchor link
Wouter, de link werkt bij mij niet?
 
Erwin H

Erwin H

31/12/2011 18:17:54
Quote Anchor link
PHP Jasper op 31/12/2011 14:03:29:
@Erwin, wouter zijn oplossing kan wel kloppen omdat de id's per user wel oplopend zijn bijvoorbeeld 5, 13, 25, 78, 164, 167, 170, ... Stel nu dan 25 current is dan is de vorige in de array 13 en dus niet 24 zoals jij het bedoel denk ik?

Nee, zoals ik het bedoel gebruik je niet de id's uit je database, maar 'virtuele' id's. Stel je hebt die rij die jij geeft alszijnde de pagina id's van gebruiker x. Dus [5, 13, 25, 78, 164, 167, 170]. Dan zijn de virtuele id's dus [0, 1, 2, 3, 4, 5, 6]. Zit je nu op pagina 4, dan is de volgende 5 en de vorige 3. De eerste is altijd 0, de laatste is 6.
Het SQL statement dat je nodig hebt om het uit de database te halen is:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
SELECT SQL_CALC_FOUND_ROW pagina_id, tekst etc etc
FROM tabel_t
WHERE user_id = x
ORDER BY pagina_id
LIMIT 4, 1


Je selecteert dus all pagina's van gebuiker x, maar neem in dit geval alleen de 4e pagina. Verder heb je nog nodig het totaal aantal pagina's wat aan het statement voldoet (in dit geval het totaal aantal pagina's van gebruiker x) en dat wordt berekend door SQL_CALC_FOUND_ROWS. Om het resultaat daarvan te krijgen moet je het SQL statement SELECT FOUND_ROWS()
De pagination parameters kan je dan uitrekenen met de formules dit ik je in mijn vorige post gaf.

Het voordeel van het gebruik van deze methode boven die van Wouter, is dat je dus niet elke keer alle records van gebruiker x uit de database hoeft te trekken (ook al zijn dat alleen maar de id's). Wat als die gebruiker er 1000 heeft? Dan haal je dus 1000 records op om alleen maar 4 waardes te gebruiken. Dat is dus 996 overbodige records.
Het nadeel is dat de link die je creeert om naar een pagina te komen (pagina.php?gebruiker=x&pagina_id=4) een volgende keer misschien niet meer hetzelfde resultaat zal weergeven als er bijvoorbeeld een record is verdwenen uit de database.
 
Jasper DS

Jasper DS

01/01/2012 14:44:26
Quote Anchor link
@Erwin, ik vind jouw manier ook erg goed maar ik zou graag hebben dat het id van het bericht in de url staat en niet een fictief id.. gaat dit ook?
 
Wouter J

Wouter J

01/01/2012 17:48:03
Quote Anchor link
PHP Jasper op 31/12/2011 15:36:19:
Wouter, de link werkt bij mij niet?

Oh, bij mij wel. Dan maar direct de code:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php if( isset( $_GET['code'] ) ) highlight_file(__FILE__); ?>

<pre>
<?php

$ids
= Array(5, 13, 25, 78, 164, 167, 170);

if( !isset($_GET['id']) || !in_array($_GET['id'], $ids) )
{

    die('Geef als get variabele id een waarde van '.implode(', ', $ids).' mee');
}


// Dit zorgt ervoor dat we de gegeven id als current benoemen
while (current($ids) !== (int) $_GET['id']) next($ids);

echo 'Eerste id: '.$ids[0].PHP_EOL;
echo 'Current id: '.current($ids).PHP_EOL;
echo 'Vorige id: '.prev($ids).PHP_EOL;
next($ids); // 2x next omdat we hiervoor 1 terug zijn gegaan
echo 'Volgende id: '.next($ids).PHP_EOL;
echo 'Laatste id: '.end($ids).PHP_EOL;
?>
 
Erwin H

Erwin H

02/01/2012 14:14:09
Quote Anchor link
PHP Jasper op 01/01/2012 14:44:26:
@Erwin, ik vind jouw manier ook erg goed maar ik zou graag hebben dat het id van het bericht in de url staat en niet een fictief id.. gaat dit ook?

Waarom zou je dat willen? Geen gebruiker die daar iets aan heeft als je het mij vraagt. Als je het zou doen krijg je alleen maar meer SQL queries die je moet gaan draaien om iets te krijgen dat niet nodig is. Minder efficient dus.
 
Jasper DS

Jasper DS

04/01/2012 14:30:27
Quote Anchor link
@wouter, ik krijg telkens deze error: Fatal error: Maximum execution time of 30 seconds exceeded in C:\xampp\htdocs\alfaflex\inc\functies.php on line 920

@Erwin, en hoe bepaal ik in jouw voorbeeld die 4? Want deze moet telkens anders zijn veronderstel ik?
 
- SanThe -

- SanThe -

04/01/2012 14:52:18
Quote Anchor link
PHP Jasper op 04/01/2012 14:30:27:
@wouter, ik krijg telkens deze error: Fatal error: Maximum execution time of 30 seconds exceeded in C:\xampp\htdocs\alfaflex\inc\functies.php on line 920


Hier doet ie het. Alleen bij 5 is ie niet correct.
 
Jasper DS

Jasper DS

04/01/2012 14:54:16
Quote Anchor link
Misschien ligt het aan het aantal records? Er steken er nu 700 in de db..
 
Erwin H

Erwin H

04/01/2012 15:09:45
Quote Anchor link
PHP Jasper op 04/01/2012 14:30:27:
@Erwin, en hoe bepaal ik in jouw voorbeeld die 4? Want deze moet telkens anders zijn veronderstel ik?

Welke 4?
 
Jasper DS

Jasper DS

04/01/2012 15:12:10
Quote Anchor link
LIMIT 4, 1
 
Erwin H

Erwin H

04/01/2012 15:19:00
Quote Anchor link
Die 4 is de pagina (beginnend bij 0). Die bepaal je dus in de pagination buttons met de functies die ik een tijdje terug gaf en plaats je in de link als een GET parameter.
 
Jasper DS

Jasper DS

07/01/2012 12:53:24
Quote Anchor link
Wouter, jouw oplossing blijft bij mij vrij traag gaan? En ik kom meermaals die error tegen. Zou de oplossing van Erwin mijn probleem oplossen?
Als ik in jouw script die while weglaat voor current id lukt het wel maar dan kloppen de gegevens niet. Het huidige id is 167 en dan krijg ik dit als uitkomst: "Eerste id: 630 Current id: 630 Vorige id: Volgende id: Laatste id: 802"

Erwin ik begrijp dus nog steeds niet hoe ik de 4 bepaal. We zitten dus op een pagina: pagina.php?id=168 . 168 is dus het id van dat rapport en aan de hand van dat id halen we het volledige rapport op. Nu komen er boven dat rapport 4 linkjes: "eerste", "Vorige", "volgende", "Laatste". Hoe bepaal ik aan de hand van jouw idee die linkjes? Volgens mij gaat dat ook niet werken.

Toevoeging op 07/01/2012 13:10:48:

@wouter,
deze regel is de boosdoener: "while (current($ids) !== (int) $_GET['id']) next($ids);" hij loopt blijkbaar vast op 800 rows.
Gewijzigd op 07/01/2012 13:03:40 door Jasper DS
 
Erwin H

Erwin H

07/01/2012 13:44:43
Quote Anchor link
Je moet die id=168 loslaten. Id is namelijk het echte id in je database, terwijl ik het over virtuele pagina_id heb. Dat moet je eerst echt begrijpen voor je verder kan.
Stel je zit op een soort overzicht pagina waarin je een link hebt naar het eerste rapport van gebruiker x. De link die je daar dan maakt moet iets zijn als "rapport.php?user=x&pagina_id=0". Omdat je met virtuele ids werkt is de eerste dus altijd 0!!

Klik je nu op die link dan ga je naar de rapport pagina en je SQL statement krijgt een "LIMIT 0,1" clause. Die 0 is dus de pagina_id.
Vanuit die 0 kan je de eerste, vorige, volgende en laatste berekenen:
Eerste = 0
vorige = 0
volgende = max(huidige pagina +1, totaal aantal records -1)
laatste = totaal aantal records - 1

Klik je dan op de volgende krijg je dus een link als "rapport.php?user=x&pagina_id=1". in je SQL krijg je nu een "LIMIT 1,1". Je zit nu dus op pagina 1, maar je rapport id in je database kan nu best al 334 zijn. Je pagination parameters worden nu:
eerste = 0
vorige = min(0, huidige pagina - 1)
volgende = max(huidige pagina + 1, totaal aantal records -1)
laatste = totaal aantal records - 1

Enz enz enz. Begint het al duidelijker te worden?
 
Jasper DS

Jasper DS

07/01/2012 14:05:10
Quote Anchor link
Ja erwin, ik begrijp het. Dat wil dus zeggen dat ik de pagina waar ik de links genereer ook moet aanpassen en idpv het id in de link te zetten het virtuele id in de link zetten.
 
Erwin H

Erwin H

08/01/2012 14:01:53
Quote Anchor link
Precies. Dat id dat in je database staat heeft verder geen betekenis (in deze methode dan).
 
Jasper DS

Jasper DS

11/01/2012 14:22:52
Quote Anchor link
Oke erwin, het begint er op te lijken. Eerste en vorige zijn in orde. Nu het volgende probleem. Hoe integreer ik SQL_CALC_FOUND_ROWS, heb op PHP.net gekeken en op google gezocht maar ik zie niet hoe ik dit uitlees.. :s

Ik probeerde al SQL_CALC_FOUND_ROWS id AS tel maar dat leverde een 1 op. (klopt dus niet) Hoe laat ik dat nog werken?
 

Pagina: 1 2 volgende »



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.