Yadgar: Problem mit Überprüfung von Formulardaten

High!

Folgende Ausgangssituation:
Ein Formular mit vier Eingabeelementen:

1. Titel (Textzeile)
2. Interpret (Auswahlmenü, aus MySQL-Abfrage generiert)
3. Dauer Minuten (Textzeile)
4. Dauer Sekunden (Textzeile)

Angaben für 1. und 2. sind obligatorisch, 3. und 4. sind optional.
Wenn Daten bei 3. und 4. eingegeben werden, sollen sie auf korrekte Werte überprüft werden - also Minuten zwischen einschließlich 0 und 255 (die empfangende MySQL-Datenbank verwendet für das Minuten-Feld TINYINT), Sekunden zwischen einschließlich 0 und 59.

Abgefangen werden sollen also bei 3. alle $DauerMinuten, für die gilt:

  • nicht leer
  • ist ein Integer-Wert
  • kleiner als 0 oder größer als 255

Auf PHP:

  
if ($DauerMinuten && (!is_integer($DauerMinuten) || $DauerMinuten < 0 || $DauerMinuten > 255))  
{  
  echo "Bitte geben Sie eine Zahl zwischen 0 und 255 ein.<br>"  
}  

Merkwürdigerweise wird aber jetzt *jede* Eingabe, auch solche mit korrekten Minutenwerten, abgefangen - warum?

Mit ereg() wäre es wahrscheinlich noch komplizierter...

Bis bald im Khyberspace!

