Ralf Weber: Keine leeren Formulareingaben

Um sicherzustellen, daß keine leeren Eingaben übertragen wurden, hatte ich

if ( isset($_POST['eingabe']) && !empty($_POST['eingabe'])

verwendet. Leider geht damit die Eingabe "0" nicht durch. Mit

if ( isset($_POST['eingabe']) && $_POST['eingabe']!="" )

geht es, aber ist dieses Verhalten, den String "0" bei empty als leer zu betrachten, nicht sinnlos? Eine Zahl 0 als leer zu betrachten kann ich noch nachvollziehen, beim String fehlt mir aber das Verständnis.

  1. Hi!

    Um sicherzustellen, daß keine leeren Eingaben übertragen wurden, hatte ich
    if ( isset($_POST['eingabe']) && !empty($_POST['eingabe'])
    verwendet.

    Und was wäre, wenn jemand ein Leerzeichen in das Eingabefeld eingetippt hat?
    Eventuell wäre eine Prüfung auf !empty(trim($_POST['eingabe'])) besser.

    aber ist dieses Verhalten, den String "0" bei empty als leer zu betrachten, nicht sinnlos? Eine Zahl 0 als leer zu betrachten kann ich noch nachvollziehen, beim String fehlt mir aber das Verständnis.

    PHP ist keine streng typisierte Sprache.
    Wie sollte erkannt werden, ob es sich bei dem übergebenen POST-Parameter um einen String, einen boolschen Wert, eine Ganzzahl oder sonstwas handelt?

    Führe einen typsicheren Vergleich durch. Mit $_POST['eingabe']!=="" sollte "0" bzw. 0 nicht mehr als leer angesehen werden (bzw. TRUE beim Vergleich mit deinem leeren String ergeben).

    Schöner Gruß,
    rob

    1. Hi!

      Hallo!

      Und was wäre, wenn jemand ein Leerzeichen in das Eingabefeld eingetippt hat?
      Eventuell wäre eine Prüfung auf !empty(trim($_POST['eingabe'])) besser.

      Das war nur ein Beispiel ohne jede Prüfung. Normalerweise mache ich das schon.

      PHP ist keine streng typisierte Sprache.

      Ich weiß.

      Wie sollte erkannt werden, ob es sich bei dem übergebenen POST-Parameter um einen String, einen boolschen Wert, eine Ganzzahl oder sonstwas handelt?

      Beim typsicheren Vergleich oder $_POST['eingabe'] != "" erkennt es doch auch richtig, welcher Typ abgefragt werden soll. Ich würde eben das gleiche Verhalten von empty() erwarten. Daß dem nicht so ist, was ich ja. Ich finde nur, PHP sollte nach dem Prinzip der geringsten Überraschung Argumente auswerten.

      Führe einen typsicheren Vergleich durch. Mit $_POST['eingabe']!=="" sollte "0" bzw. 0 nicht mehr als leer angesehen werden (bzw. TRUE beim Vergleich mit deinem leeren String ergeben).

      Wieso ergibt $_POST['eingabe']!=="" bei einem leeren String true? Um "0" durchzulassen langt aber schon $_POST['eingabe'] != "".

      1. Wieso ergibt $_POST['eingabe']!=="" bei einem leeren String true?

        Bei '===' als Vergleichsoperator liefert nur dann TRUE, wenn die beiden verglichenen Werte den selben Wert haben und der selbe Variablentyp sind. Z.B.: '"eins" === "eins"' liefert TRUE, aber '"1" === 1' liefert FALSE, da der erste Wert ein String und der zweite Integer ist, also nicht vom selben Variablentyp wie der erste. Wenn der User ein Formularfeld leerläßt, so wird es von PHP vielleicht nicht als leerer String, sondern als anderer Variablentyp interpretiert. Wenn du es dann mit einem leeren String vegleicht, liefert es somit FALSE, und bei '!==' TRUE, da dies ja nur die Negierung von '===' ist.

        mfg
        Rato

        --
        §§§
        Meine Postings basieren lediglich auf mein Wissen und können völliger Blödsinn sein.
        §§§
        1. Wieso ergibt $_POST['eingabe']!=="" bei einem leeren String true?

          Bei '===' als Vergleichsoperator liefert nur dann TRUE, wenn die beiden verglichenen Werte den selben Wert haben und der selbe Variablentyp sind. Z.B.: '"eins" === "eins"' liefert TRUE, aber '"1" === 1' liefert FALSE, da der erste Wert ein String und der zweite Integer ist, also nicht vom selben Variablentyp wie der erste.

          Ist bekannt.

          Wenn der User ein Formularfeld leerläßt, so wird es von PHP vielleicht nicht als leerer String,

          Was heißt denn hier vielleicht? Entweder hat PHP ein standardisiertes Verhalten, oder es ist vollkommen unberechenbar

          sondern als anderer Variablentyp interpretiert.

          Das habe ich noch nie gehört.

          Wenn du es dann mit einem leeren String vegleicht, liefert es somit FALSE, und bei '!==' TRUE, da dies ja nur die Negierung von '===' ist.

          So.

          $_Post['eingabe'] sei eine Leereingabe und kein String.

          Was für Typen außer Strings gibt es noch? Richtig. Zahlen. Was noch? Abgesehen von Handles usw. fällt mir nichts ein, was sich nicht auf Strings oder Zahlen als Grundtyp zurückführen läßt.

          Um zu beweisen, daß

          $_POST['eingabe']!=="" beim Vergleich mit leeren Strings nicht TRUE ergibt

          das

          <?php

          if (isset($_POST['eingabe']) && $_POST['eingabe'] !== "")
            echo "Eingabe: ".$_POST['eingabe']." ok.";
          else
            echo "Eingabe: ".$_POST['eingabe']." nicht ok.";

          ?>

          <form action="<?php echo $_SERVER['PHP_SELF']?>" method="post">

          <input type="text" name="eingabe">

          <input type="Submit" name="" value="">

          </form>

          Das durchläuft, wie zu erwarten war, bei einer leeren Eingabe den Else-Zweig, sonst immer den If-Teil. Somit muß $_POST['eingabe']!=="" beim Leerstring false sein. Rob hat also das Richtige gemeint, aber das Vergleichsergebnis falsch angegeben.

          Wenn $_POST['eingabe']!=="" nicht false ergäbe, würde es auch gar keinen Sinn machen. Der Vergleich $_POST['eingabe']!=="" testet nur auf $_POST['eingabe']=="" was true ergibt, verknüpft anschließend noch Typübereinstimmung (das ist hier ebenfalls true) als AND (bisher  true & true = true), zum Schluß wird negiert (also kommt false heraus). Würde beim Gesamtvergleich true bei leeren Eingaben herauskommen, wäre gar nicht zu entscheiden, ob es am ersten Teil des Vergleichs liegt (keine Eingabe oder Eingabe) oder am zweiten Teil (Typ).

          Wie ich auch schon geschrieben hatte, kann man die Zeile

          if (isset($_POST['eingabe']) && $_POST['eingabe'] !== "")

          auch auf

          if (isset($_POST['eingabe']) && $_POST['eingabe'] != "")

          reduzieren. Das führt stets zum gleichen Ergebnis, da, mir ist da nichts anderes bekannt, Post-Variablen immer als String übertragen werden.

          1. Hi!

            Was für Typen außer Strings gibt es noch? Richtig. Zahlen. Was noch? Abgesehen von Handles usw. fällt mir nichts ein, was sich nicht auf Strings oder Zahlen als Grundtyp zurückführen läßt.

            Das Kapitel über die verschiedenen Typen im PHP-Handbuch ist wahrscheinlich bekannt, nehme ich mal an.

            Im Anhang Q. findet man noch was Interessantes dazu: PHP type comparison tables
            Unter anderem steht da auch noch was zu dem empty-Verhalten:

            The string value "0" was considered non-empty in PHP 3, this behavior changed in PHP 4 where it's now seen as empty.

            Und dann ist dieser PHP-Variablen-Test sicherlich auch noch interessant.
            Dort findet man eine Tabelle, der man entnehmen kann, wie sich die verschiedenen Funktionen (u.a. auch empty() und isset()) bei den verschiedenen Type verhalten bzw. was sie zurückgeben.
            Ist eigentlich eine ganz schöne Übersicht.
            Die Ergebnisse der Tests auf der verlinkten Tabelle stammen von PHP 4.3.10.
            Die gleiche Tabelle mit der Version 5.2.0 gibt es hier.

            Schöner Gruß und gute Nacht,
            rob

            1. Hi!

              Was für Typen außer Strings gibt es noch? Richtig. Zahlen. Was noch? Abgesehen von Handles usw. fällt mir nichts ein, was sich nicht auf Strings oder Zahlen als Grundtyp zurückführen läßt.
              Das Kapitel über die verschiedenen Typen im PHP-Handbuch ist wahrscheinlich bekannt, nehme ich mal an.

              Ja. Wie ich sagte, außer den Sondertypen gibt es nichts weiteres als Strings und Zahlen.

              Im Anhang Q. findet man noch was Interessantes dazu: PHP type comparison tables
              Unter anderem steht da auch noch was zu dem empty-Verhalten:

              The string value "0" was considered non-empty in PHP 3, this behavior changed in PHP 4 where it's now seen as empty.

              Warum???

              Und dann ist dieser PHP-Variablen-Test sicherlich auch noch interessant.
              Dort findet man eine Tabelle, der man entnehmen kann, wie sich die verschiedenen Funktionen (u.a. auch empty() und isset()) bei den verschiedenen Type verhalten bzw. was sie zurückgeben.
              Ist eigentlich eine ganz schöne Übersicht.
              Die Ergebnisse der Tests auf der verlinkten Tabelle stammen von PHP 4.3.10.
              Die gleiche Tabelle mit der Version 5.2.0 gibt es hier.

              Wirklich schöne/ nützliche Übersichten, danke. In einem Buch habe ich auch so eine Tabelle, die aber leider an einigen Stellen fehlerhaft ist. Mal gucken, ob in den von Dir genannten Tabellen weniger Fehler sind.

              Eine Eingabe mit

              <?php
              if (strlen($_POST['var']) > 0) {
                  // form value is ok
              }
              ?>

              sicherzustellen ist natürlich auch noch eine Variante.

  2. Hi,

    ...Leider geht damit die Eingabe "0" nicht durch. Mit

    Angenommen die Variable sollte mindestens ein alphanumerisches Zeichen (0-9,a-z,A-Z) enthalten, könnte man es so etwa machen:

    ----------------
    <form action="">
    <input type="text" name="test">
    <input type="submit">
    <form>

    <?
    function checkVar($var_name){
      return(isset($_REQUEST[$var_name])&&preg_match("%[[:alnum:]+]%i",$_REQUEST[$var_name]));
    }

    var_dump(checkVar("test"));
    ----------------

    Gegebenfalls regulären Ausdruck anpassen!