Toon posts:

[PHP] volgende/vorige pagina knopje

Pagina: 1
Acties:
  • 319 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Hoi!

Ik heb een site gemaakt waarop een groep studenten die momenteel in Japan zitten hun dagboek kunnen bijhouden..

Nu kunnen bezoekers uit een select een dag selecteren van het verhaal dat ze willen lezen (onchange=location.href).

Ik wil het nu uitbreiden zodat bezoekers ook onderaan het verhaal van die dag verder kunnen naar het volgende verhaal dmv een button onderaan de pagina. Of terug naar het vorige.

In geval van het eerste of laatste verhaal moet er geen button worden getoond... (of niet klikbaar). Weet iemand hoe ik dit moet oplossen.

Ik ben ASP gewend, en dat lukt mij nog wel. Maar hoe doe ik het in PHP? Iemand ideeen?

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Het principe zal in PHP niet anders zijn dan in ASP.

Waar denk je zelf aan?

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Verwijderd

Topicstarter
Ik twijfel een beetje. In ASP kun je een recordset vullen met een gesorteerde query en dan zoiets als objRS.movenext of objRS.moveprevious ofzo. Maar dat is niet echt betrouwbaar.

Ik zou ook een array vul kunnen pompen met alle ID's en daar mee aan de slag kunnen gaan.. IF NOT Ubound(array) blablabla

Maar is dit nu ideaal? Of heeft iemand betere ideeen?

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Ben je bekend met de LIMIT clause in een query?

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Verwijderd

Staat 1 verhaal in 1 record?
zo ja, dan is het heel simpel want dan stuur je gewoon bij die volgende/vorige knop een var mee die de id van dat verhaaltje is en dan kan je in het document dat je verhaaltje ophaald gewoon met een select query de record ophalen voor die id.

bijv:
bij pagina 1 is die id 1.
dan is er geen vorige knop en de link onder de volgende knop is, pagina.php?id=$id+1.
iemand klikt erop pagina pagina.php wordt geladen.
er komt een vorige knop (pagina.php?id=$id-1) en een volgende knop (pagina.php?id=$id+1)

Verwijderd

Topicstarter
drm: Ja, ik ben bekend met de LIMIT functie. Dat betekent dat ik dus het volgende record kan ophalen. Echter, daarmee kan ik (naar mijn weten) niet het vorige record ophalen.

En webskipper: Jouw manier was idd een oplossing geweest als de verhalen keurig op ID zouden zijn genummerd. In dit geval gaat dat niet werken, omdat meerdere studenten hier gebruik van maken. Een verhaal heeft dus een participant_LNK waarmee het gekoppeld is aan de tabel Participant.

Tevens kan het zo zijn dat vandaag het verhaal van 20 januari wordt toegevoegd, maar morgen het verhaal van 19 januari. Het ID is dan hoger, maar het knopje bij 19 januari moet wel bij 20 uitkomen.

Dus moet ik een SQL-query gebruiken die selecteerd WHERE participant_LNK = $blaat ORDER BY verhaalDatum.

En daar mee aan de slag :)

Verwijderd

jah, in dat geval moet het idd zo.. :)
succes ermee!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

BarisArt:
drm: Ja, ik ben bekend met de LIMIT functie. Dat betekent dat ik dus het volgende record kan ophalen. Echter, daarmee kan ik (naar mijn weten) niet het vorige record ophalen.
Verkeerd gedacht :)
Je huidige LIMIT-offset (1e parameter) is binnen je ASP (of PHP) pagina namelijk altijd bekend. Het volgende record is dus:
pseudo
code:
1
2
3
4
wanneer offset < maximum
   volgende = offset +1. 
anders
   volgende = 0; (roundhouse, dus)

en de vorige:

pseudo
code:
1
2
3
4
wanneer offset > 0
   vorige = offset -1;
anders
   offset = maximum

snappie?

En de query wordt dan natuurlijk:
  • [i]SELECT [algemene query die de [b]gehele[/b] set terug zou geven] LIMIT offset,1[/i]

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • Prutser_IA
  • Registratie: Januari 2000
  • Laatst online: 03-06-2021

Prutser_IA

<*{{{><

En hoe vindt je deze oplossing..

selecteer de id uit de db waar: de datum groter is dan het huidige document en de gebruiker klopt. order deze op de datum grootste onder, limit 1
Nu heb je het volgende bericht..

En een soort gelijke query pas je ook toe voor de vorige..

Heb je zi iig uit de DB..
dan gewoon ff een if..then.. en klaar is kees..

42


Verwijderd

Topicstarter
Okay, klinkt logisch...

En wat vul ik dan in voor die variabelen?

maximum is dan de timestamp van het laatste record? En mimimum de timestamp van het eerste record?

offset zal dan wel de timestamp van het huidige verhaal zijn?

hmm... dat moet lukken :)

Thanx

Verwijderd

Topicstarter
Prutser.. jouw idee spreekt me ook wel aan!

klinkt idd wat minder ingewikkeld :)

Verwijderd

Topicstarter
het enige probleem wat ik dan nog kan bedenken met het idee van Prutser is het volgende:

ik sla in de DB 2 tijden op: 1 van de dag waar het verhaal over gaat, timestamp(8) en één van het moment van het opslaan van het verhaal, timstamp(14).

Het kan dus voorkomen dat er 2 verhalen zijn over één dag. In dat geval zou het met het idee van Prutser niet werken, omdat ik dan naar de volgende dag wordt gebracht ipv dezelfde dag, ander verhaal.

Komen we toch nog op het verhaal van drm uit :)

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Op maandag 21 januari 2002 14:31 schreef Prutser zijn idee
Sorteren op timestamp is niet per-se wat je verwacht van zo'n blader functie. Bijvoorbeeld: wat wanneer je je documenten wilt sorteren op naam in plaats van datum? Of dat je een DESC sort ipv een ASC sort wilt hebben?

