Geburtstag Check
Christoph
- php
Hi Forumler,
ich habe ein Formular für eine Domainbestellung wo man sein Geburtstdatum eingeben soll um sich anzumelden, aber es dürfen nur Leute sich die Domain bestellen die älter als 18 Jahre sind...
Nur habe ich keinerlei Ahnung wie ich das überprüfen soll... hat jemand Links oder nen Tip wie man das anpacken kann?
Auch gibt er mir komischerweise immer noch die Monate im englischen Format aus obwohl ich bei setloale de eingestellt habe...
mein bisherigen Code:
<?
setlocale(LC_TIME, 'de_DE');
$monate = array();
$monate[1] = "Januar";
$monate[2] = "Februar";
$monate[3] = "März";
$monate[4] = "April";
$monate[5] = "Mai";
$monate[6] = "Juni";
$monate[7] = "Juli";
$monate[8] = "August";
$monate[9] = "September";
$monate[10] = "Oktober";
$monate[11] = "November";
$monate[12] = "Dezember";
$monate = array();
for($i=1; $i<=12; $i++)
{
$monate[$i] = strftime("%B", mktime(0, 0, 0, $i, 0, 2003));
}
// Formularfeld für den Tag
echo("<select name="geb[tag]">\n");
for($i=1; $i<=31; $i++)
{
echo("<option value="".$i."">\n");
echo($i.".\n");
echo("</option>\n");
}
echo("</select>\n");
// Formularfeld für den Monat
echo("<select name="geb[monat]">\n");
for($i=1; $i<=12; $i++)
{
echo("<option value="".$i."">\n");
echo($monate[$i].".\n");
echo("</option>\n");
}
echo("</select>\n");
// Formularfeld für das Jahr
echo("<input type="text" name="geb[jahr]" />\n");
?>
Liebe Grüße
Christoph
Hallo,
ich habe ein Formular für eine Domainbestellung wo man sein Geburtstdatum eingeben soll um sich anzumelden, aber es dürfen nur Leute sich die Domain bestellen die älter als 18 Jahre sind...
Tip: Wandle alle Daten ins Unix-Timestamp-Format um.
Das macht das Vergleichen und Rechnen einfach.
Ganz einfach waere es, zu schauen, ob der Unterschied
zwischen dem Geburtsdatum und heute groesser
als 18*365*24*60*60 Sekunden ist.
Dabei wuerden aber die Schaltjahre nicht beruecksichtigt.
Bei den Datums- und Zeitfunktionen von PHP
http://www.php.net/manual/de/ref.datetime.php
hat es aber ein paar praktische Dinge dabei.
Mit dem Befehl
strtotime ("-18 years")
kriegst Du vermutlich den Timestamp von Heute vor 18 Jahren.
Schau, ob der Timestamp des Geburtstags groesser ist.
Gruesse,
Thomas
Hallo,
Ganz einfach waere es, zu schauen, ob der Unterschied
zwischen dem Geburtsdatum und heute groesser
als 18*365*24*60*60 Sekunden ist.
Dabei wuerden aber die Schaltjahre nicht beruecksichtigt.
Den Timestamp vom Geburtstag kann er sich doch mit der Funktion mktime() http://www.php.net/mktime viel einfacher holen - oder hab ich was falsch verstanden und du meintest was anderes?
Wenn man dann das alter haben will könnte man ja: time()-mktime(parameter)
somit hat man ja dann die lebenslänge in sekunden ohne sich selber um schaltjahre kümmern zu müssen.
cu Benedikt Loepp
Hallo Benedikt,
Den Timestamp vom Geburtstag kann er sich doch mit der Funktion mktime() http://www.php.net/mktime viel einfacher holen
Ja, das soll er auf jeden Fall. Fuer beide Loesungen.
$geburi=mktime(23,59,59,$monat,$tag,$jahr);
Wenn man dann das alter haben will könnte man ja: time()-mktime(parameter)
somit hat man ja dann die lebenslänge in sekunden ohne sich selber um schaltjahre kümmern zu müssen.
_Diese_ Methode hat eben den Nachteil, dass sie die Schaltjahre _nicht_ beruecksichtigt.
Somit koennte jemand, der ein paar Tage zu jung ist, auch schon das "OK" kriegen,
weil er zwar mehr als 18*365*24*60*60 Sekunden alt ist, aber in diesem Jahr noch nicht
Geburtstag hatte... (OK, man koennte noch 5 Tage = 5*24*60*60 Sekunden dazuzaehlen,
aber das macht es trotzdem nicht korrekt.)
Das umgeht man, wenn man zum Vergleichen eben "heute vor 18 Jahren" nimmt.
$heutevor18=strtotime ("-18 years");
if ($geburi>$heutevor18)
{ /* Alles in Ordnung */ }
else
{ /* Sie sind leider zu jung... */ }
Ich hab's nicht getestet, sollte aber funktionieren.
Gruesse,
Thomas
Hallo,
Sorry, da habe ich groesser als / kleiner als falsch erwischt.
Und um den Einwand von wahsaga (Jahre < 1970) zu beruecksichtigen,
hier nochmals ein Vorschlag.
Vorbedingungen:
Der Geburtstag sei uebergeben durch die Variablen $tag, $monat, $jahr.
$jahr liegt vierstellig vor.
$geburi=mktime(0,0,0,$monat,$tag,$jahr);
$heutevor18=strtotime ("-18 years");
if (($geburi<$heutevor18) OR ($jahr<1970))
{ /* Alles in Ordnung */ }
else
{ /* Sie sind leider zu jung... */ }
Gruesse,
Thomas
Hallo nochmal,
So, ich habe jetzt eine kleine Testseite gebastelt.
http://www.tiptom.ch/tests/phpssi/ueber18.php
Funktioniert wie erwartet.
Der Schaltjahr-Fehler beim einfachen Timestring-Rechnen nach dem Schema
if (Jetzt minus Geburtsdatum) groesser als 18*365*24*60*60 Sekunden { ueber 18 }
wird deutlich, wenn jemand erst in ein paar Tagen Geburtstag hat:
Heute ist der 28.10.2003.
Zu pruefender Geburtstag 30.10.1985:
http://www.tiptom.ch/tests/phpssi/ueber18.php?tag=30&monat=10&jahr=1985
Geburtsdaten mit Jahren unter 1970, die man mit mktime() in einen UNIX-Timestamp
umwandeln will, geben _auf_meinem_Server_ (Linux) immer folgendes:
31-Dec-1969 23:58:58 (Timestamp: -3662)
Darauf kann man sich natuerlich nicht verlassen.
Im vorliegenden Fall der Alters-Kontrolle reicht es ja einfach, zu schauen, ob der
Jahrgang kleiner als 1970 ist (dann ist die Person auf jeden Fall aelter als 18).
Gruesse,
Thomas
Hi Thomas,
muss ich Dir doch mal auf die Schuler klopfen.
Tom
Hallo,
muss ich Dir doch mal auf die Schuler klopfen.
Danke, danke.
In der Annahme, dass Du der einzige bist, der hier als "Tom" unterwegs bist:
Ich entschuldige mich nochmals fuer die "Quatsch"-Antwort.
Inzwischen habe ich gesehen, dass Du bei PHP auch den Durchblick
hast und viele nuetzliche Tips gibst. Bravo!
In letzter Zeit ergaenzen wir uns ziemlich gut...
Gruesse,
Thomas
hi,
ich habe ein Formular für eine Domainbestellung wo man sein Geburtstdatum eingeben soll um sich anzumelden, aber es dürfen nur Leute sich die Domain bestellen die älter als 18 Jahre sind...
Tip: Wandle alle Daten ins Unix-Timestamp-Format um.
Das macht das Vergleichen und Rechnen einfach.
der unix-timestamp "beginnt" am 1.1.1970 - was ist, wenn jemand der davor geboren wurde sich eine domain bestellen will ...?
gruss,
wahsaga
Hi,
Mit dem Befehl
strtotime ("-18 years")
kriegst Du vermutlich den Timestamp von Heute vor 18 Jahren.
Schau, ob der Timestamp des Geburtstags groesser ist.
Das "vermutlich" kann ich auflösen. Ich fänds auch toll, wenn Tipps dieser Art vorher selber ausprobiert werden würden *grummel*
echo date("d.m.Y",strtotime("-18 Years",time()))."<br>";
ergibt den 28.10.1985
Und wo wirken die Schaltjahre da noch *gg*
Das kann die Funktion leider nicht wissen, ob jemand, der dieses Jahr am 01. März Geburtstag hat irgendwann am 29. Februar geboren wurde...
Grüße
Tom
Hi Forumler,
ich habe ein Formular für eine Domainbestellung wo man sein Geburtstdatum eingeben soll um sich anzumelden, aber es dürfen nur Leute sich die Domain bestellen die älter als 18 Jahre sind...
Nur habe ich keinerlei Ahnung wie ich das überprüfen soll... hat jemand Links oder nen Tip wie man das anpacken kann?
Auch gibt er mir komischerweise immer noch die Monate im englischen Format aus obwohl ich bei setloale de eingestellt habe...mein bisherigen Code:
<?
setlocale(LC_TIME, 'de_DE');$monate = array();
$monate[1] = "Januar";
$monate[2] = "Februar";
$monate[3] = "März";
$monate[4] = "April";
$monate[5] = "Mai";
$monate[6] = "Juni";
$monate[7] = "Juli";
$monate[8] = "August";
$monate[9] = "September";
$monate[10] = "Oktober";
$monate[11] = "November";
$monate[12] = "Dezember";$monate = array();
for($i=1; $i<=12; $i++)
{
$monate[$i] = strftime("%B", mktime(0, 0, 0, $i, 0, 2003));
}// Formularfeld für den Tag
echo("<select name="geb[tag]">\n");
for($i=1; $i<=31; $i++)
{
echo("<option value="".$i."">\n");
echo($i.".\n");
echo("</option>\n");
}
echo("</select>\n");// Formularfeld für den Monat
echo("<select name="geb[monat]">\n");
for($i=1; $i<=12; $i++)
{
echo("<option value="".$i."">\n");
echo($monate[$i].".\n");
echo("</option>\n");
}
echo("</select>\n");// Formularfeld für das Jahr
echo("<input type="text" name="geb[jahr]" />\n");
?>Liebe Grüße
Christoph
Hallo Christoph,
dein Ansatz war gar nicht einmal so schlecht. Ich werde die select-Box des Tag mit <select name="tag">, die select-Box des Monats mit
<select name="monat"> und das Textfeld des Jahres mit <input type="text" name=" jahr" /> bezeichnen. Darüber hinaus bette ich einmal deinen Programmcode in das folgende Formular ein.
<form action="irgendwohin.php" method="post" onsubmit="return Ueber18()">
.....
Dein Programmcode mit meinen Bezeichnungen
...........
<input type="submit" value="Abschicken" />
Der Witz an der Sache ist, dass wir das Abschicken verhindern (das prüft die Javascript-Funktion Ueber18() ), wenn ein Datum angegeben worden ist, dass danach liegt.
Ich skizziere einmal diese Funktion.
function Ueber18()
{
var Objekt=document.forms[0];
var heute=new Date() // gibt das heutige Datum aus.
var dieserMonat=heute.getMonth();
var dieserTag=heute.getDate();
var diesesJahr=heute.getYear(); // Vorsicht, evtl. musst du 1900
// dazu addieren
if(diesesJahr-Objekt.jahr.value < 18 ||
(diesesJahr-Objekt.jahr.value == 18 && dieserMonat < Objekt.monat.value) ||
(diesesJahr-Objekt.jahr.value ==18 && dieserMonat == Objekt.monat.value && dieserTag < Objekt.tag.value))
{
alert("Sie sind noch keine 18!")
return false;
}
return true;
}
Du solltest aber eventuell sicher gehen, dass der Benutzer wirklich nicht minderjährig ist. Da würde ich dir empfehlen, bei "erfolgreicher Anmeldung" die IP, das Anmeldedatum und die Anmeldezeit des Benutzers in einer Datenbank zu speichern.
Außerdem musst du alle Seiten, auf die man nur mit Anmeldung zugreifen darf, mit einer Session-Variable schützen.
Soviel von mir,
Grüße,
Wolfram