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
Dit toont alleen de vorige en/of volgende content, en NIET de content van je huidige ID uit je URL.

En het record van ID 1 zie je dan toch vanuit id 2? Die 0 lijkt me niet van belang?
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 '&lt; <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> &gt;';
	    }
    }
} else {
    echo "Geef een ID mee!";
}
?>

Zo heb ik hem werkend op mijn site.
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`

Jou nieuwe code moet ik nog testen.
Zonder interpuncties kan ik weinig touw vastknopen aan je voorbeeld, maar ik denk dat mijn script precies is wat je wilt, en dus twee dingen:

- Huidige nieuwsbericht tonen aan de hand van het ID in de URL
- Een linkje geven van het vorige en/of het volgende bericht, mits die bestaat.

Dus dan krijg je twee queries.

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
- Ariën - op 07/01/2017 14:46:20

Zonder interpuncties kan ik weinig touw vastknopen aan je voorbeeld, maar ik denk dat mijn script precies is wat je wilt, en dus twee dingen:

- Huidige nieuwsbericht tonen aan de hand van het ID in de URL
- Een linkje geven van het vorige en/of het volgende bericht, mits die bestaat.

Dus dan krijg je twee queries.




Bedank dat schijnt goed te gaan , ook als er een id is die niet meer bestaat.

Kijken hoe ik de vorige volgende ook BOVEN het content kan krijgen (lijkt me handig maar is een optie)

Kwestie van de echo's en de bijbehorende functionaliteit omwisselen.

@Ger: Die query is ook tof, alleen kan je daarmee geloof ik niet de data van die vorige/volgende records ophalen, en alleen het ID ermee ophalen.
Escapen is inderdaad belangrijk... Maar dit:
<?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).
Over het hoofd gezien, en gefixt. Zelf pas ik het altijd toe.

Reageren