Yadgar

  1. 'ǝɯɐu$ ıɥ

    if ($DauerMinuten && (!is_integer($DauerMinuten) || $DauerMinuten < 0 || $DauerMinuten > 255))
    {
      echo "Bitte geben Sie eine Zahl zwischen 0 und 255 ein.<br>"
    }

    
    >   
    > Merkwürdigerweise wird aber jetzt \*jede\* Eingabe, auch solche mit korrekten Minutenwerten, abgefangen - warum?  
      
    Nicht Merkwürdigerweise, es tut das was du ihm gesagt hast. Lies dir das doch mal Laut vor, dann merkst du den unterschied zwischen deiner Vorstellung und dem was du geschrieben hast.  
      
    ssnɹƃ  
    ʍopɐɥs
    
    -- 
    Gestern noch zu blöd, den Computer einzuschalten,  
    heute schon die eigene Homepage.
    
    1. if ($DauerMinuten && (!is_integer($DauerMinuten) || $DauerMinuten < 0 || $DauerMinuten > 255))
      {
        echo "Bitte geben Sie eine Zahl zwischen 0 und 255 ein.<br>"
      }

      
      > >   
      > > Merkwürdigerweise wird aber jetzt \*jede\* Eingabe, auch solche mit korrekten Minutenwerten, abgefangen - warum?  
      >   
      > Nicht Merkwürdigerweise, es tut das was du ihm gesagt hast. Lies dir das doch mal Laut vor, dann merkst du den unterschied zwischen deiner Vorstellung und dem was du geschrieben hast.  
        
      Ich kann da keinen Fehler finden, tut mir leid... ein Wert von z. B. 45 wäre nicht leer (erste Bedingung erfüllt), nicht Nicht-Integer, aber gleichzeitig weder kleiner als 0 noch größer als 255 - Bedingung in der inneren Klammer NICHT erfüllt - also sollte der Codeblock übersprungen werden! Habe ich eventuell Prioritäten von Operatoren nicht beachtet? && hat doch eine höhere Priorität als || und ! bindet nicht den ganzen Term in der Klammer...  
        
      ...oder bin ich wirklich zu dumm zum Programmieren und sollte vorsichtshalber schon mal ein Ticket auf einer Zeitmaschine nach [ZENSIERT] buchen?
      
      1. Hi Yadgar,

        if ($DauerMinuten && (!is_integer($DauerMinuten) || $DauerMinuten < 0 || $DauerMinuten > 255))

        Ich würde "!is_integer($DauerMinuten)" weglassen, sofern Du
        der Variablen $DauerMinuten den Wert $_POST('Dein Input Feld')
        vorher zuweist. $DauerMinuten ist sowieso gesetzt und
        gleichzeitig immer ein String. Dementsprechend ist !is_integer($DauerMinuten)
        immer wahr.

        Zusammenfassend: $DauerMinuten && (!is_integer($DauerMinuten) || [...] || [...] )

        ist immer true!

        Bedankt

        ---------------------------------------------------------------------

        • ATECore v1.0 (OSource) - cr0$$
        1. High!

          Zusammenfassend: $DauerMinuten && (!is_integer($DauerMinuten) || [...] || [...] )

          ist immer true!

          Aha, wieder etwas gelernt: von HTML-Formularen übergebene Daten sind IMMER Strings, niemals Zahlenwerte!

          Ich habe mir jedenfalls mit ereg("[^0-9]", $DauerMinuten) beholfen...

          Und Vinzenz Mai meinte, ereg() sei veraltet... ist das für die Praxis relevant oder eher etwas für die Verfechter der ganz reinen Lehre? Ich fürchte, dass mein Bart für eine derartige Orthodoxie doch noch etwas kurz ist...

          Bis bald im Khyberspace!

          Yadgar

          1. Hi!

            Und Vinzenz Mai meinte, ereg() sei veraltet... ist das für die Praxis relevant oder eher etwas für die Verfechter der ganz reinen Lehre?

            Die POSIX-kompatiblen Funktionen für reguläre Ausdrücke (z.B: ereg*) sind spätestens mit PHP 5.3 veraltet - es wird aber schon seit "Ewigkeiten" empfohlen die Perl-kompatiblen (PCRE) zu verwenden.

            Aus dem Handbuch zu POSIX-RegEx:

            "Tipp
            Bei Verwendung der PCRE Funktionen unterstützt PHP auch Reguläre Ausdrücke mit einer zu Perl kompatiblen Syntax. Diese Funktionen unterstützen nicht-gieriges (non-greedy) Matching, Assertions, bedingte Teilsuchmuster und viele andere Merkmale, die von der POSIX-erweiterten Syntax regulärer Ausdrücke nicht unterstützt werden.

            Warnung
            Diese Funktionen regulärer Ausdrücke sind im Gegensatz zu den PCRE Funktionen nicht binärsicher."

            off:PP

            --
            "You know that place between sleep and awake, the place where you can still remember dreaming?" (Tinkerbell)
            1. Hi,

              Und Vinzenz Mai meinte, ereg() sei veraltet... ist das für die Praxis relevant oder eher etwas für die Verfechter der ganz reinen Lehre?
              Die POSIX-kompatiblen Funktionen für reguläre Ausdrücke (z.B: ereg*) sind spätestens mit PHP 5.3 veraltet - es wird aber schon seit "Ewigkeiten" empfohlen die Perl-kompatiblen (PCRE) zu verwenden.

              Ich meine, mal gelesen zu haben, daß geplant ist, die ereg-Funktionen ab PHP 6 nicht mehr anzubieten.

              cu,
              Andreas

              --
              Warum nennt sich Andreas hier MudGuard?
              O o ostern ...
              Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
              1. Hi!

                Und Vinzenz Mai meinte, ereg() sei veraltet... ist das für die Praxis relevant oder eher etwas für die Verfechter der ganz reinen Lehre?
                Die POSIX-kompatiblen Funktionen für reguläre Ausdrücke (z.B: ereg*) sind spätestens mit PHP 5.3 veraltet - es wird aber schon seit "Ewigkeiten" empfohlen die Perl-kompatiblen (PCRE) zu verwenden.

                Ich meine, mal gelesen zu haben, daß geplant ist, die ereg-Funktionen ab PHP 6 nicht mehr anzubieten.

                PHP 6? Wer weiß schon was 2023 so angesagt ist? Wahrscheinlich wird kurz vorher HTML 5 als Standard verabschiedet;-)

                off:PP

                --
                "You know that place between sleep and awake, the place where you can still remember dreaming?" (Tinkerbell)
          2. Mahlzeit Yadgar,

            Aha, wieder etwas gelernt: von HTML-Formularen übergebene Daten sind IMMER Strings, niemals Zahlenwerte!

            Das war schon immer so.

            Ich habe mir jedenfalls mit ereg("[^0-9]", $DauerMinuten) beholfen...

            Zitat 1418

            Und Vinzenz Mai meinte, ereg() sei veraltet... ist das für die Praxis relevant oder eher etwas für die Verfechter der ganz reinen Lehre?

            1.) Ich würde erwarten, dass in einer Variable wie $DauerMinuten ein bereits validierter Wert enthalten ist. Das wäre der einzige für mich nachvollziehbare und legitime Grund, warum aus einem $_POST['DauerMinuten'] ein $DauerMinuten gemacht wird.

            2.) Warum tust Du o.g. nicht einfach, indem Du z.B. im (E)ingabeteil Deines Skripts einfach $DauerMinuten = [link:http://www.php.net/manual/de/function.intval.php@title=intval]($_POST['DauerMinuten']); zuweist und anschließend beliebig überprüftst, ob dieser dann numerische Wert Deinen Vorstellungen entspricht?

            MfG,
            EKKi

            --
            sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
  2. Hallo,

    Abgefangen werden sollen also bei 3. alle $DauerMinuten, für die gilt:

    warum kopierst Du mal wieder um?

    • nicht leer
    • ist ein Integer-Wert
    • kleiner als 0 oder größer als 255

    [code lang=php]
    if ($DauerMinuten && (!is_integer($DauerMinuten) || $DauerMinuten < 0 || $DauerMinuten > 255))

    schreibe eine Funktion! Die Prüfung auf Sekunden erfolgt exakt gleich.

    {
      echo "Bitte geben Sie eine Zahl zwischen 0 und 255 ein.<br>"

    Es ist viel sinnvoller einen Wert zurückzugeben als etwas auszugeben (EVA-Prinzip).

    Merkwürdigerweise wird aber jetzt *jede* Eingabe, auch solche mit korrekten Minutenwerten, abgefangen - warum?

    völlig klar. $DauerMinuten ist ganz sicher eine Zeichenkette und somit ist dein Ausdruck in den Klammern stets wahr ...

    Mit ereg() wäre es wahrscheinlich noch komplizierter...

    ereg() und Konsorten benutzt man gar nicht mehr. Diese sind veraltet.

    Freundliche Grüße

    Vinzenz

    1. High!

      völlig klar. $DauerMinuten ist ganz sicher eine Zeichenkette und somit ist dein Ausdruck in den Klammern stets wahr ...

      Aha... also habe ich es mit einem Cast nach integer versucht... aber leider werden jetzt auch Eingaben von Buchstabenketten in Ganzzahlen umgewandelt, die doch eigentlich hätten abgefangen werden sollen!

      Gibt es eine Möglichkeit, ein HTML-Eingabeelement für [A-ZÄÖÜßa-zäöü] zu sperren?

      Ach ja, du sagtest, ereg() wäre völlig out heutzutage... was benutzt man stattdessen? Sind reguläre Ausdrücke wenigstens noch aktuell, oder kann ich das Wissen darum auch gleich aus dem Hirn formatieren?

      Bis bald im Khyberspace!

      Yadgar

      1. <Ingrid>
        High!

        Gibt es eine Möglichkeit, ein HTML-Eingabeelement für [A-ZÄÖÜßa-zäöü] zu sperren?

        Das zwar nicht... aber in Oldschool-PHP kann man schreiben ereg("[^0-9]", $DauerMinuten) und fängt damit zuverlässig alle Eingaben ab, die nicht nur aus Zahlen bestehen!

        Bis bald im Khyberspace!

        Yadgar
        </Ingrid>

  3. Hallo,

    [...] Sekunden zwischen einschließlich 0 und 59.

    sicher? Ganz sicher?
    Ich weiß nicht, ob ich mit meiner Meinung allein stehe - aber ich mag gemischte Angaben nicht. Ich würde mir daher wünschen, das Minuten-Feld frei lassen zu dürfen und stattdessen im Sekunden-Feld 148 eintragen zu dürfen. Denn 148 Sekunden ist für mich klarer und "griffiger" als 2'28".

    Ciao,
     Martin

    --
    Zucker ist das Zeug, das den Kaffee bitter macht, wenn man es weglässt.
    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
    1. Hallo Martin,

      [...] Sekunden zwischen einschließlich 0 und 59.

      sicher? Ganz sicher?

      ich glaube schon, dass Yadgar sich sicher ist. Bei Tracklängen ist das völlig üblich.

      Ich weiß nicht, ob ich mit meiner Meinung allein stehe - aber ich mag gemischte Angaben nicht. Ich würde mir daher wünschen, das Minuten-Feld frei lassen zu dürfen und stattdessen im Sekunden-Feld 148 eintragen zu dürfen. Denn 148 Sekunden ist für mich klarer und "griffiger" als 2'28".

      sowas ist hingegen im genannten Umfeld gar nicht üblich und bedeutet (Kopf-) Rechenaufwand.

      Freundliche Grüße

      Vinzenz

      1. Hi,

        [...] Sekunden zwischen einschließlich 0 und 59.
        sicher? Ganz sicher?
        ich glaube schon, dass Yadgar sich sicher ist. Bei Tracklängen ist das völlig üblich.

        ja, ich weiß. Aber schon bei Filmlängen scheiden sich die Geister. Manche geben die Spieldauer eines Films als 1:54 an, DVD-Cover und TV-Programmzeitschriften aber meist als 114min. Und Winamp gibt auch die Spieldauer eines Audio-Tracks im GUI als min:sec an, in den Detailinformationen aber nur in Sekunden.

        Ich würde mir daher wünschen, das Minuten-Feld frei lassen zu dürfen und stattdessen im Sekunden-Feld 148 eintragen zu dürfen. Denn 148 Sekunden ist für mich klarer und "griffiger" als 2'28".
        sowas ist hingegen im genannten Umfeld gar nicht üblich

        Das mag sein.

        und bedeutet (Kopf-) Rechenaufwand.

        Im Gegenteil. Der Kopfrechenaufwand entfällt. Es sei denn, man ist auf Minuten als Bezugsgröße "geeicht". Ich kann aber mit Sekunden mehr anfangen.
        Das ist wie mit Drehzahlangaben bei Maschinen: Üblich ist eine Angabe in 1/min. Das ist zum Vergleichen okay. Wenn ich mir die Drehzahl aber wirklich anschaulich vorstellen will, muss ich sie in 1/sec umrechnen. 3500/min ist für mich ein Zahlenwert, unter dem ich mir nicht viel vorstellen kann. Wenn ich umrechne und knapp 60/sec herausbekomme, ist das für mich wesentlich anschaulicher.

        Ciao,
         Martin

        --
        Ich stehe eigentlich gern früh auf. Außer morgens.
        Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
        1. hi Martin,

          Im Gegenteil. Der Kopfrechenaufwand entfällt. Es sei denn, man ist auf Minuten als Bezugsgröße "geeicht". Ich kann aber mit Sekunden mehr anfangen.
          Das ist wie mit Drehzahlangaben bei Maschinen: Üblich ist eine Angabe in 1/min. Das ist zum Vergleichen okay. Wenn ich mir die Drehzahl aber wirklich anschaulich vorstellen will, muss ich sie in 1/sec umrechnen. 3500/min ist für mich ein Zahlenwert, unter dem ich mir nicht viel vorstellen kann. Wenn ich umrechne und knapp 60/sec herausbekomme, ist das für mich wesentlich anschaulicher.

          Sehr schön, Du rechnest mit Herz ;)

          Horst Hertz

          Eselsbrücke:
          3000 U/min ist der otimale Drehzahlbereich der meisten Verbrennungsmaschinen. Das sind 50 Hz. Stichwort Notstromaggegat.

        2. Hi!

          Im Gegenteil. Der Kopfrechenaufwand entfällt. Es sei denn, man ist auf Minuten als Bezugsgröße "geeicht". Ich kann aber mit Sekunden mehr anfangen.

          Für mich sind die Minuten anschaulicher (zumindest in Größenordnungen wie bei Tracks).
          Allerdings würde ich Minuten und Sekunden nicht in zwei verschiedene Felder speichern. Entweder Sekunden als Zahl speichern und bei der Ausgabe umrechnen (IMHO die bessere Variante, dann lässt sich die Ausgabe auch jederzeit ändern), oder (wenn damit nicht gerechnet wird) ggf. auch gleich als fertigen String (spart die Behandlung bei der Ausgabe).

          Viele Grüße,
          Alex

        3. Hello,

          ja, ich weiß. Aber schon bei Filmlängen scheiden sich die Geister. Manche geben die Spieldauer eines Films als 1:54 an, DVD-Cover und TV-Programmzeitschriften aber meist als 114min. Und Winamp gibt auch die Spieldauer eines Audio-Tracks im GUI als min:sec an, in den Detailinformationen aber nur in Sekunden.

          Ich habe immer die Framenummer benötigt, als ich noch mit Videoschnitt herumhantiert habe... :-P

          Liebe Grüße aus dem schönen Oberharz

          Tom vom Berg

          --
           ☻_
          /▌
          / \ Nur selber lernen macht schlau
          http://bergpost.annerschbarrich.de