Ralf Weber: Keine leeren Formulareingaben

Beitrag lesen

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.