Zur Navigation

Formular absenden und Geburtstag auslesen [4]

31 tobi

wenn ich nun:
ORDER BY geburtsmonat, geburtstag, YEAR(geburtsdatum)";
dann ändert sich nichts.

wenn ich nun so abfrage:
ORDER BY YEAR(geburtsdatum), geburtsmonat, geburtstag";
dann beginnt die auflistung vom ältesten zum jüngsten (mal januar mal dezember, querbeet)

27.11.2010 18:41

32 Jörg Kruse

Zitat von tobi
wenn ich nun:
ORDER BY geburtsmonat, geburtstag, YEAR(geburtsdatum)";
dann ändert sich nichts.

Schon klar und macht irgendwo auch keinen rechten Sinn, als letztes nach dem Jahr zu sortieren?

wenn ich nun so abfrage:
ORDER BY YEAR(geburtsdatum), geburtsmonat, geburtstag";
dann beginnt die auflistung vom ältesten zum jüngsten (mal januar mal dezember, querbeet)

OK, wir benötigen hier auch wieder das Jahr, in dem der nächste Geburtstag anfällt und nicht das Jahr, in welchem der User geboren ist. Das hatten wir ja schon an anderer Stelle:

IF(MONTH(geburtsdatum) < MONTH(CURDATE()), YEAR(CURDATE()) + 1, YEAR(CURDATE()))

Da dieser Ausdruck wohl nun schon mehrmals in der Query vorkommt, könntest du ihn auch mitselektieren und ihm dabei einen Alias verpassen, auf den du später zugreifen kannst (so wie im Falle von geburtstag und geburtsmonat) - das macht die Query zum einen leichter zu lesen und MySQL hat zum anderen so weniger zu rechnen

28.11.2010 00:44 | geändert: 28.11.2010 00:45

33 tobi

Super, ich danke dir recht herzlich für die schnelle und kompetente Hilfe.

30.11.2010 19:15

... 1 Jahr und 3 Monate später ...

34 tobi

Hallo,

nach knapp 1,5 Jahren möchte ich dies nochmals aufgreifen. Ist es möglich, das Ganze auf wöchentlich umzubauen?
Der Newsletter soll wöchentlich erscheinen und es sollen nur die Geburtstagskinder der kommenden Woche (evtl der darauffolgenden Woche) und auch nur die, die einen solchen Geburtstag feiern: 30,40,50,55,60,65,70,75,80,85,90

aktuell schaut dies so aus:
<?php
$monate = array(
1=>"Januar",
2=>"Februar",
3=>"März",
4=>"April",
5=>"Mai",
6=>"Juni",
7=>"Juli",
8=>"August",
9=>"September",
10=>"Oktober",
11=>"November",
12=>"Dezember");

$monat1 = date("n") + 1;
if ($monat1 > 12) {
    $monat1 -= 12;
}

$monat2 = date("n") + 2;
if ($monat2 > 12) {
    $monat2 -= 12;
}

$Empfaenger = "Tob <email@tob.de>,";
$Empfaenger .= "Test <test@test.de>,";


$Betreff = "Aktuelle Geburtstagskinder des TTC`s der kommenden Monate: $monate[$monat1] und $monate[$monat2]";

$Nachricht = "
<html>
<head>
   <meta http-equiv=\"Content-Type\" content=\"text/html; charset=iso-8859-1\">
   <title>Geburtstage</title>
   <style type=\"text/css\" media=\"screen\">
      body
      {
      font-family:Verdana, Arial, Helvetca, sans-serif;
      font-size:13px;
      background-color:#E8E8E8;
      text-align:left;
      }

      h1 {font-size:13px;color:#000000;}

      /* Der Kopfbereich */
      #kopf {
      height:150px;
      padding:0px;
      border-bottom:1px solid #000000;
      }
      
      /* Main-Teil */
      #main {
      padding:10px;
      font-family:Verdana, Arial, Helvetca, sans-serif;
      font-size:14px;
      background-color:#E8E8E8;
      }
      
   
      /* Tabelle Eigenschaften bei Gesamtspielplan 100% */
      .table_gesamtspielplan_100{
      margin:auto;
      width:100%;
      border-collapse:collapse;
      border:1px solid #000000;
      padding: 3px;
      font-family:Verdana, Arial, Helvetca, sans-serif;
      font-size:13px;
      }

      /* Tabelle Eigenschaften bei Ausw峴sfahrten bei th*/
      .table_gesamtspielplan{
      border:1px solid #000000;
      padding: 3px;
      text-align:left;
      }   

      /* Links allgemein - Link Angaben 1 */
      a.links {
      font-size:15px;
      text-decoration:underline;
      }

      /* Links allgemein - Link Angaben 2 */
      a.links:visited {
      font-size:15px;
      text-decoration:underline;
      }

      /* Links allgemein - Link Angaben 3 */
      a.links:hover {
      font-size:15px;
      text-decoration:underline;
      }
      
      /* Mailto - Link Angaben 1 */
      a.mailto {
      font-size:15px;
      text-decoration:underline;
      }
      
      /* Mailto - Link Angaben 2 */
      a.mailto:visited {
      font-size:15px;
      text-decoration:underline;
      }

      /* Mailto - Link Angaben 3 */
      a.mailto:hover {
      font-size:15px;
      text-decoration:underline;
      }
   
   </style>

