output sql query
dat er bijv. max 25 per blz worden weergegeven?
Jammer dat je niet eerst op Google hebt gekeken en je vraag gewoon hier stelde..
1. Je hebt in de URL een paginanummer (bijv: www.mijnwebsite.nl/artikelen.php?page=1). Dit paginanummer kun je d.m.v. GET uit de URL halen.
2. Vervolgens moet je bepalen welke data er bij dit pagina nummer hoort. Bij 1 wil je de eerste 25 records ophalen, dit kun je met een LIMIT in je query voor elkaar krijgen. Bij 2 haal je 25 t/m 50 op etc.
3. Als laatste wil je knoppen laten zien naar de vorige/volgende pagina. Hier kom je denk ik wel uit.
Gewijzigd op 27/12/2015 19:46:05 door Bo Ter Ham
als de eerste pagina LIMIT 0,25 bevat, dan bevat de tweede niet LIMIT 25, 50
maar 25, 25
Ik heb mooi voorbeeld gevonden, bladzijde 1 werkt, de rest niet. Ik heb me suf gegoogled
want ik dacht eerst dat het aan m'n voorbeeld lag, dat er ene fout inzat, was ik helemaal opnieuw begonnen met ander voorbeeld, die had zelfde probleem (blond ja) het is iets met GET maar wat PRECIES en hoe ik het op moet lossen dat begrijp ik dan weer niet want er staat gewoon GET, iets anders kan ik er niet van maken. Hij onthoudt de invoer niet, ofzo...
Nu moeten we de glazen bol weer uit de kast halen.
PHP Maarten op 27/12/2015 18:09:52:
Jammer dat je niet eerst op Google hebt gekeken en je vraag gewoon hier stelde..
Beetje kort door de bocht. Iedereen is gewoon vrij om hier een vraag te stellen. Daar is dit forum voor bedoeld.
- SanThe - op 17/01/2016 23:58:37:
Nu moeten we de glazen bol weer uit de kast halen.
Nu moeten we de glazen bol weer uit de kast halen.
:)
ik ga eerst alles vermysqli-en, eerder durf ik hier niks meer te posten
en aangezien ik daarin ook vastloop (whaa het zal niet) ben ik nog wel ff bezig, vrees ik
dus even geduld aub, wordt vervolgd
Quote:
1. Je hebt in de URL een paginanummer (bijv: www.mijnwebsite.nl/artikelen.php?page=1). Dit paginanummer kun je d.m.v. GET uit de URL halen.
Ik snap nu waarom GET steeds niet werkt, ik heb geen paginanummer in de url, het eindigt gewoon op .php
In het geval dat er geen pagina nummer is opgegeven, of verwezen wordt naar het script zelf zonder enige GET-parameters, loont het om in dit geval de eerste aantal items te tonen.
Code (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
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
<?php
require_once "config.php";
$reclimit = 3;
if(isset($_GET['page'])){
$page = $_GET['page'];
} else {
$page = 1;
}
$start = (($page-1) * $reclimit);
// if(isset($_POST['Kleur'])){ $Kleur = $_POST['Kleur'];
// $Kleur= "wit";
// if(isset($_GET['Kleur'])){ $Kleur = $_GET['Kleur'];
// } else {echo "Geen geldige invoer";
// }
$sql = "SELECT * FROM katten WHERE Kleur = '$Kleur'";
$records = $conn->query($sql);
$total = $records->num_rows;
$tpages = ceil($total / $reclimit);
$rec = "SELECT * FROM katten WHERE Kleur = '$Kleur' ORDER BY Nummer DESC LIMIT $start, $reclimit";
$records = $conn->query($rec);
while($row = $records->fetch_array()) {
echo "<tr>";
echo "<td>".$row['Nummer']."</td>";
echo "<td>".$row['Naam']."</td>";
echo "<td>".$row['Kleur']."</td>";
echo "<td>".$row['Url']."</td>";
echo "</tr>";
}
mysqli_close($conn);
for($i=1;$i<=$tpages;$i++) {
echo "<li><a href=kleur.php?page=".$i.">".$i."</a></li>";
}
?>
require_once "config.php";
$reclimit = 3;
if(isset($_GET['page'])){
$page = $_GET['page'];
} else {
$page = 1;
}
$start = (($page-1) * $reclimit);
// if(isset($_POST['Kleur'])){ $Kleur = $_POST['Kleur'];
// $Kleur= "wit";
// if(isset($_GET['Kleur'])){ $Kleur = $_GET['Kleur'];
// } else {echo "Geen geldige invoer";
// }
$sql = "SELECT * FROM katten WHERE Kleur = '$Kleur'";
$records = $conn->query($sql);
$total = $records->num_rows;
$tpages = ceil($total / $reclimit);
$rec = "SELECT * FROM katten WHERE Kleur = '$Kleur' ORDER BY Nummer DESC LIMIT $start, $reclimit";
$records = $conn->query($rec);
while($row = $records->fetch_array()) {
echo "<tr>";
echo "<td>".$row['Nummer']."</td>";
echo "<td>".$row['Naam']."</td>";
echo "<td>".$row['Kleur']."</td>";
echo "<td>".$row['Url']."</td>";
echo "</tr>";
}
mysqli_close($conn);
for($i=1;$i<=$tpages;$i++) {
echo "<li><a href=kleur.php?page=".$i.">".$i."</a></li>";
}
?>
Als ik $Kleur invul gaat het goed, maar zowel met met $_POST als $_GET "vergeet" hij de Kleur als ik verder blader dan de 1e pagina. Wat doe ik nou verkeerd?
(nb op de eerste blz staat in de url: kleur.php?page=wit
en de tweede: kleur.php?page=2)
Gewijzigd op 10/02/2016 00:29:58 door marina janssen
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:
Oftewel:
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
<?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];
?>
// 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.
toch? Hij onthoudt wel de pagina maar niet de ingevoerde kleur.
Dat doet Geef de kleur mee in de url, net als page
Dan is de cirkel rond.
Daarna zou je eens kunnen gaan kijken naar het filteren van je input...
Gewijzigd op 10/02/2016 15:40:23 door Thomas van den Heuvel
maar bedoel je dat ik dat ik dat hier ergens tussen moet proppen?
Don't get fresh now.
'kleur.php?kleur='.$Kleur.'&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.
Gewijzigd op 10/02/2016 17:21:20 door Thomas van den Heuvel
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)
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?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>";
}
[code]<?>[/code] Dat is toch wel veilig?
$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>";
}
[code]<?>[/code] Dat is toch wel veilig?