login  Naam:   Wachtwoord: 
Registreer je!
 Forum

cronjob voor agenda

Offline Gust - 17/12/2009 20:23
Avatar van GustMySQL interesse Wanneer iemand een activiteit in een agenda toevoegt krijg ik daarvan een verwittiging. Ook de bezoeker krijgt dan een bedank-email met nogmaals de gegevens die hij heeft toegevoegd.

Maar een paar dagen voordat de activiteit is voorbijgestreeft zou ik graag hebben dat ie automatisch opnieuw een email krijgt, waarin staat dat zijn activiteit bijna voorbij is en dat ie een nieuwe kan toevoegen (om zo de agenda in gang te houden). hoe moet je dat doen?

Ik zou niet willen dat ie elke maand een email krijgt. alleen maar éénmalig als de activiteit is voorbijgestreefd. Gebeurt dit met een cronjob of moet dat toch anders? En als het met een cronjob moet, hoe moet je dit dan implementeren?

Dit is wat ik nu heb:

  1. // dit gedeelte wordt naar mij gestuurd
  2.  
  3. $Name = "mijnwebsite.be"; //senders name
  4. $email = " ". $emailadres . " "; //senders e-mail adress
  5. $recipient = "mijnwebsite@hotmail.com"; //recipient
  6. $mail_body = "Er heeft iemand een activiteit toegevoegd op " . $datum . " met als titel " . $titel . " www.mijnwebsite.be/agenda/agenda_aanpassen.php?id=" . $id . ""; //mail body
  7. $subject = "activiteit toegevoegd in agenda"; //subject
  8. $header = "From: ". $Name . " <" . $email . ">\r\n"; //optional headerfields
  9. mail($recipient, $subject, $mail_body, $header); //mail command <!-- s:) --><img src=\"{SMILIES_PATH}/mozilla_smile.png\" alt=\":)\" title=\":)\" /><!-- s:) -->
  10.  
  11. //onderaan wordt naar de verzender gestuurd
  12.  
  13. $Name = "mijnwebsite.be"; //senders name
  14. $email = "info@mijnwebsite.be"; //recipient
  15. $recipient = " ". $emailadres . " "; //senders e-mail adress
  16. $mail_body = "Beste\r\n
  17. Bedankt voor het aanmelden van een activiteit op Hoorn.be\r\n
  18. Dit zijn de aanmeldgegevens:
  19. op: " . $datum . "
  20. titel: " . $titel . "
  21. groep: " . $groep . "
  22. adres: " . $adres . "
  23. url: " . $url . "
  24. beschrijving: " . $beschrijving . "\r\n
  25. U kan alle activiteiten bekijken op www.hoorn.be/agenda\r\n
  26. Met vriendelijke groeten,
  27. mijnwebsite.be"; //mail body
  28. $subject = "mijnwebsite.be - activiteit toegevoegd"; //subject
  29. $header = "From: ". $Name . " <" . $email . ">\r\n"; //optional headerfields
  30. mail($recipient, $subject, $mail_body, $header); //mail command <!-- s:) --><img src=\"{SMILIES_PATH}/mozilla_smile.png\" alt=\":)\" title=\":)\" /><!-- s:) -->
  31. Vertel mij geen onzin!
  32. http://www.modderaars.be
  33. http://www.hoorn.be

8 antwoorden

Gesponsorde links
Offline Stefan14 - 17/12/2009 20:39 (laatste wijziging 17/12/2009 20:53)
Avatar van Stefan14 PHP gevorderde Dit is iets wat ik inderdaad door een cronjob zou laten doen. Er is nog een andere mogelijkheid, maar dat zou ik hier niet doen.

Ik zou een extra veld in je tabel met activiteiten aanmaken waarin je bijhoudt of de mail gestuurd is of niet. En dan kun je een query uitvoeren zoals:

  1. <?php
  2. $query = "SELECT id, naam, email FROM activiteiten WHERE DATE_SUB(NOW(),INTERVAL 3 DAY) <= aangemaakt";
  3. $result = mysql_query($query) or die (mysql_error());
  4.  
  5. while ($row = mysql_fetch_assoc($result))
  6. {
  7. $query2 = "UPDATE activiteiten SET reminder = 1 WHERE id = ".$row['id'];
  8. $result2 = mysql_query($query2) or die (mysql_error());
  9.  
  10. // mail aanmaken en versturen
  11. }
  12. ?>
Offline Gust - 17/12/2009 20:42
Avatar van Gust MySQL interesse Dat klinkt goed, alleen sukkel ik met dit te implementeren in mijn huidige query, die gaat als volgt:
  1. $query = mysql_query("SELECT id, datum, uur, titel, groep, beschrijving, land, adres, url, afbeelding, DATEDIFF(NOW(), datum) FROM activiteiten where datum > curdate()-1 order by datum, uur");


