• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

Geburtstagsscript - Geburtsjahr mit date() dabgleichen

fixxxxxi

New member
Hallo,

ich hab ein Script geschrieben, bzw. bin dabei, welches eine Geburtstagsmail an alle User schicken soll, welche heute Geburtstag haben. Wichtig dabei war mir, dies nicht via Cronejob zu lösen, da nicht alle CMS-Nutzer soetwas nutzen können.

Das ganz funktioniert so, das dieses Geburtstagsscript in der index.php included wird, und so beim Betreten des ersten Surfers auf der Website ausgeführt wird.

In der Datenbank ist der Geburtstag wie folgt eingetragen "1982-05-15 00:00:00" Das Problem was ich vorerst habe ist, dass das Geburtsjahr und das aktuelle Jahr ja verschieden ist, und ich nicht weiß, wie ich das lösen kann.

Vllt kann auch jemand irgendetwas zum restlichen Teil der PHP sagen, ob sich irgendwelche Fehler eingeschlichen haben, da ich es noch in keinster Weise ausprobiert habe.

Meine PHP sieht im Moment so aus:

PHP:
<?php

  //datum ermitteln
  $datum_heute = date("Y.m.d 00:00:00");
  
  //daten der user abfragen
	$get_user=safe_query("SELECT nickname, birthday, email FROM ".PREFIX."user WHERE birthday='$datum_heute'" );
	$data_user=mysql_fetch_assoc($get_user);
	
  //letzte  mailausführung abfragen
  $get_setting=safe_query("SELECT last_bd_mail FROM ".PREFIX."settings");
	$data2=mysql_fetch_assoc($get_setting);
	$now=time();
	if($data2['last_bd_mail']<$now && (date("d",$data2['last_bd_mail'])!=date("d"))){
		ignore_user_abort(1);
		
	//email aussehen
			$betreff="Happy Birthday $data_user['nickname']";
			$nachricht="Alles Gute zum Geburtstag wünschen Dir die Admins von ".$hp_url;
			$sender      = $admin_email;
			$empfaenger  = $data_user['email'];		
			$trenner = md5(uniqid(time()));
			$header  = "From: $sender\n";
			$header .= 'MIME-Version: 1.0';
			$header .= "\nContent-Type: multipart/mixed; boundary=$trenner\n\n";
			$header .= 'This is a multi-part message in MIME format';
			$header .= "\n--$trenner\n";
			$header .= 'Content-Type: text/plain';
			$header .= "\n";
			$header .= "\n--$trenner--";		
			mail($empfaenger, $betreff, $nachricht, $header);
			
	//mailausführung eintragen
	safe_query("UPDATE ".PREFIX."settings SET last_bd_mail='".time()."'");
	}
	
?>
 
Also, wenn überhaupt, würd' ich die Daten (Datum+Uhrzeit) in Unix-Zeitstempel umwandeln, bevor die in der Datenbank abgelegt werden. Dann können alle mathematischen Operationen leicht bewältigt werden.
Verständnisfrage: soll jeder Benutzer, der die Website betritt, den Vorgang auslösen oder nur registrierte User nach Anmeldung?
Übrigens vermute ich, dass nach dem jetzigen Muster jedesmal eine Mail in Auftrag gegeben wird, weil 'last_bd_mail' immer ungleich 'date("d")' sein wird - dir fehlt so 'ne Art Zähler...
 
Also, wenn überhaupt, würd' ich die Daten (Datum+Uhrzeit) in Unix-Zeitstempel umwandeln, bevor die in der Datenbank abgelegt werden.
Für Geburtstage nicht wirklich sinnvoll, da Unixtimestamp erst ab 1970 los geht. Da gibts noch einige die etwas früher geboren sind. Rechnen ist für die Geburtstagsermittlung auch nicht gerade das einfachste, da du ja die Jahre rausrechnen mußt.
Wenn du den Datentyp Datetime für die birthday-spalte verwendest, kannst du das so machen:

SELECT * FROM `user`
WHERE
(MONTH(`birthday`) = MONTH(CURRENT_DATE()) AND DAY(`birthday`) = DAY(CURRENT_DATE()))
OR
(MONTH(CURRENT_DATE()) = 2 AND DAY(CURRENT_DATE()) = 28 AND MONTH(`birthday`) = 2 AND DAY(`birthday`) = 29)
Der zweite Teil ist für die die am 29.2 geboren sind. Weiß aber nicht ob die am 28 oder am 1.3 feiern. Für letzteres müßte die Abfrage angepasst werden.
 
Zuletzt bearbeitet:
ZeitGeist schrieb:
Für Geburtstage nicht wirklich sinnvoll, da Unixtimestamp erst ab 1970 losgeht.
Natürlich vollkommen richtig, klar gibt's auch Ältere!
Hab's verwechselt, benutz's immer um zwei Daten voneinander zu subtrahieren, z.B. um festzustellen wann etwas starten soll... war wohl schon zu spät ;-)
 
Zurück
Oben