Door
Pierre Web
op 05-01-2017 22:05
gewijzigd op 05-01-2017 22:08
7.859 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 geef alleen aan zoals het nu is nul is als voorbeeld
Vanuit id 1 (GET) zie ik de inhoud van het record van id 2. (tabel) dus een id meer
Maar ik kom niet aan record 1(eerste) en record 23 (laatste)
Bij nieuws-test2.php?id=1 wordt record 2 getoond en alleen VOLGENDE , hoe kom ik nou aan de inhoud van record EEN.
Voor het laatste record hetzelfde maar dan omgekeerd, ik kom niet aan record 23.
Waar gebruik je het script precies voor? Leg dat eens duidelijk uit?
Want het klinkt alsof je onder een nieuwsbericht wilt tonen wat het voorgaande en het opvolgende nieuwsbericht is, als die bestaat? Klopt dat?
Ik heb dit script uitgetest op de database van mijn site, en daar werkt hij prima op.
Als je de inhoud van je $_GET['id'] op wilt halen, moet je een aparte query draaien.
<?php
if(isset($_GET['id'])) {
$id = $mysqli->real_escape_string($_GET['id']); // Escapen is BELANGRIJK
$query_prefnext = "SELECT * FROM `news`
WHERE ( id = IFNULL((SELECT MIN(id) FROM `news` WHERE id > '".$id."'),0)
OR id = IFNULL((SELECT MAX(id) FROM `news` WHERE id < '".$id."'),0))
";
$query_news = "SELECT title FROM news WHERE id = '".$id."'";
$result = $mysqli->query($query_news);
$data = $result->fetch_assoc();
echo "<h1>".$data['title']."</h1>";
/* SHOW prev-next links*/
$result = $mysqli->query($query_prefnext);
while ($row = $result->fetch_assoc() ) {
if ($row['id'] < $id) {
echo '< <a href="prefnext.php?id='.$row['id'].'">Vorige: '.$row['title'].'</a> ';
}
if ($row['id'] > $id) {
echo ' <a href="prefnext.php?id='.$row['id'].'">Volgende: '.$row['title'].'</a> >';
}
}
} else {
echo "Geef een ID mee!";
}
?>
Klopt, ik heb een nieuws-overzicht.html pagina ,bevat een lijst met overzicht van nieuws:
1-nieuws1 kies ik hiervoor kom ik op pagina nieuws.php met betreffend nieuws met inhoud van record 1 met
id 1 nieuws.php?id=1
2-nieuws2 kies ik hiervoor komt pagina met nieuws van id 2 nieuws.php?id=2
..
..
23-nieuws23.
ik wil dus op deze nieuws.php pagina door het vorige en volgende nieuws `bladeren`
Twee queries is niet eens nodig, je mag queries die één waarde teruggeven ook opnemen in de select:
SELECT
n.*,
(SELECT IFNULL(MAX(id), 0) FROM nieuws WHERE id < n.id) prev_id,
(SELECT IFNULL(MIN(id), 0) FROM nieuws WHERE id > n.id) next_id
FROM
nieuws n
WHERE
n.id = 1234
<?php
$id = $mysqli->real_escape_string($_GET['id']); // Escapen is BELANGRIJK
$query_prefnext = "SELECT * FROM `news`
WHERE ( id = IFNULL((SELECT MIN(id) FROM `news` WHERE id > $id),0)
OR id = IFNULL((SELECT MAX(id) FROM `news` WHERE id < $id),0))";
?>
Is *niet* veilig omdat $id niet tussen quotes staat. Hier is nog steeds SQL-injectie mogelijk.
real_escape_string() escaped niets als er niets te escapen valt.
Als je voor $_GET['id'] het volgende invult:
5 OR 1=1
Dan werkt dit gewoon.
Daarom is het zaak dat je de delen die je escaped ook voorziet van quotes. Het een is niet veilig zonder het ander.
Daarnaast zou je natuurlijk ook kunnen overwegen om je input te filteren (door te kijken of $_GET['id'] een numerieke waarde heeft).