Deze code zorgt ervoor dat de activiteiten die voorbij zijn niet meer getoond worden (maar ze staan in werkelijkheid wel nog in de database)
Offline Stefan14 - 17/12/2009 20:53 (laatste wijziging 17/12/2009 20:54)
Avatar van Stefan14 PHP gevorderde Het gaat in je cronjob er niet om, om de activiteiten te tonen, je moet een id hebben om de regel te kunnen updaten en je moet een e-mail adres hebben van degene die het heeft ingevoerd. Dus ik denk dat je mijn code bijna letterlijk kunt gebruiken. Gewoon even kijken wat voor velden je in je db hebt.

Eventueel nog een extra (sub)query aanmaken om het e-mail adres uit een aparte usertabel te halen.

Aangezien de cronjob in een apart bestand komt te staan en niet aan een bezoeker getoond gaat worden heb je niets te maken met je huidige reeds bestaande query's.
Offline Gust - 17/12/2009 21:21
Avatar van Gust MySQL interesse Die cronjob moet dus niet in dezelfde pagina waarin bovenstaande code staat? Het is dus een aparte pagina?

Is die id dezelfde id als in de huidige tabel, of moet je daarvoor een nieuwe tabel aanmaken?
Offline Stefan14 - 17/12/2009 21:41 (laatste wijziging 17/12/2009 21:42)
Avatar van Stefan14 PHP gevorderde Als ik eerlijk ben krijg ik het idee dat je niet weet wat een cronjob is.

Een cronjob is een functie die een bepaalde pagina aanroept op een vast tijdstip of vaste tijdstippen.
Het script dat deze emails moet versturen zet je dus in een aparte php pagina die je dan m.b.v. de cronjob aanroept.

Zou je deze code in je huidige pagina zetten die voor het weergeven zorgt, dan wordt deze code iedere keer als iemand de pagina bezoekt uitgevoerd, iets wat je in dit geval niet wil.

De code die ik gegeven heb, is hiervoor bijna letterlijk bruikbaar (afhankelijk van je database opbouw)

Je hoeft geen extra tabel aan te maken, maar wel in je huidige tabel een extra veld waarin je kunt opslaan of de e-mail reeds is verstuurd. (de update query in de while)
De id's blijven dan uiteraard ook hetzelfde.

Dezelfde code, maar nu met wat meer uitleg:
  1. <?php
  2. // alle activititeiten ophalen die ouder zijn dan 3 dagen vanaf toevoegen.
  3. $query = "SELECT id, naam, email FROM activiteiten WHERE DATE_SUB(NOW(),INTERVAL 3 DAY) <= aangemaakt AND reminder = 0";
  4. $result = mysql_query($query) or die (mysql_error());
  5.  
  6. //alle activiteiten die van toepassing zijn verwerken.
  7. while ($row = mysql_fetch_assoc($result))
  8. {
  9. // elke activiteit updaten zodat het systeem weet van welke activiteit reeds een mail gestuurd is.
  10. $query2 = "UPDATE activiteiten SET reminder = 1 WHERE id = ".$row['id'];
  11. $result2 = mysql_query($query2) or die (mysql_error());
  12.  
  13. // mail aanmaken en versturen (jouw code dus)
  14. }
  15. ?>


Je kunt die 3 dagen naar eigen inzicht aanpassen, wanneer alle activiteiten een afwijkende looptijd hebben, dan moet je eigenlijk de einddatum opslaan en aan de hand daarvan werken.

Heb ook nog even een klein foutje weggewerkt, had in de select query nog geen rekening gehouden met het veld reminder en zou dan dus oneindig mails blijven sturen.
Offline Gust - 17/12/2009 22:05
Avatar van Gust MySQL interesse Ok, ik plaats deze code in een nieuwe pagina, en noem hem cronjob.php. Hoe wordt die pagina dan opgeroepen? Gaat deze automatisch open zodra de agenda bezocht wordt?
Offline Ultimatum - 17/12/2009 22:55
Avatar van Ultimatum PHP expert Nee, je moet op de server een cronjob maken, daar moet je instellen welke pagina die oproept en op welke dagen en tijdstippen de cronjob moet worden uitgevoerd. Dit kan meestal wel via de admin panel als je een betaalde host hebt. Ik weet niet precies hoe het werkt omdat ik er nog nooit mee gewerkt hebt. Maar vraag dit aan je hoster of zoek op internet.

Als je het alleen lokaal draait moet je even op google zoeken hoe je lokaal cronjobs kan runnen.
Offline Gust - 18/12/2009 12:51 (laatste wijziging 18/12/2009 12:52)
Avatar van Gust MySQL interesse Via mijn host gaat dit blijkbaar ook:

klik hier om de afbeelding van de cronjob te zien

[img]http://www.hoorn.be/images/cronjob.jpg[/img]
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.215s