Door
Pierre Web
op 05-01-2017 22:05
gewijzigd op 05-01-2017 22:08
7.868 views
Hallo
Hallo,
Ik probeer de volgende rij uit tabel te halen met:
<?php
$id = $_GET['id'];
$id = ($id+1);
<a href="nieuws.php?id='.$id.'">volgende</a>
$query_nieuws = ("SELECT *
FROM `nieuws` WHERE id = '$id' ORDER BY id DESC LIMIT 1
");
?>
Maar nu komt het ook voor dat een id er niet meer is bijv. id 1 , 2 , 4 (id 3 bestaat niet meer),
en wat als het de laatste of eerste id betreft.
Er moet ook nog een vorige komen
Ik kom met Vorige tot id 1 (GET) en inhoud id 2 van tabel wordt weergegeven.(1 dus niet)
met Volgende kom ik tot id 23 (GET) en inhoud id 22 van tabel word weergegeven. (23 dus niet)
Je kan in je loop gewoon $_GET['id'] gebruiken zonder escaping.
Dat lijkt mij niet verstandig. Escape altijd output. Maar dan wel op de goede manier. real_escape_string() doet niet zoveel in HTML hé. Gebruik in HTML htmlspecialchars(). En in URLs mogelijk ook urlencode(). Of wellicht eenvoudiger (en meer van toepassing in deze situatie): filter je input. Controleer allereerst of $_GET['id'] een numerieke waarde heeft.
Los hiervan, dit alles lijkt nogal veel op pagineringsfunctionaliteit (ook al toon je maar één item per keer). Misschien kan de oplossing meer in die hoek gezocht worden. Of je maakt gebruik van een volgorde kolom :p.
$query_nieuws = ("SELECT
* FROM `nieuws` WHERE ( id = IFNULL((SELECT MIN(id) FROM `nieuws` WHERE id > $id),0)
OR id = IFNULL((SELECT MAX(id) FROM `nieuws` WHERE id < $id),0))
");
$result = $mysqli->query($query_nieuws);
while ($row = $result->fetch_assoc() ) {
$id = $row['id'];
$title = $row['title'];
$id_get= mysqli_real_escape_string($mysqli, $_GET['id']);
if ($id_get < "$id") {
echo '<a href="nieuws-test2.php?id='.$id.'">Volgende</a>';
}
else if ($id_get > "$id") {
echo '<a href="nieuws-test2.php?id='.$id.'">Vorige</a>';
}
}
Wat voor probleem dan? Je wilt toch volgende en/of volgende tonen?
Dan zou dit moeten werken:
<?php
$id = $mysqli->real_escape_string($_GET['id']); // Escapen is BELANGRIJK
$query_nieuws = "SELECT * FROM `nieuws`
WHERE ( id = IFNULL((SELECT MIN(id) FROM `nieuws` WHERE id > $id),0)
OR id = IFNULL((SELECT MAX(id) FROM `nieuws` WHERE id < $id),0))
";
$result = $mysqli->query($query_nieuws);
while ($row = $result->fetch_assoc() ) {
if ($row['id'] < $id) {
echo '<a href="nieuws-test2.php?id='.$row['id'].'">Vorige</a>';
}
if ($row['id'] > $id) {
echo '<a href="nieuws-test2.php?id='.$row['id'].'">Volgende</a>';
}
}
?>
Ik heb rij 1 t/m 23 met id 1 t/m 23 ( er was geen id 11 maar die heb ik ff toegevoegd voor test
kijken of dit onderstaande oploste maar maakt niks uit.
Deze moet andersom ff terzijde (Vorige/Volgende).
// Vorige eerst
if ($id < $row['id']) {
echo '<a href="nieuws-test2.php?id='.$row['id'].'">Vorige</a>';
}
if ($id > $row['id']) {
echo '<a href="nieuws-test2.php?id='.$row['id'].'">Volgende</a>';
}
Url is: nieuws-test2.php?id=1 , dan komt het content VAN id 2. (kom niet verder terug, er is geen VORIGE meer )
het content van id 1 blijf dus buiten bereik
Om het content van id 1 weer te geven heb ik nieuws-test2.php?id=0 nodig (NUL), maar er is geen ID NUL
Url is nieuws-test2.php?id=23 , dan komt het content VAN id 22. (kom niet verder vooruit er is geen VOLGENDE meer)
het content van id 23 blijf dus buiten bereik.
Om het content VAN id 23 weer te geven heb ik nieuws-test2.php?id=24 nodig (24) maar er is geen ID 24