Geburtstage anzeigen lassen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Geburtstage anzeigen lassen

    Hallo zusammen :)

    ich habe ein Problem, und zwar möchte ich für das Intranet eine Geburtstagsliste abbilden lassen. Die Datenbank-Einträge habe ich für alle Mitarbeiter schon getätigt und auch die geburtsdaten sind schon im passenden Format eingepflegt.

    Das die Ausgabe jedoch so schwierig wird war mir am Anfang gar nicht bewusst, vor allem bei den jahresübergängen nicht :D. Aussehen sollte die Ausgabe nachher wie folgt:
    [Blockierte Grafik: http://img12.myimg.de/12474d3c.png]

    Aber wie bekomme ich das hin? Hier mal die SQL-Query welche universal dafür einsetzbar wäre:

    Quellcode

    1. SELECT
    2. `id`,
    3. `name`,
    4. `vorname`,
    5. `geburtstag`,
    6. YEAR( CURRENT_DATE( ) ) - YEAR( geburtstag )
    7. age,
    8. DATEDIFF(`geburtstag` + INTERVAL
    9. (YEAR(CURRENT_DATE) - YEAR(`geburtstag`) +
    10. IF(DATE_FORMAT(CURRENT_DATE, "%m%d") >
    11. DATE_FORMAT(`geburtstag`, "%m%d"), 1, 0))
    12. YEAR, CURRENT_DATE) AS `days_to_birthday`
    13. FROM
    14. `xxx_mitarbeiter`
    15. HAVING
    16. `days_to_birthday` <= 6 OR
    17. `days_to_birthday` >= 360
    18. ORDER BY
    19. days_to_birthday
    Alles anzeigen


    Wie sieht nun der PHP Code aus, dass ich die Ausgabe wie oben auf dem Bild bekomme?

    Für jede Hilfe wäre ich dankbar! :thumbsup:
  • hi,
    also bild sehe ich da leider keins, aber um es dir vllt etwas einfacher zu machen würde ich an deiner stelle gar nicht so viel mit sql-statements rumhantieren.
    hol dir einfach alle daten und arbeite dann php-seitig damit. finde ich persönlich einfacher ;)

    hier mal ein kleines beispiel von einem geburtstagskalender den ich mal entworfen hab:

    PHP-Quellcode

    1. <?php
    2. // Verbinden mit dem Server
    3. mysql_connect("localhost","root");
    4. // Datenbank auswählen
    5. mysql_select_db("bd_calendar")or die ("Database not found");
    6. // Abfrage
    7. $res = mysql_query("SELECT * FROM geburtstage");
    8. // Anzahl der Datensätze ermitteln
    9. $num = mysql_num_rows($res);
    10. $today = date("Y/m/d");
    11. $tyear = date("Y");
    12. /* Datensätze aus Ergebnis ermitteln,
    13. in Array speichern und in einer Tabelle ausgeben*/
    14. while ($dsatz = mysql_fetch_assoc($res))
    15. {
    16. $gebdat = date("$tyear/m/d", $dsatz["datum"]);
    17. if(strtotime($gebdat) < strtotime($today))
    18. {
    19. $gebdat = date("Y/m/d", strtotime("+1 year", strtotime($gebdat)));
    20. }
    21. $days = ceil((strtotime($gebdat) - strtotime($today)) / (24 * 3600));
    22. $tage = $days;
    23. // Die Tabelle wird mit Daten gefüllt
    24. $tmp[$days] = "<td>" . $dsatz["vorname"] . "</td>";
    25. $tmp[$days] .= "<td>" . $dsatz["nachname"] . "</td>";
    26. $tmp[$days] .= "<td>" . date("d.m.Y", $dsatz["datum"]) . "</td>";
    27. $tmp[$days] .= "<td>" . $tage . "</td>";
    28. $tmp[$days] .= "<td>" . $dsatz["notizen"] . "</td>";
    29. $tmp[$days] .= "</tr>";
    30. }
    31. ksort($tmp);
    32. $nr = 1;
    33. // Tabellenbeginn
    34. echo "<table summary='Anstehende Geburtstage'>";
    35. echo "<caption>Es sind $num Geburtstage eingetragen!</caption>";
    36. // Überschriften der Tabelle
    37. echo "<thead> <tr> <td>Nr.</td> <td>Vorname</td>";
    38. echo "<td>Nachname</td> <td>Geburtstag</td>";
    39. echo "<td>Tage</td> <td>Notizen</td> </tr> </thead>";
    40. foreach($tmp as $val)
    41. {
    42. // Der Zeilenhintergrund wird festgelegt
    43. if ($nr % 2 == 0)
    44. {
    45. $class = "class='z1'";
    46. }
    47. else
    48. {
    49. $class = "class='z2'";
    50. }
    51. echo "<tr $class><td>$nr</td>$val</tr>";
    52. $nr = $nr + 1;
    53. }
    54. // Tabellenende
    55. echo "</table>";
    56. ?>
    Alles anzeigen


    class='z1' und class='z2' müssen halt im css verschiedenfarbig definiert werden.


    greeetz kardas
    "Programming today is a race between sw-engineers striving to build bigger and better idiot-proof programs,
    and the universe trying to produce bigger and better idiots.
    So far, the universe is winning...."

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von theKardas ()

  • Vielen Dank :) Habe nun mal meine Daten eingegeben:

    Quellcode

    1. <?php
    2. // Verbinden mit dem Server
    3. mysql_connect("localhost","root");
    4. // Datenbank auswählen
    5. mysql_select_db("intranet")or die ("Database not found");
    6. // Abfrage
    7. $res = mysql_query("SELECT * FROM user");
    8. // Anzahl der Datensätze ermitteln
    9. $num = mysql_num_rows($res);
    10. $today = date("Y/m/d");
    11. $tyear = date("Y");
    12. /* Datensätze aus Ergebnis ermitteln,
    13. in Array speichern und in einer Tabelle ausgeben*/
    14. while ($dsatz = mysql_fetch_assoc($res))
    15. {
    16. $gebdat = date("$tyear/m/d", $dsatz["geburtsdatum"]);
    17. if(strtotime($gebdat) < strtotime($today))
    18. {
    19. $gebdat = date("Y/m/d", strtotime("+1 year", strtotime($gebdat)));
    20. }
    21. $days = ceil((strtotime($gebdat) - strtotime($today)) / (24 * 3600));
    22. $tage = $days;
    23. // Die Tabelle wird mit Daten gefüllt
    24. $tmp[$days] = "<td>" . $dsatz["vorname"] . "</td>";
    25. $tmp[$days] .= "<td>" . $dsatz["nachname"] . "</td>";
    26. $tmp[$days] .= "<td>" . date("d.m.Y", $dsatz["geburtsdatum"]) . "</td>";
    27. $tmp[$days] .= "<td>" . $tage . "</td>";
    28. $tmp[$days] .= "</tr>";
    29. }
    30. ksort($tmp);
    31. $nr = 1;
    32. // Tabellenbeginn
    33. echo "<table summary='Anstehende Geburtstage'>";
    34. echo "<caption>Es sind $num Geburtstage eingetragen!</caption>";
    35. // Überschriften der Tabelle
    36. echo "<thead> <tr> <td>Nr.</td> <td>Vorname</td>";
    37. echo "<td>Nachname</td> <td>Geburtstag</td>";
    38. echo "<td>Tage</td></tr> </thead>";
    39. foreach($tmp as $val)
    40. {
    41. // Der Zeilenhintergrund wird festgelegt
    42. if ($nr % 2 == 0)
    43. {
    44. $class = "class='z1'";
    45. }
    46. else
    47. {
    48. $class = "class='z2'";
    49. }
    50. echo "<tr $class><td>$nr</td>$val</tr>";
    51. $nr = $nr + 1;
    52. }
    53. // Tabellenende
    54. echo "</table>";
    55. ?>
    Alles anzeigen


    Leider wird nur der letzte Eintrag angezeigt?! So sieht die Ausgabe aus:
    Nr. Vorname Nachname Geburtstag Tage Notizen
    1 Andrea Dämming 01.01.1970 39


    Dort ist jedoch auch das Datum falsch, in der Datenbank ist es folgendermaßen gespeichert: 1980-05-24

    Wo ist der Fehler? :D
  • hmm ja bei mir waren die daten als timestamp in der datenbank hinterlegt.
    mach mal in zeile 23 aus

    Quellcode

    1. $gebdat = date("$tyear/m/d", $dsatz["geburtsdatum"]);

    das hier:

    Quellcode

    1. $gebdat = date("$tyear/m/d", strtotime($dsatz["geburtsdatum"]));


    so sollte es dann funktionieren denk ich.
    "Programming today is a race between sw-engineers striving to build bigger and better idiot-proof programs,
    and the universe trying to produce bigger and better idiots.
    So far, the universe is winning...."
  • KohLix3 schrieb:


    Du musst natürich auch eine WHERE Abfrage machen

    ein WHERE ist nicht unbedingt erforderlich. in meinem fall ist es so, dass ich mir erstmal alle daten hole und dann erst php-seitig aussortiere.

    Tobbe5 schrieb:


    Dankeschön für die Antwort, aber irgendwie bekomme ich das nicht in meinen Code? Kannst du mir das anhand meines Beispielcodes oben zeigen?


    Denn bisher wird entweder alles angezeigt (Also alle Einträge mit falschem 1970. Datum), der letzte Eintrag oder garnichts :(


    ich hoffe mal dass du nicht einfach meinen code genommen hast und davon ausgehst dass es so dann funktioniert (ich sollte aufhören meinen code einfach zu posten ;)), sonder du dir die funktionen genau angeschaut hast, dir überlegt hast was ich da treibe und es dann nachbaust. das is eig der sinn der sache und so lernst du auch mehr ;)


    greeetz kardas
    "Programming today is a race between sw-engineers striving to build bigger and better idiot-proof programs,
    and the universe trying to produce bigger and better idiots.
    So far, the universe is winning...."
  • Nun, damit kannst du jetzt auf deine Datei (bsp: geburtstag.php) zugreifen: geburtstag.php?nachname=köhler <--- Beispiel:

    Quellcode

    1. <?php
    2. // Deine Connection
    3. // Abfrage
    4. $nachname = $_GET['nachname'];
    5. $sql = mysql_query("SELECT * FROM user WHERE $nachname");
    6. // While
    7. while($row = mysql_fetch_assoc($sql)){
    8. echo "Vorname: ".$row['vorname']."<br />";
    9. echo "Nachname: ".$row['nachname']."<br />";
    10. echo "Geburtstag: ".$row['geburtstag']."<br />";
    11. }
    12. ?>
    Alles anzeigen


    Das mit dem bevorstehenden Geburtstagen musst du erstmal machen.
  • Ich bekomme es einfach nicht hin und auch bei Google hat wohl irgendwie keiner einen funktionierenden Code :(

    Will ja nur die letzten, heutige und kommende Geburtstage ausgeben. Habe auch folgenden Schnipsel getestet:

    Quellcode

    1. $sql = 'SELECT id, vorname, nachname, geburtsdatum';
    2. $sql .= ',DAYOFMONTH(geburtsdatum) AS tag';
    3. $sql .= ',MONTH(geburtsdatum) AS monat';
    4. $sql .= ' FROM user';
    5. $sql .= ' WHERE geburtsdatum IS NOT NULL';
    6. $sql .= ' ORDER BY monat ASC, tag ASC';
    7. $query = mysql_query($sql);
    8. while($row = mysql_fetch_array($query))
    9. $list[] = $row;
    10. for($i=0;$i<count($list);$i++) {
    11. if($list[$i]['monat'] > date('m') || ($list[$i]['monat'] == date('m') && $list[$i]['tag'] >= date('d')))
    12. $zukunft[$i] = $list[$i];
    13. else
    14. $vergangenheit[$i] = $list[$i];
    15. }
    16. $result = array_merge($zukunft,$vergangenheit);
    17. for($i=count($result);$i>$anzahl;$i--)
    18. array_pop($result);
    19. return($result);
    Alles anzeigen


    Aber leider funktioniert auch dieser nicht :(
  • Du willst also die "letzten, heutigen und kommende Geburtstage".
    Das kannst du einfach per SQL machen.

    Willst du alle 3 Listen vollständig haben, dann machs so:

    Quellcode

    1. SELECT
    2. IF(geburtsdatum < CURDATE(), 'zuletzt', IF(geburtsdam = CURDATE(), 'heute', 'kommend')) AS type
    3. id,
    4. vorname,
    5. nachname,
    6. geburtsdatum
    7. FROM user
    8. WHERE geburtsdatum IS NOT NULL
    9. ORDER BY geburtsdatum ASC


    Willst du von allen Listen jeweils nur einen Subset haben. Also die "letzten drei", die "nächsten drei", ...
    Dann mache dir einfach 2 Datenbankabfragen.
  • Ja aber so einfach kann es doch gar nicht sein oder?

    Wozu sind dann alle anderen Codeschnipsel die das ausgeben sollen immer so kompliziert um abzufragen ob schon das nächste Jahr erreicht ist und so ein Müll und umformatierung der datenbank? :D

    Will es genau so haben:

    Beispiel heute: 24.01.2011

    Nächste Geburtstage (3):
    Angelika 03.03.1982
    Hannes 24.02.1990
    -> Marie 03.02.1978

    Heutige Geburtstage:
    Leider keiner

    Letzte Geburtstage (3):
    Heinrich 20.01.1993
    Dieter 01.01.1990
    Hans 12.12.1968


    Und liegen tut es ja bisher in der Datenbank alla "1999-01-09"