Archief links
Ik ben nu een half jaar bezig met PHP en heb het al aardig onder de knie! Het enige wat het voor mij nog lastig maakt af en toe, is dat ik vaak dubbele query's maak of door een typ fout niet gauw door heb wat er precies fout is gegaan in mijn scripts.
Ik ben momenteel bezig met het opzetten van een blog. Hierbij zou ik graag gebruik willen maken van een archief om het zoeken van berichten in de nabije toekomst te vereenvoudigen.
Nu gebruik ik voorlopig deze PHP code/SQL functie:
// archief
$archivedata = mysql_query("SELECT DISTINCT date_format(date, '%M %Y') as maand FROM blog ORDER BY date DESC");
while ($archivelist = mysql_fetch_assoc($archivedata))
{
// opsomming data
$archive_month = $archivelist['maand'];
$archive .= '<a href="#">'.$archive_month.'</a><br/>';
}
Om mijn totale lijst met berichten te tonen gebruik ik het volgende script:
// blog index
$bloglist = mysql_query("SELECT * FROM blog ORDER BY date DESC");
$teller = 0;
while ($blog_row = mysql_fetch_assoc($bloglist))
{
$teller++;
// get data
// Hier roep ik de gewenste gegevens op
$blogs .= ' <!-- opbouw blogpost --> '
;}
Met deze scripts lukt het mij om de archief filter te tonen zoals ik het voor ogen heb en om een lijstweergave van al mijn berichten te tonen. Echter zit ik nog steeds met een probleem:
Hoe zorg ik ervoor dat er bij het klikken op één van de links ENKEL de berichten uit die maand en uit het betreffende jaar worden vertoont.
Iemand een idee?
Ik heb nog geen voorbeeld online staan. Ik werk momenteel via een lokale server(XAMPP).
P.S: Ik gebruik af en toe Nederlandse en Engelse termen door elkaar. Ik werk voornamelijk in het Engels omdat ik dit makkelijker vindt, maar wanneer ik een code probeer te maken die ik eventueel aan een klasgenoot zou kunnen doorgeven (ter voorbeeld) noteer ik alles in het Nederlands. Excuseer mij als dit bij mijn voorbeeld codes verwarrend is.
Gewijzigd op 03/08/2011 15:30:13 door Christopher A
Kijk eens naar WHERE (in je query)
SELECT "blogpost" WHERE "datum gelijk aan link" ?
Het idee is er wel, maar de uitvoering is mij nog niet duidelijk. Ik wil niet lui klinken, maar betekend dit dat ik voor elke maand die regel moet maken of kan dit allemaal in 1 compactere code? Ik probeer namelijk niet omslachtig te werk te gaan zoals ik voorheen heb aangegeven toch vaak te doen.
Ik snap momenteel even niet hoe ik het "onClick" gegeven van de links uit het archief kan aansturen tot een SQL functie. Het zal waarschijnlijk zo voor de hand liggen en zodra ik het lees of er weer op kom klinkt er een "Oh Ja!", maar ik ben momenteel heel onhandig bezig met een aantal Javascript codes om m'n blog op te leuken welke niet willen lukken. En daardoor haal ik al die termen e.d. door mekaar en vergeet ik wat er bij beide scripting languages mogelijk is...
Toevoeging op 03/08/2011 17:51:44:
Ik vond dit stukje code in een ander artikel op phphulp:
WHERE
MONTH(datum) = MONTH(NOW())
AND
YEAR(datum) = YEAR(NOW())
http://www.phphulp.nl/php/forum/topic/archief/46062/
(hoe zorg ik er trouwens voor in een comment dat de code "speciaal" wordt weergegeven zoals in de bovenstaande link?)
On topic:
Ik was al aan iets soortgelijks aan het denken, ik ga het nu even uitproberen en als het lukt laat ik het even weten in deze thread ;) Ik geloof dat ik het gewoon op dezelfde manier kan aanpakken als de manier waarop ik alle blogposts in eerste instantie heb geladen.
Toevoeging op 03/08/2011 19:45:33:
Ik ben er geloof ik bijna, ik heb nu de volgende code toegepast:
elseif($_GET['maand']){
// archive
$archivedata = mysql_query("SELECT DISTINCT date_format(date, '%M %Y') as maand FROM blog ORDER BY date DESC");
while ($archivelist = mysql_fetch_assoc($archivedata))
{
// get data
$archive_month = $archivelist['maand'];
$archive .= '<a href="index.php?p=blog&id='.$archive_month.'">'.$archive_month.'</a><br/>';
// blog index
$bloglist = mysql_query("SELECT * FROM blog WHERE date = maand ORDER BY date DESC");
$teller = 0;
while ($blog_row = mysql_fetch_assoc($bloglist))
{
$teller++;
// get data
//haal gewenste blogdata op
$blogs .= '<!-- blog opbouw -->';
} // einde while($blog_row etc..)
} // einde while($archivelist etc..)
} //einde elseif
Het probleem is nu dat er een spatie in de url staat(weet niet of dat de volgende fout veroorzaakt) en hij haalt geen data uit de database op. Ik weet wel dat er een nieuwe pagina wordt geopend omdat mijn dummy afbeelding wel verschijnt (< lang verhaal).
Hoe zorg ik er nu voor dat ik een mooie/geldige url maak met een functie die alleen de blogposts ophaalt van de juiste datum?
Ik kan "date_format(date, '%M %Y')" uit "SELECT DISTINCT date_format(date, '%M %Y') as maand FROM blog ORDER BY date DESC" niet zonder spatie typen omdat ik mijn archief niet meer vind uitzien; dubbel "date_format(date, '%M %Y')" gebruiken waarbij 1x zonder spatie voorkomt is ook geen optie omdat hij dan dus de laatste actie voor date_format() leest...
EDIT:
Ik besef me net dat ik de verkeerde code heb getest in localhost, hier staat mn WHERE statement nog niet in verwerkt..
--
EDIT 2:
Helaas, wederom mislukt met " WHERE date='".$_GET['maand']."' ". Met trial en error kom ik er uiteindelijk wel, maar als iemand voor die tijd de oplossing weet hoor ik het graag!
Gewijzigd op 03/08/2011 20:19:13 door Christopher A
Een vraag (als uberhaupt iemand deze thread nog bekijkt/leest buiten ikzelf): Is het toegestaan/functioneel om 2x een mysql_query aan te roepen of is op deze manier alleen de laatste "actief". Ik heb dit namelijk gedaan (zoals hierboven wordt beschreven) en weet niet of juist dit gegeven aan het probleem zou kunnen bijdragen...
Christopher Ankomah op 03/08/2011 17:30:28:
(hoe zorg ik er trouwens voor in een comment dat de code "speciaal" wordt weergegeven zoals in de bovenstaande link?)
Dat doe je met ['code] en [/'code] (zonder ' ertussen :)). Zet PHP code tussen zodat het goed opgemaakt wordt.
Christopher Ankomah op 03/08/2011 17:30:28:
Ik ben er geloof ik bijna, ik heb nu de volgende code toegepast:
Het probleem is nu dat er een spatie in de url staat(weet niet of dat de volgende fout veroorzaakt) en hij haalt geen data uit de database op. Ik weet wel dat er een nieuwe pagina wordt geopend omdat mijn dummy afbeelding wel verschijnt (< lang verhaal).
Hoe zorg ik er nu voor dat ik een mooie/geldige url maak met een functie die alleen de blogposts ophaalt van de juiste datum?
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
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
<?php
elseif($_GET['maand']){
// archive
$archivedata = mysql_query("SELECT DISTINCT date_format(date, '%M %Y') as maand FROM blog ORDER BY date DESC");
while ($archivelist = mysql_fetch_assoc($archivedata))
{
// get data
$archive_month = $archivelist['maand'];
$archive .= '<a href="index.php?p=blog&id='.$archive_month.'">'.$archive_month.'</a><br/>';
// blog index
$bloglist = mysql_query("SELECT * FROM blog WHERE date = maand ORDER BY date DESC");
$teller = 0;
while ($blog_row = mysql_fetch_assoc($bloglist))
{
$teller++;
// get data
//haal gewenste blogdata op
$blogs .= '<!-- blog opbouw -->';
} // einde while($blog_row etc..)
} // einde while($archivelist etc..)
} //einde elseif
?>
elseif($_GET['maand']){
// archive
$archivedata = mysql_query("SELECT DISTINCT date_format(date, '%M %Y') as maand FROM blog ORDER BY date DESC");
while ($archivelist = mysql_fetch_assoc($archivedata))
{
// get data
$archive_month = $archivelist['maand'];
$archive .= '<a href="index.php?p=blog&id='.$archive_month.'">'.$archive_month.'</a><br/>';
// blog index
$bloglist = mysql_query("SELECT * FROM blog WHERE date = maand ORDER BY date DESC");
$teller = 0;
while ($blog_row = mysql_fetch_assoc($bloglist))
{
$teller++;
// get data
//haal gewenste blogdata op
$blogs .= '<!-- blog opbouw -->';
} // einde while($blog_row etc..)
} // einde while($archivelist etc..)
} //einde elseif
?>
Het probleem is nu dat er een spatie in de url staat(weet niet of dat de volgende fout veroorzaakt) en hij haalt geen data uit de database op. Ik weet wel dat er een nieuwe pagina wordt geopend omdat mijn dummy afbeelding wel verschijnt (< lang verhaal).
Hoe zorg ik er nu voor dat ik een mooie/geldige url maak met een functie die alleen de blogposts ophaalt van de juiste datum?
Echo de query op het scherm en voer hem in in bijvoorbeeld PHPMyAdmin. Je kan dan zien of er überhaupt data geselecteerd wordt en je kan sneller de query aanpassen totdat je tevreden bent met het resultaat.
Als je tekens als spaties veilig via de url wilt meegeven dat moet je de data door urlencode halen (en dan bij het uitlezen weer urldecode). Je maakt in de archief url's overigens ook geen $_GET['maand'] aan, maar $_GET['id'].
Gebruik geen "SELECT *" maar geef gewoon aan welke kolommen je wilt hebben.
Christopher Ankomah op 05/08/2011 16:06:05:
Het probleem dat mijn datum in de database wordt aangegeven als "yyyy-mm-dd" en ik dit bij het ophalen omzet in "date_format(date, '%M %Y')" welke ik omschrijf als 'maand'. Dus wanneer ik 'maand' aanroep met $_GET['maand] kan hij waarschijnlijk niets vinden in de database wat hiermee overeenkomt.
Dat klopt. Neem eens een kijkje op http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_date-format . Je zal in de tweede query de datum op eenzelfde manier moeten formatteren als hoe je het bij de eerste keer hebt gedaan (met date_format).
Christopher Ankomah op 05/08/2011 16:06:05:
Een vraag (als uberhaupt iemand deze thread nog bekijkt/leest buiten ikzelf): Is het toegestaan/functioneel om 2x een mysql_query aan te roepen of is op deze manier alleen de laatste "actief". Ik heb dit namelijk gedaan (zoals hierboven wordt beschreven) en weet niet of juist dit gegeven aan het probleem zou kunnen bijdragen...
Dat is hier wel handig aangezien je die link naar de specifieke maand wilt weergeven. Je doet nu overigens niets met $_GET['maand']. Kan je niet een constructie als deze gebruiken?
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
//Als de maand is gegeven toon dan alles van die maand.
if(isset($_GET['maand'])) {
$blogdata = mysql_query("
SELECT kolom1, kolom2, andere kolom
FROM blog
WHERE date_format(date, '%M %Y') = '" . mysql_real_escape_string(urldecode($_GET['maand'])) . "'
ORDER BY date DESC");
while($blog_row = mysql_fetch_assoc($blogdata)) {
//Geef weer.
}
} else {
//Laat archief zien.
$archivedata = mysql_query("
SELECT DISTINCT date_format(date, '%M %Y') as maand
FROM blog
ORDER BY date DESC");
while ($archivelist = mysql_fetch_assoc($archivedata)) {
echo '<a href="index.php?p=blog&maand='. urlencode($archivelist['maand']) . '">'.$archivelist['maand'].'</a><br/>';
}
}
?>
//Als de maand is gegeven toon dan alles van die maand.
if(isset($_GET['maand'])) {
$blogdata = mysql_query("
SELECT kolom1, kolom2, andere kolom
FROM blog
WHERE date_format(date, '%M %Y') = '" . mysql_real_escape_string(urldecode($_GET['maand'])) . "'
ORDER BY date DESC");
while($blog_row = mysql_fetch_assoc($blogdata)) {
//Geef weer.
}
} else {
//Laat archief zien.
$archivedata = mysql_query("
SELECT DISTINCT date_format(date, '%M %Y') as maand
FROM blog
ORDER BY date DESC");
while ($archivelist = mysql_fetch_assoc($archivedata)) {
echo '<a href="index.php?p=blog&maand='. urlencode($archivelist['maand']) . '">'.$archivelist['maand'].'</a><br/>';
}
}
?>
Edit: wil je alles standaard laten zien en als je op zo'n maand klikt enkel van de maand dan kan je het beste van dat stuk tussen "if(isset($_GET['maand'])" een functie maken met als parameter de maand:
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
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
<?php
function GeefBlogsPerMaand($maand) {
$blogdata = mysql_query("
SELECT kolom1, kolom2, andere kolom
FROM blog
WHERE date_format(date, '%M %Y') = '" . mysql_real_escape_string(urldecode($_GET['maand'])) . "'
ORDER BY date DESC");
while($blog_row = mysql_fetch_assoc($blogdata)) {
//Geef weer.
}
}
//Als de maand is gegeven toon dan alles van die maand.
if(isset($_GET['maand'])) {
//Toon de blogs voor de opgegeven maand.
GeefBlogsPerMaand($_GET['maand']);
} else {
//Laat archief zien.
$archivedata = mysql_query("
SELECT DISTINCT date_format(date, '%M %Y') as maand
FROM blog
ORDER BY date DESC");
while ($archivelist = mysql_fetch_assoc($archivedata)) {
echo '<a href="index.php?p=blog&maand='. urlencode($archivelist['maand']) . '">'.$archivelist['maand'].'</a><br/>';
GeefBlogsPerMaand($archivelist['maand']);
}
}
?>
function GeefBlogsPerMaand($maand) {
$blogdata = mysql_query("
SELECT kolom1, kolom2, andere kolom
FROM blog
WHERE date_format(date, '%M %Y') = '" . mysql_real_escape_string(urldecode($_GET['maand'])) . "'
ORDER BY date DESC");
while($blog_row = mysql_fetch_assoc($blogdata)) {
//Geef weer.
}
}
//Als de maand is gegeven toon dan alles van die maand.
if(isset($_GET['maand'])) {
//Toon de blogs voor de opgegeven maand.
GeefBlogsPerMaand($_GET['maand']);
} else {
//Laat archief zien.
$archivedata = mysql_query("
SELECT DISTINCT date_format(date, '%M %Y') as maand
FROM blog
ORDER BY date DESC");
while ($archivelist = mysql_fetch_assoc($archivedata)) {
echo '<a href="index.php?p=blog&maand='. urlencode($archivelist['maand']) . '">'.$archivelist['maand'].'</a><br/>';
GeefBlogsPerMaand($archivelist['maand']);
}
}
?>
En je moet nog foutafhandeling toevoegen (wat laat je de gebruiker zien als er een fout optreed in de query? Of als er geen rijen bij een bepaalde maand horen?
Gewijzigd op 05/08/2011 17:08:48 door The Force
Het kwam uiteindelijk neer op ongeveer het volgende:
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
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
<?php
}elseif(isset($_GET['month'])) {
// archive
$archivedata = mysql_query("SELECT *, date_format(date, '%M %Y') as month FROM blog ORDER BY date DESC");
while ($archivelist = mysql_fetch_assoc($archivedata))
{
// get data
// hier definieer ik de variabelen;
$archive .= '<a href="index.php?p=blog&month='. urlencode($archivelist['month']) . '">'.$archivelist['month'].'</a><br/>';
}
$archdata = mysql_query("
SELECT *
FROM blog
WHERE date_format(date, '%M %Y') = '" . mysql_real_escape_string(urldecode($_GET['month'])) . "'
ORDER BY date DESC");
$teller = 0;
while($arch_row = mysql_fetch_assoc($archdata)) {
$teller++;
// get data
// hier definieer ik de gewenste data voor mijn artikelen
$blogs .= '<!-- hier schrijf ik de html -->';}
?>
}elseif(isset($_GET['month'])) {
// archive
$archivedata = mysql_query("SELECT *, date_format(date, '%M %Y') as month FROM blog ORDER BY date DESC");
while ($archivelist = mysql_fetch_assoc($archivedata))
{
// get data
// hier definieer ik de variabelen;
$archive .= '<a href="index.php?p=blog&month='. urlencode($archivelist['month']) . '">'.$archivelist['month'].'</a><br/>';
}
$archdata = mysql_query("
SELECT *
FROM blog
WHERE date_format(date, '%M %Y') = '" . mysql_real_escape_string(urldecode($_GET['month'])) . "'
ORDER BY date DESC");
$teller = 0;
while($arch_row = mysql_fetch_assoc($archdata)) {
$teller++;
// get data
// hier definieer ik de gewenste data voor mijn artikelen
$blogs .= '<!-- hier schrijf ik de html -->';}
?>
Nogmaals bedankt! Nu kan ik verder met de rest van het werk dat gedaan moet worden om m'n blog functioneel te krijgen!
Gewijzigd op 06/08/2011 18:31:59 door Christopher A