(Hallo|Hi(ho)|Tag) Daniela,
Hallo liebe Leute,
ich würde gerne überprüfen, ob mein User gültige Daten eingegeben hat.
Es handelt sich hierbei um eine Uhrzeit (XX:XX) und ein Datum (XX.XX.XXXX).
Diese beiden Variablen kann er manuell eingeben.
Das blöde ist, dass wenn er dort Buchstaben oder halt andere Daten eingibt als erwartet, stürzt mein weiteres Script ab, weil ich die Daten verarbeiten will.
Kein sehr gutes Skript, eine Fehlermeldung sollte als Reaktion genügen, extra abstürzen muss es nun wirklich nicht. ;-)
Wie kann ich jetzt die Eingaben prüfen ...
Ich würde zweistufig vorgehen:
1. Das Eingabeformat mit preg_match() überprüfen.
2. Die Ergebnisse auf Einhaltung der Bereichsgrenzen überprüfen.
/// Rückgabe im Fehlerfall: FALSE;
/// Rückgabe im Erfolgsfall: ARRAY ($hour, $min)
function time_check_input(
$tod /// time of day, format hh:mm
) {
// Eingabeformat prüfen
if ( !preg_match('/\A([0-9]{1,2})[\-:.]([0-9]{1,2})\z/', trim($tod), $tod_array) ) {
return FALSE;
}
$hh = intval( $tod_array[1] );
$mm = intval( $tod_array[2] );
if ($hh > 23) {
return FALSE;
}
if ($mm > 59) {
return FALSE;
}
return array ($hh, $mm);
}
/// Rückgabe im Fehlerfall: FALSE;
/// Rückgabe im Erfolgsfall: ARRAY ($day_of_month, $month, $year)
function date_check_input(
$dmy // dom-month-year, format: DD-MM-YYYY
) {
// Eingabeformat prüfen
if ( !preg_match('/\A([0-9]{1,2})[\-.]([0-9]{1,2})[\-.]([0-9]{4})\z/', trim($dmy), $dmy_array) ) {
return FALSE;
}
// Zeichenketten in Zahlen umwandeln
$year = intval( $dmy_array[3], 10 );
$month = intval( $dmy_array[2], 10 );
$dom = intval( $dmy_array[1], 10 );
// gültiges Jahr?
if ($year < 1583) {
return FALSE;
}
// gültiger Monat?
if ($month < 1 || $month > 12) {
return FALSE;
}
// gültiger Tag im Monat? ... etwas komplizierter ;-)
if ( in_array( $month, array (4,6,9,11), TRUE ) ) {
$days_in_month = 30;
}
elseif(2 === $dom) {
if (0 != $year % 4) $days_in_month = 28;
if (0 != $year % 100) $days_in_month = 29;
if (0 == $year % 400) $days_in_month = 29;
else $days_in_month = 28;
}
else {
$days_in_month = 31;
}
if ($dom < 1 || $dom > $days_in_month) {
return FALSE;
}
return array ($dom, $month, $year);
}
...und ggf. eine Fehlermeldung ausgeben?
$date = date_check_input($input_date);
if (!$date) {
printf('Irgendwas in deiner Datumsangabe "%s" stimmt nicht', $input_date);
}
/// weiter im Programm
Grüßchen
MffG(rins(-)chen)
EisFuX