De truc van die LIMIT is juist dat ongeacht de inhoud van de query de bladerfunctie toegepast kan worden (kijk bijvoorbeeld naar phpMyAdmin, die doet precies hetzelfde).

Waar de limit clausule namelijk in feite uit bestaat is:
  • [i](query) LIMIT [hoeveelste record uit die query begin ik?], [hoeveel moet ik er weer geven [b]vanaf[/b] dat record?][/i]
Dus ook wanneer er een timestamp veld ontbreekt of wat dan ook, werkt dat. ongeacht de inhoud van de tabel.
BarisArt:
maximum is dan de timestamp van het laatste record? En mimimum de timestamp van het eerste record?
maximum is de COUNT van je query.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • SWINX
  • Registratie: Juni 2001
  • Laatst online: 02-06 23:18
Op maandag 21 januari 2002 14:45 schreef drm het volgende:

[..]

maximum is de COUNT van je query.
PHP:
1
2
3
4
5
<?
$sql_aantal = mysql_query("SELECT count(id) FROM tabel") or die("<br>".mysql_error());
$row_aantal = mysql_fetch_array($sql_aantal);
$aantal = $row_aantal["count(id)"];
?>

$aantal is nu dus je count :)

Mannen komen van Mars Tweakers, vrouwen van Venus Bokt


Verwijderd

Topicstarter
Okay :)

hoe ik de count kan achterhalen weet ik natuurlijk wel :)

Maar wat is die offset dan precies?

SELECT count(ID)+1 AS aantal FROM Story WHERE participant_LNK=$getal AND timestamp<$huidigetimestamp ORDER BY ID

Ofzo?

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Op maandag 21 januari 2002 15:26 schreef BarisArt het volgende:
Okay :)

hoe ik de count kan achterhalen weet ik natuurlijk wel :)

Maar wat is die offset dan precies?

SELECT count(ID)+1 AS aantal FROM Story WHERE participant_LNK=$getal AND timestamp<$huidigetimestamp ORDER BY ID

Ofzo?
drm:
Je huidige LIMIT-offset (1e parameter)...
[snip]
...
  • [i]SELECT [algemene query die de [b]gehele[/b] set terug zou geven] LIMIT offset,1[/i]
Met 1e parameter bedoel ik dus dit:
SELECT * FROM TABLE LIMIT eerste,tweede;

wat begrijp je daar niet aan :?

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Verwijderd

Topicstarter
Wat het woord offset betekent :)
haha!

Ik heb het nu op deze manier opgelost en dat werkt vooralsnog goed:
code:
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
     function pijltjeVolgendVerhaal($Story_ID, $User_ID){
       connectDB();
       mysql_select_db("JPP7");
       $result = mysql_query("SELECT diary_ID FROM Diary WHERE participant_LNK='$User_ID' ORDER BY datumverhaal;");
       WHILE($row = mysql_fetch_array($result)){
         IF(isSet($huidigID)){
            return "<A href=\"index.php?ID=$User_ID&Story_ID=".$row["diary_ID"]."\">verder</a>";
         }
         IF ($row["diary_ID"] == $Story_ID){
             $huidigID = "blaat";
         }
       } 
     }
     
     function pijltjeVorigVerhaal($Story_ID, $User_ID){
       connectDB();
       mysql_select_db("JPP7");
       $result = mysql_query("SELECT diary_ID FROM Diary WHERE participant_LNK='$User_ID' ORDER BY datumverhaal;");
       WHILE($row = mysql_fetch_array($result)){
         IF ($row["diary_ID"] == $Story_ID){
           IF(isSet($huidigID)){
            return "<A href=\"index.php?ID=$User_ID&Story_ID=".$huidigID."\">vorig</a>";
           }
         }
         ELSE{
          $huidigID = $row["diary_ID"];
         }
         
       } 
     }

Bedankt voor de moeite allemaal!

Verwijderd

[topic=342475/1/25] aan het eind (heb net even een stukje code toegevoegd)

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

BarisArt:
Wat het woord offset betekent :)
haha!

Ik heb het nu op deze manier opgelost en dat werkt vooralsnog goed:
code:
1
[meuk]

Bedankt voor de moeite allemaal!
Het spijt me wel, maar je pakt het toch echt niet goed aan. Neem nou maar gewoon van mij aan dat je het met LIMIT moet doen... :{ *sigh

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz

Pagina: 1