</head>
<body>
";

//Datenbank verbinden
include ("../../zugang.php.inc");


$Nachricht .= "

<div style=\"width:698px;text-align:left;border:solid 3px #000000;\">
   <div id=\"kopf\">
      <img src=\"http://mailversand.tobsp.de/mailversand/mail_header.jpg\" width=\"698\" height=\"150\" alt=\"Mail Header\">
   </div>
         <div id=\"main\">
            <p>&ensp;Hallo zusammen, <br /><br />&ensp;hier die aktuellen Geburtstagskinder des TTC`s der nächsten 2 Monate:<br />&ensp;<b>$monate[$monat1] und $monate[$monat2]</b></p>
            ";
         
            //sql1 Befehl         
            $sql = "
            SELECT id, name, vorname, geburtsdatum, (IF(MONTH(geburtsdatum) < MONTH(CURDATE()), YEAR(CURDATE()) + 1, YEAR(CURDATE())) - YEAR(geburtsdatum)) AS `alter`, DAYOFMONTH(geburtsdatum) AS geburtstag, MONTH(geburtsdatum) AS geburtsmonat
            FROM geburtstagsliste
            WHERE CONCAT(IF(MONTH(geburtsdatum) < MONTH(CURDATE()), YEAR(CURDATE()) + 1, YEAR(CURDATE())), DATE_FORMAT(geburtsdatum, '%m')) BETWEEN PERIOD_ADD(DATE_FORMAT(CURDATE(), '%Y%m'), 1) AND PERIOD_ADD(DATE_FORMAT(CURDATE(), '%Y%m'), 2)
            ORDER BY IF(MONTH(geburtsdatum) < MONTH(CURDATE()), YEAR(CURDATE()) + 1, YEAR(CURDATE())), geburtsmonat, geburtstag";

            
            
            $db_erg = mysql_query( $sql );
            if ( ! $db_erg )

            {
            die('Ungültige Abfrage: ' . mysql_error());
            }
            
            function date_mysql2german($date) {
            $d    =    explode("-",$date);
   
            return    sprintf("%02d.%02d.", $d[2], $d[1], $d[0]);
            }

            function timestamp_mysql2german($date) {
            $d    =    explode("-",$date);
   
            return    sprintf("%02d.%02d.%04d", $d[2], $d[1], $d[0]);
            }

            $anzahl = mysql_num_rows($db_erg);
            
            if ($anzahl == 0) {

$Nachricht .= "            
            <p>&ensp;In dem oben angegebenen Zeitraum gibt es keine Geburtstagskinder des TTC´s.</p>
            ";
            
            }
            else {
               
               $anzahl = 1;   
               
               while ($zeile = mysql_fetch_array( $db_erg, MYSQL_ASSOC))
               {
               
            $expDate = explode(" ",$zeile['geburtsdatum']);   
            
$Nachricht .= "         

            &ensp;". $zeile['vorname'] ."
            ". $zeile['name'] ." hat am

            ". date_mysql2german($expDate[0])." ".substr($expDate[1],0,5)." Geburtstag und wird

            ". $zeile['alter'] ." Jahre alt

            (". timestamp_mysql2german($expDate[0])."".substr($expDate[1],0,5).")
            <br />";
               $anzahl++;
               }
            
            mysql_free_result( $db_erg );
            
            }
                     
            
$Nachricht .= "
            
            <p>&ensp;Mit freundlichen Grüßen</p>
         </div>   
</div>
";

// Datenbank schlieࠥn
mysql_close($link);

$Nachricht .= "
</body>
</html>
";

$Header = "MIME-Version: 1.0\n";
$Header .= "Content-type: text/html; charset=UTF-8\n";
$Header .= "From: Tester <tester@tester.de>\n";

mail($Empfaenger, $Betreff, $Nachricht, $Header);

echo "$Nachricht\n";

?>
gruß tobi

19.03.2012 20:05

35 Jörg Kruse

Ist es möglich, das Ganze auf wöchentlich umzubauen?

Dazu musst du das WHERE Statement anpassen. Hier führst du ja einen Vergleich mit Monaten im Format '%Y%m' durch:

WHERE
    CONCAT(IF(MONTH(geburtsdatum) < MONTH(CURDATE()), YEAR(CURDATE()) + 1, YEAR(CURDATE())), DATE_FORMAT(geburtsdatum, '%m'))
    BETWEEN PERIOD_ADD(DATE_FORMAT(CURDATE(), '%Y%m'), 1)
    AND PERIOD_ADD(DATE_FORMAT(CURDATE(), '%Y%m'), 2)

DATE_FORMAT kennt auch Formate für die Woche:

http://dev.mysql.com/doc/refman/5.1/de/date-and-time-functions.html

und auch nur die, die einen solchen Geburtstag feiern: 30,40,50,55,60,65,70,75,80,85,90

Das würde ich in einer zusätzlichen Bedingung prüfen. Die Zahlen kannst du ja in eine SQL-Liste packen und mit IN() überpüfen, ob das errechnete Alter darin vorkommt

19.03.2012 22:40 | geändert: 19.03.2012 22:45

... 2 Monate später ...

36 tobi

Hallo,

etwas verspätet :)

Das IN() habe ich mal eingebaut, aber ich denke ich habe da irgendwo noch einen Fehler drinne, da die Ausgabe aktuell jedesmal:

 Hallo zusammen,

 hier die runden Geburtstagskinder des TTC`s im Zeitraum von
 20.05.2012 bis zum 29.05.2012

 In dem oben angegebenen Zeitraum gibt es keine runden Geburtstage des TTC´s.

