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?
$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
$subject="activiteit toegevoegd in agenda";//subject
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:
<?php
$query = "SELECT id, naam, email FROM activiteiten WHERE DATE_SUB(NOW(),INTERVAL 3 DAY) <= aangemaakt";
$result = mysql_query($query) or die (mysql_error());
while ($row = mysql_fetch_assoc($result))
{
$query2 = "UPDATE activiteiten SET reminder = 1 WHERE id = ".$row['id'];
$result2 = mysql_query($query2) or die (mysql_error());
// mail aanmaken en versturen
}
?>
<?php
$query="SELECT id, naam, email FROM activiteiten WHERE DATE_SUB(NOW(),INTERVAL 3 DAY) <= aangemaakt";
$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");
$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)
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.
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.
<?php
// alle activititeiten ophalen die ouder zijn dan 3 dagen vanaf toevoegen.
$query = "SELECT id, naam, email FROM activiteiten WHERE DATE_SUB(NOW(),INTERVAL 3 DAY) <= aangemaakt AND reminder = 0";
$result = mysql_query($query) or die (mysql_error());
//alle activiteiten die van toepassing zijn verwerken.
while ($row = mysql_fetch_assoc($result))
{
// elke activiteit updaten zodat het systeem weet van welke activiteit reeds een mail gestuurd is.
$query2 = "UPDATE activiteiten SET reminder = 1 WHERE id = ".$row['id'];
$result2 = mysql_query($query2) or die (mysql_error());
// mail aanmaken en versturen (jouw code dus)
}
?>
<?php
// alle activititeiten ophalen die ouder zijn dan 3 dagen vanaf toevoegen.
$query="SELECT id, naam, email FROM activiteiten WHERE DATE_SUB(NOW(),INTERVAL 3 DAY) <= aangemaakt AND reminder = 0";
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.
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?
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.