login  Naam:   Wachtwoord: 
Registreer je!
 Forum

citaat van de week (Opgelost)

Offline luchtpost - 10/07/2008 11:43 (laatste wijziging 10/07/2008 18:50)
Avatar van luchtpostPHP interesse 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.

16 antwoorden

Gesponsorde links
Offline Martijn - 10/07/2008 11:51
Avatar van Martijn Crew PHP je zet alle citaten in een array, en met array_rand kies je er 1 uit, die sla je op, en na een week maak je een nieuwe aan. Kan bv met een cronjob
Offline luchtpost - 10/07/2008 11:52
Avatar van luchtpost PHP interesse Ja, maar hij mag maar 1 keer dezelfde laten zien...
Offline Berten - 10/07/2008 11:52 (laatste wijziging 10/07/2008 12:03)
Avatar van Berten PHP beginner 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.

code cronjob: (2b)
  1. $query = "SELECT id,citaat FROM citaten where status='niet getoond' ORDER BY RAND() LIMIT 0,1";
  2. $result = mysql_query($query) or die (mysql_error());
  3. if (mysql_num_rows($result) >= 1) {
  4. $citaatID = mysql_result($res, 0, 0);
  5. mysql_query("UPDATE citaten set status='reeds getoond' where status='deze week'");
  6. mysql_query("UPDATE citaten set status='deze week' where id = ".$citaatID);
  7. }


De status flag is hier een String, ik raad je aan om hier eenvoudigweg 0,1,2 voor te gebruiken.
Offline Rik - 10/07/2008 11:56 (laatste wijziging 10/07/2008 11:57)
Avatar van Rik Gouden medailleGouden medaille

Crew algemeen
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.  
Offline luchtpost - 10/07/2008 13:59 (laatste wijziging 10/07/2008 14:04)
Avatar van luchtpost PHP interesse 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?
Offline Joost - 10/07/2008 14:58 (laatste wijziging 10/07/2008 14:59)
Avatar van Joost PHP expert Een combinatie van:
http://nl3.php.net/manual/en/function.date.php
met een Week ID in de database, voor elke citaat.

Dus

  1. $sql = mysql_query("SELECT `citaat` FROM `citaten` WHERE `week_id`='".date("W")."' LIMIT 1") or die(mysql_error());
Offline Berten - 10/07/2008 15:03 (laatste wijziging 10/07/2008 15:42)
Avatar van Berten PHP beginner Door het scriptje dat ik je gaf uit te voeren via een cronjob.

Als je geen gebruik kan maken van cron doe het dan zo (dit is niet de te verkiezen manier).

1. We gebruiken niet de 'reeds getoond' etc flag, maar ipv geven we alle citaten flag 0.
2. Als iemand op je site komt doe je het volgende:
  1. $result = mysql_query("select id,citaat from citaten where status='".date("o-W")."'") or die(mysql_error());
  2. // we kijken hier of er een record is met flag jaar-week van dit
  3. //moment (bijv: 2008-30)
  4. if(mysql_num_rows($result) > 0) {
  5. // Er bestaat een citaat met die flag (deze week is er dus een
  6. //geselecteerd en die geven we dan ook weer
  7. echo mysql_result($result,0,1);
  8. } else {
  9. // we moeten er nog een selecteren
  10. $res = mysql_query("SELECT id,citaat from citaten where status= '0' order by rand() LIMIT 1,1") or die(mysql_error());
  11. $id = mysql_result($res,0,0);
  12. // als we een nieuwe selecteren moeten we dus ook aan de db
  13. //laten weten dat we dit doen
  14. mysql_query("update citaten set status='".date("o-W")."' where id=".$id) or die(mysql_error());
  15.  
  16. //nieuw citaat weergeven
  17. echo mysql_result($res,0,1);
  18. }


Al je citaten zullen ofwel flag 0 hebben of je kan zien in welke week van welk jaar je ze hebt getoond op je site
Offline Joost - 10/07/2008 15:06
Avatar van Joost PHP expert Wanneer hij een database heeft met een citaat en een week_id volstaat dat van mij ook, daar zijn geen cronjobs voor nodig:)
Offline Berten - 10/07/2008 15:10
Avatar van Berten PHP beginner @ medieval

idd 'volstaat' het, had't in mijn oplossing ook al zo gedaan. 

Het blijft echter netter dit met een cronjob te doen.
Offline Joost - 10/07/2008 15:16
Avatar van Joost PHP expert Ik denk dat dat wel meevalt..
Mijn manier heeft minder MySQL Load.
Zolang de output hetzelfde blijft, maakt het toch niet echt uit?
Offline Berten - 10/07/2008 15:19
Avatar van Berten PHP beginner 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 
Offline luchtpost - 10/07/2008 15:37 (laatste wijziging 10/07/2008 15:39)
Avatar van luchtpost PHP interesse Beste Berten,
Ik heb idd uw cronjob gebruikt: (0 = reeds getoond, 1 = nog niet getoond en 2 = citaat van de week)

  1. <?php
  2. include 'databaseverbinding.php';
  3.  
  4. $query = "SELECT id,citaat,auteur,status FROM citaten where status='1' ORDER BY RAND() LIMIT 0,1";
  5. $result = mysql_query($query) or die (mysql_error());
  6. if (mysql_num_rows($result) >= 1) {
  7. $citaatID = mysql_result($result, 0, 0);
  8. mysql_query("UPDATE citaten set status='0' where status='2'");
  9. mysql_query("UPDATE citaten set status='2' where id = ".$citaatID);
  10. }
  11.  
  12. $query2 = "SELECT * FROM citaten where status='2' LIMIT 0,1";
  13. $result2 = mysql_query($query2) or die (mysql_error());
  14. if (mysql_num_rows($result2) >= 1) {
  15. while ($tabel =mysql_fetch_assoc($result2)){
  16. $citaat = $tabel['citaat'];
  17. $auteur = $tabel['auteur'];
  18. echo $citaat;
  19. echo '<br />';
  20. echo $auteur;
  21. }
  22. }
  23. ?>


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?
Offline Berten - 10/07/2008 15:40 (laatste wijziging 10/07/2008 15:43)
Avatar van Berten PHP beginner zie mijn laatste post met code, die moet je gewoon neerplaatsen op de plaats waar je het citaat wil laten zien.

je moet wel eerst even alle statussen op 0 zetten in de databank


Verder moet je ook even Ontani's reactie lezen, het zou moeten werken.
Offline Ontani - 10/07/2008 15:40
Avatar van Ontani Gouden medailleGouden medailleGouden medailleGouden medaille

-1
Als je dat script via een cronjob laat uitvoeren zal dit maar 1 x per week gebeuren. ALs je je tijd juist instelt tenminste.
Offline Joost - 10/07/2008 15:45
Avatar van Joost PHP expert Ik denk dat je niet weet wat een cronjob is, aangezien je zegt:
Ik heb idd uw cronjob gebruikt:

Een uitgebreide beschrijving daarvan staat op http://www.cronjob.nl
Offline luchtpost - 10/07/2008 17:17 (laatste wijziging 10/07/2008 18:25)
Avatar van luchtpost PHP interesse ah zo...

Jammer genoeg kan ik geen cronjob gebruiken volgens mijn host (one.com)

Slim bedacht Berten. Dankjewel!
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.227s