anzeigt.

<?php

$nextWeek = time() + (9 * 24 * 60 * 60); // 9 Tage; 24 Stunden; 60 Minuten; 60 Sekunden

$Empfaenger = "Tob <email@tob.de>,";
$Empfaenger .= "Test <test@test.de>,";

$Betreff = "Aktuelle Geburtstagskinder des TTC`s im Zeitraum von ". date('d.m.Y') ." bis zum ". date('d.m.Y', $nextWeek) ."";

$Nachricht = "
<html>
<head>
   <meta http-equiv=\"Content-Type\" content=\"text/html; charset=iso-8859-1\">
   <title>Geburtstage</title>
   <style type=\"text/css\" media=\"screen\">
      body
      {
      font-family:Verdana, Arial, Helvetca, sans-serif;
      font-size:13px;
      background-color:#E8E8E8;
      text-align:left;
      }

      h1 {font-size:13px;color:#000000;}

      /* Der Kopfbereich */
      #kopf {
      height:150px;
      padding:0px;
      border-bottom:1px solid #000000;
      }
      
      /* Main-Teil */
      #main {
      padding:10px;
      font-family:Verdana, Arial, Helvetca, sans-serif;
      font-size:14px;
      background-color:#E8E8E8;
      }
      
   
      /* Tabelle Eigenschaften bei Gesamtspielplan 100% */
      .table_gesamtspielplan_100{
      margin:auto;
      width:100%;
      border-collapse:collapse;
      border:1px solid #000000;
      padding: 3px;
      font-family:Verdana, Arial, Helvetca, sans-serif;
      font-size:13px;
      }

      /* Tabelle Eigenschaften bei Ausw峴sfahrten bei th*/
      .table_gesamtspielplan{
      border:1px solid #000000;
      padding: 3px;
      text-align:left;
      }   

      /* Links allgemein - Link Angaben 1 */
      a.links {
      font-size:15px;
      text-decoration:underline;
      }

      /* Links allgemein - Link Angaben 2 */
      a.links:visited {
      font-size:15px;
      text-decoration:underline;
      }

      /* Links allgemein - Link Angaben 3 */
      a.links:hover {
      font-size:15px;
      text-decoration:underline;
      }
      
      /* Mailto - Link Angaben 1 */
      a.mailto {
      font-size:15px;
      text-decoration:underline;
      }
      
      /* Mailto - Link Angaben 2 */
      a.mailto:visited {
      font-size:15px;
      text-decoration:underline;
      }

      /* Mailto - Link Angaben 3 */
      a.mailto:hover {
      font-size:15px;
      text-decoration:underline;
      }
   
   </style>

</head>
<body>
";

//Datenbank verbinden
include ("../../zugang.php.inc");


$Nachricht .= "

