Felix Riesterer: Verständnisfrage Formularvalidierung

Beitrag lesen

Liebe(r) cr87,

in Ergänzung zu meinen Vorrednern...

echo "<form accept-charset=\"utf-8\" action=\"\" method=\"post\">";
echo "<input type=\"text\" id=\"value\" name=\"value\" value=\"\" autocomplete=\"off\">";
echo "<input type=\"submit\">";
echo "</form>";

Das liest sich echt übel. Wenigstens ein bisschen schöner läse sich das hier:

$html = '<form accept-charset="utf-8" action="" method="post">'
  . '<input type="text" id="value" name="value" value="" autocomplete="off">'
  . '<input type="submit">'
  . '</form>';

echo $html;

Aber so will man das eigentlich nicht haben. Man will eigentlich PHP-Programmlogik und HTML-Code getrennt verwalten. Also speichert man den HTML-Code in einer HTML-Datei, deren Inhalt man dann einliest:

<form accept-charset="utf-8" action="" method="post">
  <input type="text" id="value" name="value" value="" autocomplete="off">
  <input type="submit">
</form>

Daran fällt dann auch sofort auf:

Also sollte Dein HTML eher so aussehen:

<form accept-charset="utf-8" action="" method="post">
  <p>
    <label>
      <span>Wert:</span>
      <input type="text" name="value" value="" autocomplete="off">
    </label>
  </p>
  <p>
    <button>Daten senden</button>
  </p>
</form>

So, jetzt haben wir ein besseres HTML und dazu auch noch in einer externen HTML-Datei. Wenn Du die Beschriftung nicht sehen willst, dann nutze CSS, um das span-Element für sehende Benutzer (und nur diese!) unsichtbar zu machen.

Jetzt holen wir uns das in unsere PHP-Programmlogik:

$form_html = file_get_contents(__DIR__.'/templates/form.html');

echo $form_html;

Natürlich will man das gesamte HTML erst am Ende der PHP-Programmlogik ausgeben. Warum? Unterwegs könnte es sich ergeben, dass man anstelle von HTML lieber JavaScript, CSS oder gar die Daten einer Bild- oder PDF-Datei ausgeben möchte. Das wird bei komplexeren PHP-Programmen durchaus angeboten. Auch wenn man mit Sessions arbeitet, zerschießen voreilige Ausgaben an den Browser die Möglichkeit an den Cookie-Daten oder anderen HTTP-Headern noch etwas zu schrauben.

$POST_value = ""; if(isset($_POST['value'])) { $POST_value = filter_input(INPUT_POST, 'value', FILTER_SANITIZE_STRING); }

Auch das liest sich sehr schlecht. Für die if-Anweisung solltest Du eine neue Zeile notieren. Immerhin verwendest Du geschweifte Klammern um die Anweisung innerhalb Deines if-Anweisungsblocks, obwohl nur eine Anweisung darin steht. Das ist als grundsätzliches Vorgehen sehr empfehlenswert.

Auch das Umkopieren in eine Variable verdeckt, wo Daten her kommen. Das ist bei Nutzereingaben konkret ein Sicherheitsrisiko, da Du den Daten später nicht mehr ansiehst, dass sie aus einer unsicheren Quelle kommen. Auch wenn Deine Variable im Namen noch POST enthält, so ist es aber nicht mehr das $_POST-Array. Arbeite lieber mit den originalen Daten bis kurz vor dem Speichern.

echo "1".$POST_value."<br><br>";
echo "2".htmlentities($POST_value)."<br><br>";
echo "3".$_POST['value'];

Nee, wenn Du Debugging betreiben willst, dann schreibe das besser in eine Textdatei, anstatt es im Browser auszugeben. Dann siehst Du genauer, was da passiert. Hier ein Vorschlag, wie ich das mache:

function debug () {
  $arg_list = func_get_args();

  foreach ($arg_list as $v) {

    file_put_contents(
      __DIR__.'/debug.txt',
      (is_string($v)
        ? $v
        : print_r($v, true) // true = no immediate output to browser
      ),
      FILE_APPEND
    );
  }
}

debug("Hallo Welt!\r\n", array(1,2,3,'vier','V',6),"============");

Die Funktion debug nimmt eine beliebige Menge an Argumenten entgegen und schreibt die übergebenen Werte in eine Textdatei, wobei jeder Schreibvorgang die Datei erweitert, anstatt vorhandene Inhalte zu überschreiben. Der obige Aufruf ergibt das hier:

Hallo Welt!
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => vier
    [4] => V
    [5] => 6
)
============

So könntest Du nun den kompletten Inhalt von $_POST ausgeben lassen:

debug("_POST: ",$_POST);

Liebe Grüße

Felix Riesterer