Daniela: Eingabeüberpürfung

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.

Wie kann ich jetzt die Eingaben prüfen und ggf. eine Fehlermeldung ausgeben?

Danke für hilfreiche Tipps...

Grüßchen

  1. Hi,

    beim Datum prüfe ich mit eregi, meist reicht dies für meine Zwecke

    $pruefe_datum = "[1]{2}.[0-9]{2}.[0-9]{4}$";
    /* Erklärung Validierungsmuster Datum
    ^ = Startpunkt
    $ = Endpunkt
    [0-9]{2}* = 0-9 = nur Zahlen
    {2} = zwei Zahlen muß

    • = Endpunkt des Teilmusters
      . = Punkt als Muß (muß maskierter werden)
      */

    Fehlermeldung
     if(!eregi($pruefe_datum, $dat)) {$error[0] = "<div class='error'>Geben Sie bitte ein gültiges Datum an.</div>";}

    den error[0] als echo ausgeben.

    ich denke bei der Uhrzeit ginge das auch.

    Andy


    1. 0-9 ↩︎

  2. (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

    1. echo $begrüßung;

      // gültiges Jahr?
        // gültiger Monat?
        // gültiger Tag im Monat? ... etwas komplizierter ;-)

      Kleiner Hinweis: Es gibt die Funktion checkdate().

      echo "$verabschiedung $name";

      1. (Hallo|Hi(ho)|Tag|Mahlzeit) dedlfix,

        echo $begrüßung;

        // gültiges Jahr?
          // gültiger Monat?
          // gültiger Tag im Monat? ... etwas komplizierter ;-)

        Kleiner Hinweis: Es gibt die Funktion checkdate().

        Wow, die ist mir noch nicht aufgefallen. Könnte vielleicht daran liegen, dass ich lieber die Kalender-Funktionen als das Date-Time-Zeugs benutze, weil mir letztere etwas suspekt sind.

        Und checkdate() scheint sich an den PHP-internen proleptischen "Gregorianischen" Kalender zu halten, was aber auf der Handbuchseite nirgends erwähnt wird. Das dürfte zwar Daniela sicher nicht weiter stören (wer arbeitet schon mit Daten vor 1583?), aber irgendwie ist das nicht ganz korrekt, oder hab ich da was übersehen?

        MffG
        EisFuX

      2. Hallo

        Kleiner Hinweis: Es gibt die Funktion checkdate().

        Schön, dass das mal jemand sagt. Die Funktion scheint ja in der "Öffentlichkeit" recht unbekannt zu sein, dabei reicht sie für das Tagesgeschäft [1] vollkommen aus.

        [1] Geburtstag eines Benutzers, Bestell- oder Rechnungsdatum etc. pp. vor der Einführung des greg. Kalenders sollten recht unwahrscheinlich sein. Sollte man zumindest annehmen können.

        Tschö, Auge

        --
        Die deutschen Interessen werden am Liechtenstein verteidigt.
        Veranstaltungsdatenbank Vdb 0.2
        1. (Hallo|Hi(ho)|Tag) Auge,

          Kleiner Hinweis: Es gibt die Funktion checkdate().

          Schön, dass das mal jemand sagt. Die Funktion scheint ja in der "Öffentlichkeit" recht unbekannt zu sein, ...

          Und dabei steht sie in der Liste der Datums-und-Zeitfunktionen an oberster Stelle -- ist also kaum zu übersehen. Aber manchmal sieht man eben den Wald vor lauter Bäumen nicht. ;-)

          dabei reicht sie für das Tagesgeschäft [1] vollkommen aus.

          Hilfreich ist sie ja unbestritten, aber __vollkommen__ ausreichen tut sie nicht.

          [1] Geburtstag eines Benutzers, Bestell- oder Rechnungsdatum ...

          Sollten solche Eingaben nicht auf Plausibilität geprüft werden? Wenn zum Beispiel heute (2008-04-04) jemand ein Geburts- oder Rechnungsdatum eintippt, das im Jahr 2020 liegt, stört das checkdate() nicht im Geringsten.

          Ähnliches gilt für den umgekehrten Fall: Stell dir vor, dein Skript nimmt Hotelbuchungen entgegen. Die sollten doch frühestens auf den heutigen (oder morgigen) Tag fallen. checkdate() hätte kein Problem mit einem Buchungsdatum, das in der Vergangenheit liegt ...

          Alleine reicht checkdate() also nicht aus. Man wird nicht umhinkommen, eine Funktion drumherum zu bauen, die offensichtliche Eingabefehler abfängt.

          ... etc. pp. vor der Einführung des greg. Kalenders sollten recht unwahrscheinlich sein. Sollte man zumindest annehmen können.

          Im Prinzip ja, aber in der Türkei oder in Russland beispielsweise wurde der gregorianische Kalender erst im frühen 20. Jahrhundert eingeführt. Und Geburtsdaten um 1916 oder 1917 kommen schon noch vor -- es muss ja nicht immer das eigene Geburtsdatum sein, was eingegeben wird. Es kommt halt darauf an, welche Art von Datum so ein Programm entgegennimmt.

          MffG
          EisFuX

          1. Hallo

            dabei reicht sie für das Tagesgeschäft [1] vollkommen aus.
            Hilfreich ist sie ja unbestritten, aber __vollkommen__ ausreichen tut sie nicht.

            nichts ist vollkommen, deswegen stimmt Dein Satz.
            Für mein Tagesgeschäft reichte sie bisher immer :-)

            [1] Geburtstag eines Benutzers, Bestell- oder Rechnungsdatum ...
            Sollten solche Eingaben nicht auf Plausibilität geprüft werden? Wenn zum Beispiel heute (2008-04-04) jemand ein Geburts- oder Rechnungsdatum eintippt, das im Jahr 2020 liegt, stört das checkdate() nicht im Geringsten.

            Das kann auch nicht im Interesse dieser Funktion sein.
            Das will sie nicht können. Sie behauptet auch nicht, dass sie es kann.
            Das ist in Ordnung.

            Alleine reicht checkdate() also nicht aus.

            Wofür? Für das, was sie ohnehin nicht prüfen will?

            ... etc. pp. vor der Einführung des greg. Kalenders sollten recht unwahrscheinlich sein. Sollte man zumindest annehmen können.

            Im Prinzip ja, aber in der Türkei oder in Russland beispielsweise wurde der gregorianische Kalender erst im frühen 20. Jahrhundert eingeführt. Und Geburtsdaten um 1916 oder 1917 kommen schon noch vor -- es muss ja nicht immer das eigene Geburtsdatum sein, was eingegeben wird. Es kommt halt darauf an, welche Art von Datum so ein Programm entgegennimmt.

            Und welches Problem siehst Du da? Kombinierte Prüfung, ob jemand ein lokales Geburtsdatum eingegeben hat, das es dort nicht gab? Ich bestreite die Relevanz für das Tagesgeschäft. Wer überprüft diese Kombination im Tagesgeschäft?

            Meine Erfahrung mit Geburtsdaten aus dem angesprochenen Raum ist die, dass der 1. Januar überproportional häufig vorkommt :-)

            Freundliche Grüße

            Vinzenz

          2. Hallo

            (Hallo|Hi(ho)|Tag) Auge,

            Nicht mehr um diese Un-/Uhrzeit. ;-)

            Kleiner Hinweis: Es gibt die Funktion checkdate().

            Schön, dass das mal jemand sagt. Die Funktion scheint ja in der "Öffentlichkeit" recht unbekannt zu sein, ...
            Und dabei steht sie in der Liste der Datums-und-Zeitfunktionen an oberster Stelle -- ist also kaum zu übersehen. Aber manchmal sieht man eben den Wald vor lauter Bäumen nicht. ;-)

            Jaja, so ist das.

            dabei reicht sie für das Tagesgeschäft [1] vollkommen aus.

            Hilfreich ist sie ja unbestritten, aber __vollkommen__ ausreichen tut sie nicht.

            [1] Geburtstag eines Benutzers, Bestell- oder Rechnungsdatum ...
            Sollten solche Eingaben nicht auf Plausibilität geprüft werden? Wenn zum Beispiel heute (2008-04-04) jemand ein Geburts- oder Rechnungsdatum eintippt, das im Jahr 2020 liegt, stört das checkdate() nicht im Geringsten.

            Dazu ist die Funktion nicht da ... aber das sagte Vinzenz ja schon.

            Alleine reicht checkdate() also nicht aus. Man wird nicht umhinkommen, eine Funktion drumherum zu bauen, die offensichtliche Eingabefehler abfängt.

            Ohne Frage.

            ... etc. pp. vor der Einführung des greg. Kalenders sollten recht unwahrscheinlich sein. Sollte man zumindest annehmen können.

            Im Prinzip ja, aber in der Türkei oder in Russland beispielsweise wurde der gregorianische Kalender erst im frühen 20. Jahrhundert eingeführt. Und Geburtsdaten um 1916 oder 1917 kommen schon noch vor -- es muss ja nicht immer das eigene Geburtsdatum sein, was eingegeben wird. Es kommt halt darauf an, welche Art von Datum so ein Programm entgegennimmt.

            Also bitte, dieser Fall ist nicht ausgeschlossen (mir als geborenem DDR-Bürger ist durchaus bekannt, dass in Sowjetrussland der greg. Kalender erst 1918 eingeführt wurde), aber sehr unwahrscheinlich. Man könnte auch den unübersehbaren Hinweis auf die Notwendigkeit der Eingabe als greg. Datum hinterlassen. Allgemein ist zu sagen, dass der, der sein Geburtsdatum nach julianischem Datum eingibt, wahrscheinlich auch nicht dazuschreiben wird, dass es sich um ein solches handelt. Wer will nun entscheiden, nach welchem Kalender das betreffende Datum eingegeben wurde, hier (in DE), wo diese Umstellung in den meisten Landstrichen 1582 stattfand?

            Tschö, Auge

            --
            Die deutschen Interessen werden am Liechtenstein verteidigt.
            Veranstaltungsdatenbank Vdb 0.2
            1. Hallo

              Wer will nun entscheiden, nach welchem Kalender das betreffende Datum eingegeben wurde, ...

              besonders

              ... hier (in DE), wo diese Umstellung in den meisten Landstrichen 1582 stattfand?

              Tschö, Auge

              --
              Die deutschen Interessen werden am Liechtenstein verteidigt.
              Veranstaltungsdatenbank Vdb 0.2
    2. Ich nochmal ...

        
      /// Rückgabe im Fehlerfall: FALSE;  
      /// Rückgabe im Erfolgsfall: ARRAY ($day_of_month, $month, $year)  
      function date_check(  
        $dmy // dom-month-year, format: DD.MM.YYYY  
      ) {  
        if ( !preg_match('/\A([0-9]{1,2})[\-.]([0-9]{1,2})[\-.]([0-9]{4})\z/', trim($dmy), $dmy_array) ) {  
          return FALSE;  
        }  
        
        $year  = intval( $dmy_array[3], 10 );  
        $month = intval( $dmy_array[2], 10 );  
        $dom   = intval( $dmy_array[1], 10 );  
        
        if ( !checkdate($month, $dom, $year) ) {  
          return FALSE;  
        }  
        return array ($dom, $month, $year);  
      }  
      
      

      Das sieht tatsächlich kürzer aus als die umständliche (und korrigierte Variante) Variante von mir:

        
      /// 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;  
        }  
        // hier stand vorher fälschlicherweise $dom statt $month  
        elseif(2 === $month) {  
          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);  
      }  
      
      

      ... ist zwar länger (und umständlicher) aber pädagogisch wertvoller. ;-) Und wer es ganz genau nimmt, kann die Funktion so umbauen, dass sie mitteilt, in welchem Teil (Tag, Monat, Jahr) des eingegebenen Datums der Fehler steckte.

      MffG
      EisFuX

    3. Hallo,

      function date_check_input(
        $dmy // dom-month-year, format: DD-MM-YYYY
      ) {
        // Eingabeformat prüfen
        if ( !preg_match('/\A([0-9]{1,2})-.-.\z/', trim($dmy), $dmy_array) ) {

      wie wäre es mit dem schnuckligen RegExp von Seth?
      Format allerdings Jahre-MM-DD, Jahre nicht auf maximal vier Stellen festgelegt.

      Freundliche Grüße

      Vinzenz