Paginanavigatie met PHP en zonder MySQL
1. Wat?
2. Waarom?
3. Voorbereiding
4. De 8 stappen
5. Het volledige script
top
1. Wat?
De bedoeling van deze tutorial is je aanleren hoe je paginanavigatie kan doen met PHP en zonder MySQL.
Dus voor de fopen() freaks misschien.
Misschien vraag je nu: wat is paginanavigatie?
Het antwoord hierop is vrij simpel:
Deze methode wordt meestal toegepast bij gastenboeken, fora, nieuwssystemen, etc.
Men wil voorkomen dat de bezoeker alle geposte nota's in het gastenboek moet bekijken op 1 pagina, en daarom laat men om de zoveel berichten automatisch een pagina aanmaken.
Het maximum aantal berichten is natuurlijk in te stellen.
Nog even snel wil ik mededelen dat in deze tutorial een hoop gelijkenissen zitten aan die van FangorN.
Dit omdat beide tutorials gaan over pagina navigatie, ik heb veel van zijn variabelen / variabelenamen overgenomen.
Mijn systeem berust ook volledig op zijn systeem, behalve dan dat ik het niet uit een MySQL tabel ga halen maar uit een extern bestand.
Ik hoop dat jullie dit niet gaan zien als RIP-OFF.
top
2. Waarom?
Er zijn enkele onder jullie die oftewel niet met MySQL kunnen/willen werken, of wiens server geen MySQL ondersteunt.
Deze mensen mogen niet in de kou worden gelaten.
Sinds mijn MySQL volledig gecrasht is op mijn localhost ben ik mij meer en meer met bestandssystemen gaan bezighouden.
Ik veronderstelde dat het even "simpel" zou zijn zonder MySQL, wat dus niet waar is.
Het aantal mogelijkheden dat ik ben afgegeaan is onbeschrijfelijk.
Maar ik ben hier niet om over mijn problemen te zagen, maar om jullie iets bij te leren.
top
3. Voorbereiding
Wat moet je al kunnen/kennen?
Basis PHP
Mijn vorige tutorial over bestandsystemen, vooral het gastenboek voorbeeld
Wat ga ik hier doen?
We nemen mijn gastenboek nog eens terug dat ik vorige keer heb gemaakt.
Ik vond het dof en kaal en het had ook geen pagina-navigatie.
Ik ben gaan experimentern en uiteindelijk gevonden.
Nu ga ik stap voor stap uitleggen wat ik heb gedaan.
top
4. De 8 stappen
We gaan het lezen.php bestand veranderen, de rest blijft ongewijzegd.
<?php
$max = 5;
$file = "gb.dat";
if(file_exists($file)){
$fp = fopen($file, "r");
$inhoud = fread($fp, filesize($file));
$inhoud = explode("\n", $inhoud);
?>
|
Hier hoeft normaal geen uitleg bij, dit stond zo al in de vorige tutorial.
Buiten de $max variabele dan, deze is het aantal paginas dat er maximum per pagina zijn.
<?php
$j = count($inhoud);
$j--;
?>
|
Hier tellen we het aantal ingevoerde gegevens (via de functie count()).
Misschien herriner je je nog als je het gastenboek hebt getest, dat er altijd een ambetant leeg item was, dit wordt door het $j-- statement weggewerkt.
<?php
$aantal_paginas = ceil($j / $max);
$huidige_pagina = 0;
if(isSet($_GET['p']) && is_numeric($_GET['p']) && $_GET['p'] > 0 && $_GET['p'] < $aantal_paginas){
$huidige_pagina = $_GET['p'];
}
?>
|
Nu gaan we eens beginnen met het echte werk.
We moeten eerst het aantal paginas dat er gaan zijn eens tellen (met ceil ronden we mooi af).
Dan gaan we bekijken op welke pagina we zitten, via de header kunnen we dit meegeven.
Voor het gemak heb ik dezelefde header structuur gebruikt als FangorN.
We sturen p mee naar de header en zetten er een waarde in.
Als p een getal is en p is groter dan nul en kleiner dan het aantal paginas dan zetten we de huidige pagina gelijk aan p.
Anders is de huidige pagina nul.
<?php
$offset = $huidige_pagina * $max;
?>
|
We maken een variabele (met dezelfde naam als in FangorN's tutorial) voor de huidige pagina maal het maximum paginas te bereken.
Deze variabele gaan we straks gebruiken in een for loop.
<?php
$variabele = 0;
for($omdraaien = $j-1; $omdraaien > -1; $omdraaien--){
$omgedraaid[$variabele] = $inhoud[$omdraaien];
$variabele++;
}
?>
|
Met dit stuk heb ik lang vastgezeten.
Alles werkte perfect, behalve werd alles in omgekeerde volgorde weergegeven.
Als ik dan iets in de eerstvolgende for loop veranderde werd het "ondersteboven" (het laatste onderaan) weergegeven.
Dus ik moest mijn volledige array met gegevens omdraaien.
Ik heb een tijdje zitten zoeken naar een functie die er hoogstwaarschijnlijk is.
Maar toen heb ik het gewoon even zelf geschreven, het principe is gewoon het overzetten van de ene array naar de andere.
<?php
for($x = $offset; $x < ($offset + $max); $x++){
$gegevens[$x] = explode("___", $omgedraaid[$x]);
if($gegevens[$x]['0'] != ""){
?>
|
In deze loop gebruiken we een variabele die we daarnet hebben gecreeerd.
We willen niet alle gegevens opvragen.
Enkel de 5 die aan de volgende voorwaarden voldoen:
Ze zitten tussen de waarde van de huidige pagina maal het maximum, en deze laatste waarde plus het maximum.
We doen weer hetzelfde als in de vorige tutorial, met explode de gegevens scheiden.
Als de naam verschillend is van "niets" (we laten automatisch een loop doorlopen van 5 gegevens lang, als we dit niet zouden doen en we hadden 3 gegevens, zouden er 2 lege vakken zijn) dan geven we de gegevens weer.
<?php
echo $gegevens[$x]['0'];
echo $gegevens[$x]['1'];
?>
|
Alles gewoon weergeven en dan gaan we eens kijken hoe we een waarde in $p kunnen zetten.
<?php
for($var = 0; $var < $aantal_paginas; $var++){
if($huidige_pagina == $var){
echo "<b>". ($var+1) ."</b>";
}
else{
echo "<a href=\"". $_SERVER['PHP_SELF'] ."?p=". $var ."\">". ($var+1) ."</a>";
}
if($var < $aantal_pagina - 1){
echo " - ";
}
}
?>
|
Dit gedeelte staat BUITEN de for loop (ik ga je handje niet vasthouden om een for af te sluiten...).
We gaan zien hoeveel paginas er zijn, als de huidige pagina gelijk is aan var, dan laten we $var+1 zien (je mag niet klikken op een pagina waar je al zit).
Anders gaan we een mooie URL geven naar dezelfde pagina.
Een streepje erbij voor alles mooi aan elkaar te lijmen.
En gedaan.
top
5. Het volledige script
Ik heb het script wat opgemaakt, qua CSS is het hetzelfde als hier op de site.
Een klein tipje is misschien om na te kijken bij het verwerken van het formulier of alles is ingevuld, om grafische misbaksels te voorkomen.
<style type="text/css">
.tabel {
border: 1px solid #999999;
background-color: #E0E0F0;
}
.tabel2 {
border: 1px solid #999999;
background-color: #F5F5F5;
}
a:link, a:visited {
color: #355FA8;
text-decoration: none;
font-size: 20;
font-weight: 200;
}
a:hover {
color: #1184C8;
text-decoration: underline;
font-size: 20;
font-weight: 200;
}
a:active {
color: #666666;
text-decoration: none;
font-size: 20;
font-weight: 200;
}
body{
color: #000000;
text-decoration: none;
font-size: 20;
font-weight: 200;
}
</style>
<?php
$max = 5;
$file = "gb.dat";
if(file_exists($file)){
$fp = fopen($file, "r");
$inhoud = fread($fp, filesize($file));
$inhoud = explode("\n", $inhoud);
$j = count($inhoud);
$j--;
?>
<center>
<table width="50%" class="tabel" cellpadding="5" cellspacing="5">
<?php
$aantal_paginas = ceil($j / $max);
$huidige_pagina = 0;
if(isSet($_GET['p']) && is_numeric($_GET['p']) && $_GET['p'] > 0 && $_GET['p'] < $aantal_paginas){
$huidige_pagina = $_GET['p'];
}
$offset = $huidige_pagina * $max;
$variabele = 0;
for($omdraaien = $j-1; $omdraaien > -1; $omdraaien--){
$omgedraaid[$variabele] = $inhoud[$omdraaien];
$variabele++;
}
for($x = $offset; $x < ($offset + $max); $x++){
$gegevens[$x] = explode("___", $omgedraaid[$x]);
if($gegevens[$x]['0'] != ""){
?>
<tr>
<td>
<table border="0" class="tabel2" width="100%">
<tr>
<td valign="top" width="10%">
NAAM:
</td>
<td valign="top">
<?php
echo $gegevens[$x]['0'];
?>
</td>
</tr>
<tr>
<td valign="top">
Bericht:
</td>
<td valign="top">
<?php
echo $gegevens[$x]['1'];
?>
</td>
</tr>
</table>
</td>
</tr>
<?php
}
}
?>
<tr>
<td>
<?php
for($var = 0; $var < $aantal_paginas; $var++){
if($huidige_pagina == $var){
echo "<b>". ($var+1) ."</b>";
}
else{
echo "<a href=\"". $_SERVER['PHP_SELF'] ."?p=". $var ."\">". ($var+1) ."</a>";
}
if($var < $aantal_pagina - 1){
echo " - ";
}
}
?>
</td>
</tr>
<?php
fclose($fp);
?>
</table>
<?php
echo "<a href=\"form.htm\">Schrijf iets</a>";
}
else{
echo "<a href=\"form.htm\">Schrijf iets</a>";
}
?>
|
Hopelijk heb je wat van deze tutorial geleerd, en kan je hier mee verder.
Ik wens je nog veel succes in het ontdekken van de wondere wereld genaamd PHP.
Heb je nog vragen? Stel deze dan op het forum.
|