| Tweet |
Geburtstage mit PHP anzeigen lassen
-
Happy Birthday! Ok, ich habe nicht Geburtstag, doch man will doch immer gerne wissen, wer als nächstes von den Bekannten & Verwandten Geburtstag hat. Auch ich wollte in einem Intranet alle heutigen, letzten und kommenden Geburtstage anzeigen lassen. Eigentlich kein Problem, die Geburtsdaten mit Vor- & Nachnamen in die Datenbank legen und per PHP abfragen. So einfach habe ich es mir auch vorgestellt, doch was man dabei beachten muss sind die Schaltjahre und die Jahresübergänge welche für einige Probleme sorgen. Vor allem der Übergang ins nächste Jahr ist schwierig, da man normalerweise mit Monat und Tagen arbeiten könnte, am Jahresende aber auch schon das nächste Jahr abgefragt werden muss, bei verschiedenen Jahreszahlen aber nicht so einfach ist. Habe dazu einiges gelesen und auch sehr lange und umständliche Scripte gesehen – Das war alles nichts für mich, ich wollte es logisch, klein und funktionierend.
Ein weiterer Knackpunkt ist natürlich, dass alle Geburtstage in der Datenbank standardmäßig nicht im Format DD.MM.YYYY, sondern im Date Format (Also YYYY-MM-DD) abgespeichert sind und sie vor Benutzung natürlich erst aufgeschlüsselt werden müssen. Nach einiger Suche habe ich dann in einem Forum den Codeschnipsel gefunden, wie man die Tage zum Geburtstag ausrechnen kann:
1
(geburtsdatum + INTERVAL (YEAR(CURRENT_DATE) - YEAR(geburtsdatum) + IF(DATE_FORMAT(CURRENT_DATE, \"%m%d\") > DATE_FORMAT(geburtsdatum, \"%m%d\"), 1, 0)) YEAR, CURRENT_DATE)
Selbst ist der Mann, deswegen habe ich mir mithilfe des Codeschnipsels Gedanken gemacht, wie ich am besten eine Liste der Geburtstage anzeigen lasse. Der SQL-Code war schnell programmiert und ich konnte sowohl die kommenden drei, letzten drei und heutigen Geburtstage ausgeben lassen – Ohne größere Probleme
. Folgender Code ist dabei raus gekommen:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
<?php function datumdeutsch($datum) { $d = explode("-",$datum); return sprintf("%02d.%02d.%04d", $d[2], $d[1], $d[0]); } function aktuellesalter($geburtsdatum) { $datum = explode('-', "$geburtsdatum"); return date('Y') - $datum[0] - intval(date('n') < $datum[1] || date('n') == $datum[1] && date('j') < $datum[2]); } echo '<b>Letzte Geburtstage:</b><br/>'; $result=mysql_query(" SELECT id, nachname, vorname, geburtsdatum, DATEDIFF(geburtsdatum + INTERVAL (YEAR(CURRENT_DATE) - YEAR(geburtsdatum) + IF(DATE_FORMAT(CURRENT_DATE, \"%m%d\") > DATE_FORMAT(geburtsdatum, \"%m%d\"), 1, 0)) YEAR, CURRENT_DATE) AS 'tagezumgeburtstag' FROM itrunde_tabelle WHERE ((DATE_FORMAT(geburtsdatum, \"%m%d\")!=DATE_FORMAT(CURRENT_DATE, \"%m%d\"))&& (geburtsdatum!='0000-00-00')) ORDER BY tagezumgeburtstag DESC Limit 3"); echo ' <table> <thead> <tr> <th>Nachname</th> <th>Vorname</th> <th>Geburtsdatum</th> <th>Alter</th> </tr> </thead> <tbody>'; while($row=mysql_fetch_array($result)) { echo '<tr> <td>'.$row['vorname'].'</td> <td>'.$row['nachname'].'</td> <td><center>'.datumdeutsch($row['geburtsdatum']).'</center></td> <td><center>'.aktuellesalter($row['geburtsdatum']).'</center></td> </tr>'; } echo '</tbody></table>'; ?>
Wie ihr seht, habe ich noch weitere Specials wie das Alter, das Geburtsdatum und ein Profilbild für jeden Datensatz ausgegeben. Der obrige Code zeigt als Beispiel die letzten Geburtstage an, deshalb habe ich in der WHERE-Anweisung auch nochmal festgelegt, dass das Geburtsdatum nicht gleich 0000-00-00 sein darf (Dies ist der Fall, wenn kein Geburtsdatum im Datensatz eingegeben wurde) und das Geburtsdatum ungleich dem heutigen sein muss (Da sonst bei der “Letzte Geburtstage”-Liste auch alle heutigen Geburtstage eingetragen sein würden). Wichtig ist natürlich, dass ihr über dem Code noch eine Verbindung zur Datenbank aufbaut
.Damit ihr euch auch was dadrunter vorstellen könnt, gibts hier mal mein Ergebnis als Screenshot:

Habe so einen kompakten und funktionierenden Code wie ich ihn nun erzeugt habe sonst niergendwo anders gesehen, deswegen kann er sicher auch dem ein oder anderen von euch helfen. Dann noch ein wenig mit PHP, HTML & CSS gespielt und ihr bekommt so eine schöne Übersicht wie ich sie mir erstellt habt (Mit Features wie z.B. den Profilbildchen
).
Viel Spaß beim testen!
Tweet







28.01.2011 um 00:48 Uhr
Wow, ich habe gerade rein Interesse halber auch mal danach gegooglet, und man findet wirklich keinen anderen Code der funktioniert (Zumindest auf den ersten beiden Google Seiten)
Habe mir den Artikel jetzt mal unter die Favoriten gelegt, recht interessant, danke!
28.01.2011 um 21:25 Uhr
Ich verwende hierzu ganz einfach den Google Kalender mit der Geburtstags-Funktion.
Da muss ich nicht noch separat Scripte einsetzen, wenn ich den Google Calender eh schon benutze.
28.01.2011 um 21:35 Uhr
@Jeffrey: Das man das für Verwandte & Bekannte benutzen kann war auch nur ein Beispiel
. Gedacht ist es natürlich für vorhandene Scripte mit Datenbanken. z.B. Foren, Portale, Blogs etc. wo gegebenenfalls Datensätze über die Benutzer geführt werden.
09.04.2011 um 11:07 Uhr
Hi, tolles Script,
hab nur ein Problem, ich habe meine Geburtstage als String im Format tt.mm.jjjj in der DB gespeichert.
Wie bekomme ich das Script jetzt trotzdem zum laufen ???
09.04.2011 um 11:59 Uhr
Gibt es eventuell auch den ganzen Code des Scripts, ich komme mit der Sortierung
letzte 3 – heute – nächtse 3
nicht klar.
Thx
09.04.2011 um 13:18 Uhr
@Mario: Eigentlich kein Problem, für dein angegebenes Format kannst du einfach die Funktion “datumdeutsch” anpassen an deine Vorstellungen und die heutigen Geburtstage kannst du einfach ausgeben lassen, indem du die Select-Anweisung an deine Vorstellungen anpasst und das größer-als-Zeichen (>) z.B. durch ein gleichgleich (==) austauschst und das Limit rausnimmst. Die kommen dann mit dem kleiner-als-Zeichen (<)
07.06.2011 um 22:04 Uhr
Ähm ja er ist so einfach, da du sobalb du mit Zeitzonen und Schaltjahren arbeitest wahrscheinlich falsche Daten bekommst …
08.06.2011 um 10:54 Uhr
Das klappt genial, danke! Habe ich vorhin in das Intranet eingesetzt und klappt auf anhieb, du bist super! Hast mir einiges an Arbeitszeit ersparrt^^ Oder vielleicht wäre ich auch nie auf so eine Lösung gekommen
@Sven: Was sollte denn dann nicht klappen? Finde das ganz logisch erklärt mit den gezählten Tagen… o.O
12.06.2011 um 21:58 Uhr
Ich schau mir deine query mal genauer an. Ich hatte bisher das Problem, dass die Schaltjahre nicht beachtet wurden. Also ein Tag zuviel oder zu wenig beim Anzeigen der tagezumgeburtstag war.
Allerdings was mir auffällt, warum rechnest du das Alter mit php aus? Das geht auch gleich mit SQL:
(YEAR(CURDATE()) – YEAR(a.birthdate) – (Right(CURDATE(),5)<RIGHT(a.birthdate,5))) AS age
13.06.2011 um 12:30 Uhr
Also mir reichte das jetzt so wie es im Artikel steht
Dein SQL-Code ist für mich als “Anfänger” eher spanisch
Und zu den Schaltjahren nocheinmal: Bei mir funktioniert es wenn ich einem Nutzer in der Datenbank einen passenden Schaltjahr-Geburtstag verpasse – Oder wo ist genau ein Fehler? Will natürlich so viele Fehlerquellen wie möglich ausschalten^^
03.04.2012 um 16:27 Uhr
Perfekt & Danke, genau so eine Beschreibung habe ich gebraucht, auch bei uns sind die Geburtsdaten im Format dd.mm.jjjj gespeichrt und ich muss die Funktion ändern.. sollte aber kein großes Problem sein.
14.05.2012 um 15:53 Uhr
Hilfe für Anfänger,
das Script ist genial, komme aber mit der Anzeige z.B. “Heute keine Geburtstage” nicht klar.