<div style=\"width:698px;text-align:left;border:solid 3px #000000;\">
   <div id=\"kopf\">
      <img src=\"http://mailversand.tobsp.de/mailversand/mail_header.jpg\" width=\"698\" height=\"150\" alt=\"Mail Header\">
   </div>
         <div id=\"main\">
            <p>&ensp;Hallo zusammen, <br /><br />&ensp;hier die runden Geburtstagskinder des TTC`s im Zeitraum von<br /><b>&ensp;". date('d.m.Y') ." bis zum ". date('d.m.Y', $nextWeek) ."</b></p>
            ";
         
            //sql1 Befehl         
				$sql = "
				SELECT id, name, vorname, geburtsdatum, (IF(MONTH(geburtsdatum) < MONTH(CURDATE()), YEAR(CURDATE()) + 1, YEAR(CURDATE())) - YEAR(geburtsdatum)) AS `alter`, DAYOFMONTH(geburtsdatum) AS geburtstag, MONTH(geburtsdatum) AS geburtsmonat
				FROM geburtstagsliste
				WHERE CONCAT(IF(MONTH(geburtsdatum) < MONTH(CURDATE()), YEAR(CURDATE()) + 1, YEAR(CURDATE())), DATE_FORMAT(geburtsdatum, '%m'))
				BETWEEN PERIOD_ADD(DATE_FORMAT(CURDATE(), '%Y%m'), 1)
				AND PERIOD_ADD(DATE_FORMAT(CURDATE(), '%Y%m'), 2)
				AND geburtsdatum IN('50', '60', '70', '80', '90', '100')
				ORDER BY geburtsmonat, geburtstag
				";

            
            
            $db_erg = mysql_query( $sql );
            if ( ! $db_erg )

            {
            die('Ungültige Abfrage: ' . mysql_error());
            }
            
            function date_mysql2german($date) {
            $d    =    explode("-",$date);
   
            return    sprintf("%02d.%02d.", $d[2], $d[1], $d[0]);
            }

            function timestamp_mysql2german($date) {
            $d    =    explode("-",$date);
   
            return    sprintf("%02d.%02d.%04d", $d[2], $d[1], $d[0]);
            }

            $anzahl = mysql_num_rows($db_erg);
            
            if ($anzahl == 0) {

$Nachricht .= "            
            <p>&ensp;In dem oben angegebenen Zeitraum gibt es keine Geburtstagskinder des TTC´s.</p>
            ";
            
            }
            else {
               
               $anzahl = 1;   
               
               while ($zeile = mysql_fetch_array( $db_erg, MYSQL_ASSOC))
               {
               
            $expDate = explode(" ",$zeile['geburtsdatum']);   
            
$Nachricht .= "         

            &ensp;". $zeile['vorname'] ."
            ". $zeile['name'] ." hat am

            ". date_mysql2german($expDate[0])." ".substr($expDate[1],0,5)." Geburtstag und wird

            ". $zeile['alter'] ." Jahre alt

            (". timestamp_mysql2german($expDate[0])."".substr($expDate[1],0,5).")
            <br />";
               $anzahl++;
               }
            
            mysql_free_result( $db_erg );
            
            }
                     
            
$Nachricht .= "
            
            <p>&ensp;Mit freundlichen Grüßen</p>
         </div>   
</div>
";

// Datenbank schlieࠥn
mysql_close($link);

$Nachricht .= "
</body>
</html>
";

$Header = "MIME-Version: 1.0\n";
$Header .= "Content-type: text/html; charset=UTF-8\n";
$Header .= "From: Tester <tester@tester.de>\n";

mail($Empfaenger, $Betreff, $Nachricht, $Header);

echo "$Nachricht\n";

?>

20.05.2012 21:59 | geändert: 20.05.2012 22:00

37 Jörg Kruse

				AND geburtsdatum IN('50', '60', '70', '80', '90', '100')

Die Zahlen beziehen sich auf das Alter, nicht auf das Geburtsdatum!

So wird's wahrscheinlich eher Sinn machen:

				AND `alter` IN('50', '60', '70', '80', '90', '100')

20.05.2012 23:33

38 tobi

Hi,

ich hatte es erst mit alter probiert, aber da gab es keine Informationen, dann habe ich es mit geburtsdatum probiert, auch negativ.

Nun habe ich testweise

AND 'alter' IN('28', '51', '61', '80', '90', '100')

eingebaut, weil mir aus meinem anderen Script bekannt ist, dass in den nächsten paar Tagen dies seien wird:
Person 1 hat am 28.05. Geburtstag und wird 28 Jahre alt (28.05.1984)
Person 2 hat am 31.05. Geburtstag und wird 51 Jahre alt (31.05.1961)
Person 3 hat am 01.06. Geburtstag und wird 61 Jahre alt (01.06.1951)

Mir wird aber nun aber dies ausgegeben:
hier die runden Geburtstagskinder des TTC`s im Zeitraum von
24.05.2012 bis zum 02.06.2012

In dem oben angegebenen Zeitraum gibt es keine runden Geburtstage des TTC´s.

Gruß Tobi

24.05.2012 20:02 | geändert: 24.05.2012 20:02

39 Jörg Kruse

Das Datenfeld `alter` muss in Backticks (`) eingeschlossen werden, nicht in Hochkommata (')

24.05.2012 20:17

40 tobi

Da erscheint dann eine Fehlermeldung:
Ungültige Abfrage: Unknown column 'alter' in 'where clause'

24.05.2012 20:39