Als de output van een sql query honderden resultaten geeft, hoe kan ik dan zorgen
dat er bijv. max 25 per blz worden weergegeven?
Je zult de kleur (en eventuele andere argumenten) ook moeten onthouden.

Daarnaast... Je haalt alle data op om uit te rekenen hoeveel resultaten er zijn? :(

Je zou ook een COUNT(*) of COUNT(id) kunnen doen (waarbij "id" de kolom is die je records uniek identificeert, ik neem aan / hoop dat je deze hebt?).

Of nog beter (maar hier verschillen de meningen over), gebruik de SQL_CALC_FOUND_ROWS flag in je LIMIT query.
Daarmee geef je aan dat je ook geinteresseerd bent in het totaal aantal resultaten wat je zou krijgen als je dezelfde query met dezelfde argumenten zou uitvoeren, maar dan zonder het LIMIT statement.

Het totaal aantal resultaten kun je ophalen door direct na je LIMIT query nog een query uit te voeren met als enige inhoud:
SELECT FOUND_ROWS()

Oftewel:
<?php
// resultaten van huidige pagina
$res = $conn->query('SELECT SQL_CALC_FOUND_ROWS ... FROM ... WHERE ... LIMIT ...');
/*
de volgende constructie met [0] is bruikbaar vanaf PHP 5.4,
anders doe je eerst een fetch_row() en lees je daarna de eerste kolom uit
*/
// totaal aantal resultaten
$totaal = $conn->query('SELECT FOUND_ROWS()')->fetch_row()[0];
?>

(zo gauw niet kunnen testen)

Iets waar je wel op moet letten is dat je informatie die je in je query stopt ofwel filtert of wel escaped (en het beste is nog allebei) anders zijn deze mogelijk vatbaar voor SQL injectie.
Thomas van den Heuvel op 10/02/2016 00:57:55

Je zult de kleur (en eventuele andere argumenten) ook moeten onthouden.

Hoe dan?
Die staan toch in je result? Dan hoeft je die toch niet te onthouden. Het enige wat je moet onthouden is op welke pagina je zit, aan de hand van het aantal items.
Dat doet <?php if(isset($_GET['page'])){
$page = $_GET['page'];
} else {
$page = 1;
}
?> toch? Hij onthoudt wel de pagina maar niet de ingevoerde kleur.
Geef de kleur mee in de url, net als page
Dat doe ik toch hiermee of mis ik iets? <?php if(isset($_GET['Kleur'])){ $Kleur = $_GET['Kleur']; ?>
... en die moet je vervolgens ook weer in je pagina-navigatie stoppen ;).

Dan is de cirkel rond.

Daarna zou je eens kunnen gaan kijken naar het filteren van je input...
even terzijde: een cirkel is altijd rond (anders was het wel een vierkant of een driehoek ofzo :)

maar bedoel je dat ik dat ik dat hier ergens tussen moet proppen?
<?php
for($i=1;$i<=$tpages;$i++) {
echo "<li><a href=kleur.php?page=".$i.">".$i."</a></li>";
} <?>
-_-
Don't get fresh now.

'kleur.php?kleur='.$Kleur.'&amp;page='.$i
o.i.d.?

Waarbij $Kleur nog "veilig" gemaakt dient te worden.

Je kunt ook misschien beter een kleurcode (1,2,3,4) gebruiken.

Daarnaast, als je het oorspronkelijke zoekformulier de methode GET geeft in plaats van POST, wordt het zoekveld "kleur" en de daarbij ingevulde/geselecteerde waarde direct opgenomen in de URL bij het verzenden van het formulier.

Bij zoekformulieren werkt GET doorgaans een stuk fijner dan POST.
Wow, ik heb me hier weken op suf gestaard, het werkt eindelijk!
Mijn dank is groot.
Wat betreft de veiligheid, de echte code is dit (ik had ff alle overbodige tekst eruit gegooid en alleen de kern gebruikt om die paginatie werkend te krijgen)
<?php
$aValid = ('/');
if (isset($_POST['Kleur']) and (ctype_alpha(str_replace($aValid, '', $_POST['Kleur']))))
{ $Kleur = $_POST['Kleur'];
else {echo "<section>Vul een geldige kleur in.</section>";
}
<?> Dat is toch wel veilig?

Reageren