Antworten auf deine Fragen:
Neues Thema erstellen

Geburtstagsskript

koma05

Aktives Mitglied

Hallo.
Habe ein Problem mit meinem selbstgeschriebenen Geburtstagsskript.
Es funktioniert perfekt - nur der Jahreswechsel und der 1.1. bereitet Probleme.
Zur Funtionsweise:
Der Geburtstags-Newsletter wird immer Sonntagabend per Cronjob versendet. In der E-Mail sind dann die alle User der folgenden Woche aufgelistet. So schaut die Ausgabe in der E-Mail aus:
Kommende Woche haben folgende User Geburtstag:

Montag 29.12.

-


Dienstag 30.12.

-


Mittwoch 31.12.

Vorname Name (47)


Donnerstag 1.1.

Vorname Name (19)


Freitag 2.1.

-


Samstag 3.1.

Vorname Name (29)


Sonntag 4.1.

-

Der User, welcher am 31.12. angezeigt wird hat am 1.1. Geburtstag und der am 1.1. hat am 2.1..


Hier der PHP-Code:
PHP:
$sql = "SELECT * FROM dbtab order by gebdat asc";

$result = @mysql_query($sql);
if (!$result) {
    die('Ungültige Abfrage: ' . mysql_error());
}
  
$wotage['Montag'] = $wotage['Dienstag'] = $wotage['Mittwoch'] = $wotage['Donnerstag'] = $wotage['Freitag'] = $wotage['Samstag'] = $wotage['Sonntag'] = array();
$email = array();
$tagneu = $monatneu = 0;
$runder = array(20, 30, 40, 50, 60, 70, 80, 90, 100, 110); //die runden werden fett dargestellt
$mon = $die = $mit = $don = $fre = $sam = $son = array();


//datum + 7
$tag7 = intval(date("d")) + 7; // 1 woche
$monat7 = intval(date("m"));
$neuermonat = false;
$monatmax = date("t");

if ($tag7 > date("t")) {
    $neuermonat = true;
    $tagneu = $tag7 - date("t");
    $monatneu = date('n', time()) + 1;
    if ($monatneu > 12) { $monatneu = 1; }
}


while ($row = @mysql_fetch_array($result)) {
  
    $exp = explode("-", $row['gebdat']);

    $gebdat = $exp[2].".".$exp[1].".".$exp[0];  
    $tag = $exp[2];
    $monat = $exp[1];
  
  
    if (($row['email']) && ($row['emailja'] == 1)) {
        array_push($email, $row['email']);
    }  

    //prüfen wer gebtag hat
    if (
        ( ($tag > date("j")) and ($tag <= $tag7) and ($monat == $monat7) )  // aktueller monat
        or
        ( ($neuermonat == true) and  ($monat == $monatneu) and ($tag <= $tagneu)   ) // monat + 1
       )
  
    {  
  

        $gebjahr = (int) substr($row['gebdat'], 0, 4);
      
        $alter = date('Y', time()) - $gebjahr;
      
        if (in_array($alter, $runder)) {
            $alter = " <b>(" . $alter . ")</b>";
        }
        else {
            $alter = " (" . $alter . ")";
        }
      
        //wochentag ermitteln Son = 0, Mon = 6, ....
        $wotag = date("w", mktime(0,0,0, $exp[1], $exp[2], date('Y', time())));
   
       //array der wochentage mit den geburtstagskindern füllen
        switch ($wotag)
        {
            case 1 : $wotage['Montag'][]     = $row['vname'] . " " . $row['nname'] . $alter; break;
            case 2 : $wotage['Dienstag'][]   = $row['vname'] . " " . $row['nname'] . $alter; break;
            case 3 : $wotage['Mittwoch'][]   = $row['vname'] . " " . $row['nname'] . $alter; break;
            case 4 : $wotage['Donnerstag'][] = $row['vname'] . " " . $row['nname'] . $alter; break;
            case 5 : $wotage['Freitag'][]    = $row['vname'] . " " . $row['nname'] . $alter; break;
            case 6 : $wotage['Samstag'][]    = $row['vname'] . " " . $row['nname'] . $alter; break;
            case 0 : $wotage['Sonntag'][]    = $row['vname'] . " " . $row['nname'] . $alter; break;
        }
              
    }//if  

}//while

Ausgabe:
PHP:
$gebtagmsg="<table>";

$z=0;
$tage=array("Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag","Sonntag");
$wochentag1=$wochentag2=$wochentag=array();


for ($i = 1; $i <= 7; $i++) {

    if ($i > date("N")) {

        $wochentag2[] = $tage[$i-1];
    }
    else
    {

        $wochentag1[] = $tage[$i-1];
    }  
}

