Supportnet Computer
Planet of Tech

Supportnet / Forum / Skripte(PHP,ASP,Perl...)

Generische Formularauswertung





Frage

Hallo alle zusammen, ich habe oft auf einer Website mehrere Formulare mit unterschiedlichen Feldern und Pflichtangaben. Daher hab ich ja entweder die Möglichkeit, für jedes Formular eine eigene Datei einzurichten, die das Formular auswertet, oder ich mach nur eine Datei, die z.B. ein hidden-feld auswertet und dementsprechend prüft. Gibt es auch eine Möglichkeit, über z.B. eine Schleife in einer Datei über alle Felder zu gehen und zu prüfen ob die Eingaben korrekt sind oder es ein Pflichtfeld ist? Gruß

Antwort 1 von rabies

Möglich ist das soweit sicher.

Du könntest Dir zum Beispiel ein Array erzeugen, in dem alle Pflichtfelder namentlich genannt werden.

Du könntest dann, je nachdem, wie Du die Daten bekommst, über POST, oder GET iterieren.

Für PHP im Falle eines mithilfe von POST übermittelten Formulares sehe das zum Beispiel so aus:
$required = array('name', 'vorname', 'email');

$form_okay = true;

foreach($_POST as $key => $value) {
  if(empty($value) && in_array($key, $required)) {
    // gebe Meldung aus, dass das Feld vom Namen $key ausgefüllt werden muss.
    echo '\'' . $key . '\' ist ein Pflichtfeld und wurde nicht ausgefüllt! ';
    $form_okay = false;
  }
}

if($form_okay) {
  // nehme Verarbeitung der Formulardaten vor.
}


Bei diesem Formular wären dann zum Beispiel die Felder namens "vorname", "name" und "email" required, also benötigt. Sobald eines der Felder leer, nicht ausgefüllt, wäre, würde die Verarbeitung der übergebenen Daten nicht vorgenommen werden.

--rabies.

Antwort 2 von Flos

Das ist schon mal super! Aber kann ich irgendwie innerhalb des Formulares festlegen, welches die Pflichtfelder sind, evtl schon innerhalb der Inputs oder notfalls mit einem Hidden Feld?

Antwort 3 von rabies

Ja, über ein hidden-Field, was zum Beispiel alle Namen von Formularfeldern, die benötigt werden, durch Komma getrennt auflistet, wäre das zum Beispiel möglich. Du müsstest Dann halt im Script, bevor Du über die Daten iterierst, das hidden-Field abfragen, und die darin enthaltenen Feldnamen "splitten".

Denkbar wäre hier folgendes:
$required = explode(', ', $_GET['required_fields']);

Wäre das selbe wie:
$required = array('name', 'vorname', 'email');

Wenn Du im HTML-Teil folgendes hidden-Field definiert hast:
<input type="hidden" name="required_fields" value="name, vorname, email" />

Vorraussetzung ist natürlich, dass das Formular in diesem Fall per GET übergeben wird. Um es allgemeingültig zu halten, kannst Du aber natürlich auch die Superglobale $_REQUEST verwenden, die dann sowohl per GET und POST übergebene Daten beinhaltet.


Auch vorstellbar wäre natürlich, wenn Du die Namen der Formularfelder, die Du brauchst, um zum Beispiel "_required" erweiterst.

Dann müsstest Du beim iterieren über die übergebenen Daten den $key jeweils auf /_required$/ matchen. Das kannst Du zum Beispiel mit der Funktion preg_match machen.

--rabies.

Antwort 4 von rabies

Aber nur um darauf noch hinzuweisen:

Findige Menschen könnten bei der ersten Version darauf kommen, das hidden-Field vor dem Absenden zu manipulieren (dazu gibt's einige Plugins für diverse Browser, u.a. Firebug für den Firefox kann das). So könnte man zum Beispiel aus dem value des hidden-Fields "required_fields" einfach einen, mehrere, oder alle Werte herauslöschen. Dann wären innerhalb des Scripts keine Felder als required definiert.

Beim matchen auf den Namen wäre das schon etwas komplizierter, also solltest Du Dich eventuell näher mit dieser Möglichkeit beschäftigen.

--rabies.

Antwort 5 von Flos

Tausend Dank für diese hilfreiche Antwort!

Antwort 6 von Flos

Doch nochmal ne Frage dazu:

Warum muss denn überhaupt in der ersten Version mit den Hidden Fields das Formular per GET übergeben werden?

Und noch ne andere Frage:

wenn ich es z.B. ohne Hidden Fields mache und mit dem Array arbeite (erster Post von dir), würde ich dann z.b. die Mail, die dann abschließend verschicke, auch mit einer Schleife zusammenbasteln, also den Text z.b. so:


$message = "";
foreach($_POST as $key => $value) {
    $message .= $key."\r".$value."\n";
}


Ist das dann nicht sehr unsicher? Wenn schon die Hidden Fields manipuliert werden können, könnte in $_POST doch auch irgendwas anderes drin stehen. ich müsste ja im prinzip nur ein neues Formular basteln mit eigenen Input-Feldern und da könnte ich ja alles reinschreiben was ich will. Können das Hacker für gefährliche Skripte oder so missbrauchen (Die Nachricht soll aber nur als reine Textnachricht versendet werden, kein HTML)?

Gruß

Antwort 7 von rabies

Es muss gar nicht, es kann.

Ich bin, um es für ein Beispiel zu vereinfachen, einfach davon ausgegangen, dass die Daten per GET übermittelt werden.

Du könntest natürlich auch genau so "required_fields" mit explode auseinandernehmen, wenn es per POST übermittelt wurde.

Aus diesem Grund auch der schon gemachte Hinweis:
Zitat:
Um es allgemeingültig zu halten, kannst Du aber natürlich auch die Superglobale $_REQUEST verwenden, die dann sowohl per GET und POST übergebene Daten beinhaltet.



Ja, es wäre unter Umständen möglich, dass ein Formular in der Hinsicht ausgenutzt wird.
Folgendes Szenario wäre möglich: "Hacker", nennen wir potentiell gefährliche Person XY folgend aber besser "Spammer", könnte nach Formularen Ausschau halten, die nach einer Emailadresse verlangen.

Wenn der Spammer ein solches Formular gefunden hat, könnte er sich anschauen, an welches Script mit welcher Methode das ganze geht. Eventuell verlangst Du in Deinem Script sogar noch nach einem Betreff, oder setzt ihn anderweitig, zum Beispiel über select/option-Felder.

Dann könnte sich der Spammer in der Tat ein eigenes Formular bauen, und Deinen Server/Webspace dazu nutzen, Nachrichten an jedermann schicken.

Antwort 8 von Flos

Das ist natürlich nicht so schön. Gibt es Möglichkeiten, um sowas zu verhindern? Eine Möglichkeit, die mir einfällt, ist ein Captcha, aber wie ich gehört habe, schreckt das die meisten Leute eher ab...