Beste sitemasters,
Ben bezig aan een 'citaat van de week' systeempje voor op mijn website. In se heb ik geen flauw idee hoe ik elke week een nieuw citaat uit de database haal.
1. Voorzie genoeg citaten in je databank (voorzie ook een flag column die je de waarde 'reeds getoond'/'nog niet getoond'/'citaat van de week' geeft)
2. Haal in een cronjob een random citaat op/ verzet de vlag citaat van de week naar reeds getoond / verzet de vlag nog niet getoond van je gevonden citaat naar citaat van de week
3. Haal het citaat met flag 'citaat van de week' op.
Je kan ook een algoritme verzinnen dat op basis van de week telkens hetzelfde citaat gaat nemen, maar ik denk dat bovenstaande oplossing schaalbaarder is.
$query = "SELECT id,citaat FROM citaten where status='niet getoond' ORDER BY RAND() LIMIT 0,1";
$result = mysql_query($query) or die (mysql_error());
if (mysql_num_rows($result) >= 1) {
$citaatID = mysql_result($res, 0, 0);
mysql_query("UPDATE citaten set status='reeds getoond' where status='deze week'");
mysql_query("UPDATE citaten set status='deze week' where id = ".$citaatID);
}
$query="SELECT id,citaat FROM citaten where status='niet getoond' ORDER BY RAND() LIMIT 0,1";
Heb je al een databasestructuur bedacht? En staan er al citaten in de database tabel?
Je kunt een extra 'status' kolom aan je tabel toevoegen waarin je bijhoudt wanneer dat citaat is gebruikt. De waarde null kan dan aangeven dat een citaat nog niet eerder is gebruikt.
Als je een citaat uit de tabel wilt halen ga je als volgt te werk:
1) Je controleert of er een citaat is met de huidige datum als status.
Ja? Door naar 5.
Nee? Door naar 2.
2) Je kiest willekeurig een citaat uit de tabel waarvan de status nog op null staat.
Geen nog niet gebruikte citaten? Door naar 3.
Vrij citaat gevonden? Door naar 4.
3) Oude hergebruiken of op een andere manier afhandelen. Door naar 6.
4) Huidige datum in de tabel opslaan bij het gevonden citaat.
5) Citaat weergeven.
6) Klaar!
Edit:
Typen van dit verhaal duurde even wat langer. Ik ben te laat.
Bedankt voor de duidelijke uitleg iedereen! Maar hoe kan ik er eigenlijk voor zorgen dat er maar om de 7 dagen (168 uur of 10080 sec) een nieuw citaat getoond wordt ipv na elke refresh?
$result = mysql_query("select id,citaat from citaten where status='".date("o-W")."'") or die(mysql_error());
// we kijken hier of er een record is met flag jaar-week van dit
//moment (bijv: 2008-30)
if(mysql_num_rows($result) > 0) {
// Er bestaat een citaat met die flag (deze week is er dus een
//geselecteerd en die geven we dan ook weer
echo mysql_result($result,0,1);
} else {
// we moeten er nog een selecteren
$res = mysql_query("SELECT id,citaat from citaten where status= '0' order by rand() LIMIT 1,1") or die(mysql_error());
$id = mysql_result($res,0,0);
// als we een nieuwe selecteren moeten we dus ook aan de db
//laten weten dat we dit doen
mysql_query("update citaten set status='".date("o-W")."' where id=".$id) or die(mysql_error());
//nieuw citaat weergeven
echo mysql_result($res,0,1);
}
Jou oplossing gaat er van uit dat je in je db al direct aan elk citaat een week meegeeft, het alternatief is een volledig random systeem, het is normaal dat je bij het laatste een beetje meer van je systeem vraagt.
Verder zei ik ook dat de cronjob netter was: je moet slechts 1 lijn code hebben voor 1 citaat weer te geven. Is niet beter/sneller, enkel netter
<?php
include 'databaseverbinding.php';
$query = "SELECT id,citaat,auteur,status FROM citaten where status='1' ORDER BY RAND() LIMIT 0,1";
$result = mysql_query($query) or die (mysql_error());
if (mysql_num_rows($result) >= 1) {
$citaatID = mysql_result($result, 0, 0);
mysql_query("UPDATE citaten set status='0' where status='2'");
mysql_query("UPDATE citaten set status='2' where id = ".$citaatID);
}
$query2 = "SELECT * FROM citaten where status='2' LIMIT 0,1";
$result2 = mysql_query($query2) or die (mysql_error());
if (mysql_num_rows($result2) >= 1) {
while ($tabel =mysql_fetch_assoc($result2)){
$citaat = $tabel['citaat'];
$auteur = $tabel['auteur'];
echo $citaat;
echo '<br />';
echo $auteur;
}
}
?>
<?php
include'databaseverbinding.php';
$query="SELECT id,citaat,auteur,status FROM citaten where status='1' ORDER BY RAND() LIMIT 0,1";
Het werkt prefect maar hierbij wordt na elke refresh een nieuw citaat weergegeven, dit zou pas na een week moeten... Ik dacht aan cookies maar die gebruik ik niet zo graag, is er geen ander alternatief?