Geburtstagsscript - Geburtsjahr mit date() abgleichen

fixxxxxi

Erfahrenes Mitglied
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()."'");
	}
	
?>
 
Nein. Das die Mail ja nur an User verschickt werden soll, welche heute Geburtstag haben. Dafür muss ja das aktuelle Datum mit dem, welches der User eingetragen hat abgegelichen werden.

Da aber das Datum nicht als timestamp sondern in dem Format "1982-05-15 00:00:00" eingetragen wird, weiß ich nicht, wie ich das abgleichen soll.
 
PHP:
<?php
$array = explode(' ', $timestamp); // Trennen von YY-MM-DD und hh:mm:ss
$array = explode('-', $array[0]); // Jahr - Monat - Tag
list($jahr, $monat, $tag) = $array;
$unix = mktime(0, 0, 0, $monat, $tag, $jahr); // Erzeugen des UNIX-Zeitstempel für den Tag
?>

Und jetzt kannst du die UNIX-Zeitstempel vergleichen (kann dir nicht sagen, ob das wirklich geht - habe das hier nur gerade niedergeschrieben).
 
PHP:
<?php
$array = explode(' ', $timestamp); // Trennen von YY-MM-DD und hh:mm:ss
$array = explode('-', $array[0]); // Jahr - Monat - Tag
list($jahr, $monat, $tag) = $array;
$unix = mktime(0, 0, 0, $monat, $tag, $jahr); // Erzeugen des UNIX-Zeitstempel für den Tag
?>

Und jetzt kannst du die UNIX-Zeitstempel vergleichen (kann dir nicht sagen, ob das wirklich geht - habe das hier nur gerade niedergeschrieben).

Warum so umständlich?

PHP:
echo strtotime("2009-04-14 21:28:00");
 
Hi,

Da aber das Datum nicht als timestamp sondern in dem Format "1982-05-15 00:00:00" eingetragen wird, weiß ich nicht, wie ich das abgleichen soll.

Dann lies halt Monat und Tag aus dem Datumsfeld aus und vergleiche das mit Monat und Tag des aktuellen Datums. Dazu brauchst Du das auch nicht per PHP zu zerlegen, MySQL bietet eine umfangreiche Sammlung von Datums- und Zeitfunktionen an.

LG
 
Ich hab die gesammt PHP nun noch etwas abgewandelt. Nun sieht sie so aus:

PHP:
<?php
	  
  $get_user=safe_query("SELECT nickname, birthday, email FROM ".PREFIX."user" );
  $data_user=mysql_fetch_assoc($get_user); 
 
 	$datum_heute=date("m-d");  
  $datum_gebuser=date("m-d", $get_user[birthday]); 
	
	$get_setting=safe_query("SELECT last_bd_mail FROM ".PREFIX."settings");
	$data=mysql_fetch_assoc($get_setting);
	$now=time();


//  nur beim ersten benutzer!
//	
//	if($data['last_bd_mail']<$now && (date("d",$data['last_bd_mail'])!=date("d"))){
//		ignore_user_abort(1);

	
		if($datum_gebuser==$datum_heute){

//	  $test='1';		
//    if ($test='1'){

			$betreff="Happy Birthday";
			$nachricht="Alles Gute zum Geburtstag wünschen Dir die Admins  von ".$hp_url;
			$sender      = $admin_email;
			$empfaenger  = $admin_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);
		}
		else{
			$fp='nichts machen!';
		}	
		safe_query("UPDATE ".PREFIX."settings SET last_bd_mail='".time()."'");

//}
	
?>

In der Datenbank habe ich aus die Spalte nun auf "Date" gestellt, da ja eine Zeit nicht benötigt wurde. Somit sieht das Geburtstagsdatum in der Datenbnk nun nur noch so aus: "1982-05-15".

Die PHP funktioniert wunderbar, wenn ich das
PHP:
//	  $test='1';		
//    if ($test='1'){
an Stelle von
PHP:
		if($datum_gebuser==$datum_heute){
aktiviere. Aber das ist ja nicht Sinn der Sache. Ich habe nun wirklich die ganz eZeit rungefummelt und bekomme es einfach nicht hin beide Datumsangaben zu vergleichen.

Ich benötige lediglich den richtigen Codeschnipsel für
PHP:
 	$datum_heute=date("m-d");  
  $datum_gebuser=date("m-d", $get_user[birthday]);

Kann sich nicht jemand der Sache für mich aneignen? Ich bin am verzweifeln^^
 
Zuletzt bearbeitet:
PHP:
<?php
$heute_d=date("d");
$heute_m=date("m");  
$gebuser_d=date("d", $get_user['birthday']);
$gebuser_m=date("m", $get_user['birthday']);

if($heute_d == $gebuser_d && $heute_m == $gebuser_m)
 {
  // Wird ausgeführt, wenn derjenige Geburtstag hat
 }
So müsste es gehen.
 
PHP:
 <?php
	  
  $get_user=safe_query("SELECT nickname, birthday, email FROM ".PREFIX."user" );
  $data_user=mysql_fetch_assoc($get_user); 
 
  $heute_d=date("d");
  $heute_m=date("m");  
  $gebuser_d=date("d", $get_user['birthday']);
  $gebuser_m=date("m", $get_user['birthday']);
	
	$get_setting=safe_query("SELECT last_bd_mail FROM ".PREFIX."settings");
	$data=mysql_fetch_assoc($get_setting);
	$now=time();


//  nur beim ersten benutzer!
//	
//	if($data['last_bd_mail']<$now && (date("d",$data['last_bd_mail'])!=date("d"))){
//		ignore_user_abort(1);

// 	     $test='1';		
//   if ($test='1'){
 
if($heute_d == $gebuser_d && $heute_m == $gebuser_m) {

			$betreff="Happy Birthday";
			$nachricht="Alles Gute zum Geburtstag wünschen Dir die Admins  von ".$hp_url;
			$sender      = $admin_email;
			$empfaenger  = $admin_email;		
			$trenner = md5(uniqid(time()));
			$header  = "From: $sender\n";
			$header .= 'MIME-Version: 1.0';
			$header .= "\nContent-Type: text/plain; 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 .= 'Content-Transfer-Encoding: 8bit';
			$header .= "\n\n$nachricht\n--$trenner\nContent-Type: text/plain; \n";
			$header .= "\n--$trenner--";		
			mail($empfaenger, $betreff, $nachricht, $header);
		}
		else{
			$fp='nichts machen!';
		}	
		safe_query("UPDATE ".PREFIX."settings SET last_bd_mail='".time()."'");

//}
	
?>

t leider nicht... warum auch immer, dabei sieht es so wie es jetzt ist so aus als müsste es gehen, aber trotzdem danke!
 
Zurück