$wochentag = array_merge($wochentag2, $wochentag1);


foreach ($wochentag as $value) {

    $z++;
    $tag = date('d', time()) +$z;
  
    //prüfen ob beim hochzählen nicht die max. tage eines monats überschritten werden
    if ($tag > date('t', time())) {
        $tag = $tag - date('t', time());
        $monat = date('n', time()) + 1;
        if ($monat > 12) { $monat = 1; }
    }
    else
    {
        $monat = date('n', time()) ;
    }
  
    $gebtagmsg .= "<tr><td><b>$value</b>&nbsp;&nbsp;" . $tag. "." . $monat . ".</td></tr>";
    if (count($wotage[$value]) > 0) {
      
        foreach ($wotage[$value] as $nr => $inhalt)
        {
            $gebtagmsg .= "<tr><td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" . $inhalt . "</td></tr>";
        }
    }
    else
    {
        $gebtagmsg .= "<tr><td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-</td></tr>";
    }
    $gebtagmsg .= "<tr><td>&nbsp;</td></tr>";
}//foreach

Datenbank: id, nname, vname, gebdat, email
(Format gebdat yyyy-mm-dd)


Würde mich riesig freuen, wenn mir einer helfen kann den Neujahres-Fehler zu eliminieren.
 

Mereel

Aktives Mitglied

Ohne dein Skript jetzt auf die Schnelle genauer angeschaut zu haben: Womöglich liegt das Problem an der Sommer/Winterzeit? Da kommt es wegen der Stunde mehr/weniger gerne mal zu solchen Verschiebungen um einen Tag, wenn man nicht aufpasst.
 

koma05

Aktives Mitglied

Danke für die Tipps!
Denke, nun müsste es funktionieren.

Zuerst wird das Datum auf morgen gesetzt:
PHP:
$query4 = "SET @today = CURDATE() + INTERVAL 1 DAY; -- 13. - 19.
" or die("Error in the consult.." . mysqli_error($sqldb));

$result4 = $sqldb->query($query4);

Danach folgt das Herzstück. Die SQL-Abfrage:
PHP:
$query3 = "SELECT
*,
DATE_FORMAT(@today, '%Y') - DATE_FORMAT(gebdat, '%Y') + IF(
DATE_FORMAT(gebdat, '%m%d') < DATE_FORMAT(@today, '%m%d'), 1, 0) AS newage,
DATEDIFF(gebdat + INTERVAL YEAR(@today) - YEAR(gebdat) +
IF(DATE_FORMAT(@today, '%m%d') > DATE_FORMAT(gebdat, '%m%d'), 1, 0) YEAR,
@today) AS days_to_birthday,
WEEKDAY( CONCAT_WS('-',DATE_FORMAT(@today, '%Y'),DATE_FORMAT(gebdat, '%m-%d')) )  + IF(
DATE_FORMAT(gebdat, '%m%d') < DATE_FORMAT(@today, '%m%d'), 1, 0) as wd
FROM bce_mitglieder
HAVING days_to_birthday < 7 -- HAVING (days_to_birthday > 0 and days_to_birthday <= 7)
ORDER BY days_to_birthday ASC, newage DESC;"; //or die("Error in the consult.." . mysqli_error($sqldb));
$result3 = $sqldb->query($query3);

Alle Tests waren erfolgreich.
Auch als das Datum auf den diesjährigen 27.12. vorgestellt wurde:
PHP:
$query4 = "SET @today = '2015-12-27';

Müsste passen. Oder?
 
Bilder bitte hier hochladen und danach über das Bild-Icon (Direktlink vorher kopieren) platzieren.
Antworten auf deine Fragen:
Neues Thema erstellen

Willkommen auf PSD-Tutorials.de

In unseren Foren vernetzt du dich mit anderen Personen, um dich rund um die Themen Fotografie, Grafik, Gestaltung, Bildbearbeitung und 3D auszutauschen. Außerdem schalten wir für dich regelmäßig kostenlose Inhalte frei. Liebe Grüße senden dir die PSD-Gründer Stefan und Matthias Petri aus Waren an der Müritz. Hier erfährst du mehr über uns.

Stefan und Matthias Petri von PSD-Tutorials.de

Nächster neuer Gratisinhalt

03
Stunden
:
:
25
Minuten
:
:
19
Sekunden

Neueste Themen & Antworten

Flatrate für Tutorials, Assets, Vorlagen

Zurzeit aktive Besucher

Statistik des Forums

Themen
118.635
Beiträge
1.538.449
Mitglieder
67.556
Neuestes Mitglied
Ggirl
Oben