vorige volgende rij selecteren in tabel
Pagina: « vorige 1 2 3 4 volgende »
En het record van ID 1 zie je dan toch vanuit id 2? Die 0 lijkt me niet van belang?
Gewijzigd op 07/01/2017 11:16:02 door - Ariën -
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.
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.
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
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
<?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!";
}
?>
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!";
}
?>
Zo heb ik hem werkend op mijn site.
Gewijzigd op 07/01/2017 16:03:40 door - Ariën -
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.
Gewijzigd op 07/01/2017 14:43:36 door Pierre Web
- 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.
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
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
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
Gewijzigd op 07/01/2017 15:03:06 door Ger van Steenderen
- 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.
- 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)
@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.
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?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))";
?>
$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:
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).
Gewijzigd op 07/01/2017 16:02:07 door Thomas van den Heuvel
Over het hoofd gezien, en gefixt. Zelf pas ik het altijd toe.
- Ariën - op 07/01/2017 15:16:49:
@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.
Dat klopt, de query geeft alleen de id's van het vorige en volgende record, maar dat is volgens mij ook voldoende.
Voor de topicstarter wel, tenzij je een titel wilt gebruiken.
PHP v7
Ik krijg nu als maand january (Engels)
kan ik in de query iets meegeven zodat de maand in Nederlands wordt geprint?(soort van Set locale)
nu zet ik ze alle 12 met en conditie om naar Nederlands.
Wat de titel betreft , was oorspronkelijk niet de bedoeling , maar is wel een leuke optie.
Ik heb die in een <span class="hidden-xs"> gezet , op kleine schermen laat ik die weg en gebruik alleen < >
Bedankt voor jullie reacties.
Gewijzigd op 08/01/2017 11:11:40 door Pierre Web
Dit gebruik ik om voor MySQL de juiste locale te gebruiken, en de andere voor PHP (bijv. strftime()). Ik geloof dat Windows er niet mee kan omgaan, althans, dat merk ik.
Gewijzigd op 08/01/2017 11:35:37 door - Ariën -
Overigens kan Windows er wel mee omgaan, maar de naamgeving is anders. Iets als nld_nld zou moeten werken.
$mysqli->query("SET lc_time_names = 'nl_NL'");
Ik had het al gezien in een andere post , maar werkte dus niet omdat NL verkeerd stond
En die 'nld_nld' wist ik nog niet.
Bedankt!
Code (php)
1
2
3
4
5
2
3
4
5
$content1 = substr($row['content'], 0, 200); // 1e print 1e 200tekens
$content2 = $content1; //2e (test regel)
$content3 = preg_replace("/<img[^>]+\>/i", " ", $content2); //3e Haal img tag uit content.
echo $content3:
$content2 = $content1; //2e (test regel)
$content3 = preg_replace("/<img[^>]+\>/i", " ", $content2); //3e Haal img tag uit content.
echo $content3:
de 1e haalt alleen de 1e 200 tekens uit content.
de 3e verwijder de IMG tag
Solo werkt het wel , maar zoals code hierboven alleen de 1e 200 tekens , de IMG wordt er niet uitgehaald.
iemand een idee hoe deze te combineren , zodat de 1e 200 tekens worden geprint EN de img tag verwijderd.