Geburstdatum ausrechnen PHP

Hallo Habo,
ich lerne seit einiger Zeit PHP.
Habe heute morgen ein kleines Script gebastelt, dass anhand der Eingaben Tag,Monat,Jahr das Alter errechnen kann.
Ich möchte gerne das ihr meinen Code auf Sinnhaftigkeit und Lesbarkeit mal auseinander nehmt. Nur so kann ich mich verbessern ;-)

Hier mal der Code :

Code:
<?php
/* Dieses PHP-Script findet dein Alter heraus */

//Input User
echo ' Bitte geben Sie ihr Geburtsdatum im Format TT//MM//JJJJ an.
<form action="gebcheck.php" method="POST">
Geb. Tag eingeben : <input type="text" name="tag">
Geb. Monat eingeben : <input type="text" name="monat">
Geb. Jahr eingeben : <input type="text" name="jahr">
<input type="submit">
</form> ' ;

//User Eingaben
$tag = $_POST['tag']; 
$monat = $_POST['monat'];
$jahr = $_POST['jahr'];

/*Debug
echo $tag; echo '</br>';
echo $monat; echo '</br>';
echo $jahr; echo '</br></p>';
*/

//Wenn Input ausgefüllt - Rechnung
if($tag && $monat && $jahr != 0){

	//Aktuelles Datum
	$aktuellesdatum = getdate();
	$tag_heute = $aktuellesdatum[mday];
	$monat_heute = $aktuellesdatum[mon];
	$jahr_heute = $aktuellesdatum[year];


	$alter_tage = $tag_heute - $tag;
	$alter_monat = $monat_heute - $monat;

	if($alter_monat==0){
	$ergebnis = $jahr_heute - $jahr;
	echo $ergebnis;}
        
	if($alter_tage && $alter_monat != 0){
	$ergebnis = $jahr_heute - $jahr -1 ;
	echo $ergebnis;}
	
}

else{
echo "Bitte geben Sie Ihr Gebdatum ein.";}
?>

LG , Weau
 
Original von weau
Hallo Habo,
ich lerne seit einiger Zeit PHP.
Habe heute morgen ein kleines Script gebastelt, dass anhand der Eingaben Tag,Monat,Jahr das Alter errechnen kann.
Ich möchte gerne das ihr meinen Code auf Sinnhaftigkeit und Lesbarkeit mal auseinander nehmt. Nur so kann ich mich verbessern ;-)

Gerne doch ;)

Code:
<?php
/* Dieses PHP-Script findet dein Alter heraus */

//Input User
echo ' Bitte geben Sie ihr Geburtsdatum im Format TT//MM//JJJJ an.
<form action="gebcheck.php" method="POST">
Geb. Tag eingeben : <input type="text" name="tag">
Geb. Monat eingeben : <input type="text" name="monat">
Geb. Jahr eingeben : <input type="text" name="jahr">
<input type="submit">
</form> ' ;

//User Eingaben
$tag = $_POST['tag']; 
$monat = $_POST['monat'];
$jahr = $_POST['jahr'];

/*Debug
echo $tag; echo '</br>';
echo $monat; echo '</br>';
echo $jahr; echo '</br></p>';
*/

//Wenn Input ausgefüllt - Rechnung
if($tag && $monat && $jahr != 0){

Du überprüfst hier, ob die Variablen $tag und $monat überhaupt existieren. PHP geht das ganze so durch:

1. if($tag && $monat && $jahr != 0){
PHP Interpreter: Ist $tag vorhanden und nicht "0"?

Wenn der Besucher also das Feld ausgelassen hat, ist es dennoch vorhanden, aber leer und es steht _nicht_ 0 drin. D.h. obwohl er nichts eingegeben hat, wird in den ersten Anweisungsblock gesprungen.
Besser geht es so:
Code:
 if(!isempty($tag) && !isempty($monat) && !isempty($jahr){
Wobei ich mir nicht ganz sicher bin, ob es "isempty()" oder nur "empty()" war.

Code:
	//Aktuelles Datum
	$aktuellesdatum = getdate();
	$tag_heute = $aktuellesdatum[mday];
	$monat_heute = $aktuellesdatum[mon];
	$jahr_heute = $aktuellesdatum[year];
Die richtige Syntax wäre $array["index"] und nicht $array[index].
Sonst sprichst du nämlich (eventuell vorhandene) Konstanten an. Als besser die richtige Form angewöhnen.

Code:
	$alter_tage = $tag_heute - $tag;
	$alter_monat = $monat_heute - $monat;

	if($alter_monat==0){
	$ergebnis = $jahr_heute - $jahr;
	echo $ergebnis;}

Ich würde dir empfehlen, nach "if" ein Leerzeichen zu machen und die geschwungenen Klammern, in die nächste Zeile zu setzen. Also so:
Code:
if (Bedingung) //oder auch if ( Bedingung )
{
   anweisung1;
   anweisung2;
}
Ist zwar Geschmackssache, aber man soll damit angeblich weniger Fehler machen.

Code:
	if($alter_tage && $alter_monat != 0){
	$ergebnis = $jahr_heute - $jahr -1 ;
	echo $ergebnis;}
}

Code:
else{
echo "Bitte geben Sie Ihr Gebdatum ein.";}
?>
Auch hier solltest du wieder besser einrücken.
Zu allerletzt: Du hast vergessen, Schaltahre mit in deine Rechnung einzubeziehen.
 
1. empty($var) liefert TRUE für eine leere $var zurück.
2. www.php.net/mktime
Lies dich in den Link ein, ist das sinnvollste für diese Anwendung, da du dann gleich mal mit dem Unix Timestamp in Berührung kommst ohne den bei Zeitangaben im Serverseitigen Scripten ohnehin nichts geht.
Übrigens: mkdate($stunde,$minute,$sekunde,$monat,$tag,$jahr) lässt sich mit fast beliebigen zahlen aufrufen.
So ergibt mktime(23,59,59,13,0,1999) (13 für den Monat und 0 für den Tag).
Den letzten Tag des Dezember 1999 ;)
Wäre die 0 eine 1 würde es dir den 1. Januar 2000 anzeigen.
Es sind also beliebige Rechenoperationen möglich.
Beispiel: heute ist der 9.01.2008, das sähe in mktime so aus: mktime(0,0,0,9,1,2008)
Eingabealter: 25 Tage, 4 Monate, 18 Jahre.
Eingabe in mktime(0,0,0,9-25,1-4,2008-18) das gibt dir einen unix timestamp zurück den du mit: date("d-m-Y",mktime(0,0,0,9-25,1-4,2008-18)) als Tag-Monat-Jahr sichtbar machen kannst.
Beachte dazu www.php.net/date
Hf,
Imrahil
 
Original von valenterry

Code:
 if(!isempty($tag) && !isempty($monat) && !isempty($jahr){
Wie wärs mit

Code:
if (preg_match("/\d{2}/",$tag) && preg_match("/\d{2}/",$monat) && preg_match("/\d{4}/",$jahr) ){
}

Um das Datum zu validieren ist vielleicht auch checkdate() was für dich.
 
Original von Mackz
Original von valenterry

Code:
 if(!isempty($tag) && !isempty($monat) && !isempty($jahr){
Wie wärs mit

Code:
if (preg_match("/\d{2}/",$tag) && preg_match("/\d{2}/",$monat) && preg_match("/\d{4}/",$jahr) ){
}

Damit wäre es ganz schlecht. Also wenn man schon alles überprüft, kann man auch gleich tollerant werden:

Code:
$tag = ereg_replace ( ".*?(\d{2}).*", "\1", $tag );

Das jeweils für alle und dann erst die Abfrage, ob die Syntax stimmt. :P
 
Original von valenterry
Damit wäre es ganz schlecht. Also wenn man schon alles überprüft, kann man auch gleich tollerant werden:

Code:
$tag = ereg_replace ( ".*?(\d{2}).*", "\1", $tag );

Das jeweils für alle und dann erst die Abfrage, ob die Syntax stimmt. :P
Damit wäre es ganz schlecht. :P

Tolleranz ist was für Noobs :P :D Was soll ich dem User unter die Arme greifen wenn er zu doof zum tippen ist? (und das auch noch mit einem unperformanten ereg_replace)
Btw: Dein ist den Code fehlerhaft. ;)
Btw2: Wären hier Dropdown Boxen eh sinnvoller als Inputfelder, womit deine replace-Funktion eh ziemlich sinnlos wird.
 
Original von Mackz
Original von valenterry
Damit wäre es ganz schlecht. Also wenn man schon alles überprüft, kann man auch gleich tollerant werden:

Code:
$tag = ereg_replace ( ".*?(\d{2}).*", "\1", $tag );

(und das auch noch mit einem unperformanten ereg_replace)

Womit stellst du denn solche Regeln performanter auf? Ein einfaches Ersetzen von Strings reicht doch hier nicht aus?!

Btw: Dein ist den Code fehlerhaft. ;)

Echt? Ich hab ihn nicht getestet, was ist denn daran falsch? Ach, ich seh es gerade, meinst du die Delimiter?

Code:
$tag = ereg_replace ( "/.*?(\d{2}).*/", "\1", $tag );

Ist's besser so?
 
Mackz:

preg_match()? Naja, das sind auch Kanonen auf Spatzen, da du damit ja nur vergleichst, ob eine zweistellige Zahl eingegeben wurde. Prüfen, ob das Datum gültig ist, muss man immer noch mittels checkdate(), also reicht statt preg_match auch ein simples is_int().
 
Danke für eure Tipps - ich löse das Ganze morgen mit mktime , da es ja auch Schaltjahre direkt mit einrechnen kann :-)
 
Zurück
Oben