Überprüfen, ob das Formular gesendet wurde - PHP

122

Wie kann am besten überprüft werden, ob ein Formular gesendet wurde oder nicht, um festzustellen, ob ich die Variablen des Formulars an meine Validierungsklasse übergeben soll?

Zuerst dachte ich vielleicht:

isset($_POST)

Aber das wird immer wahr sein, da überall ein Superglobal definiert ist. Ich möchte nicht jedes Element meines Formulars durchlaufen müssen mit:

if(isset($_POST['element1']) || isset($_POST['element2']) || isset(...etc

Während ich diese Frage schrieb, dachte ich an eine viel grundlegendere Lösung. Fügen Sie ein verstecktes Feld hinzu, um als Flag zu fungieren, das ich überprüfen kann.

Gibt es einen saubereren Weg, als meine eigene Flagge hinzuzufügen?

Anonym
quelle
4
Nun, Sie könnten eine submitedif(isset($_POST['submited']))
Max Allan
2
Sie sollten einen Nounce hinzufügen, um Wiederholungsangriffe auf Ihr Formular zu verhindern.
hakre

Antworten:

191

Zur allgemeinen Überprüfung, ob eine POSTAktion vorhanden war, verwenden Sie:

if (!empty($_POST))

BEARBEITEN : Wie in den Kommentaren angegeben, funktioniert diese Methode in einigen Fällen nicht (z. B. mit Kontrollkästchen und Schaltfläche ohne Namen). Sie sollten wirklich verwenden:

if ($_SERVER['REQUEST_METHOD'] == 'POST')
Matino
quelle
168

Wie wäre es mit

if($_SERVER['REQUEST_METHOD'] == 'POST')
Olaf
quelle
69

Tatsächlich führt die Schaltfläche "Senden" diese Funktion bereits aus.

Versuchen Sie es im FORMULAR:

<form method="post">
<input type="submit" name="treasure" value="go!">
</form>

Dann im PHP-Handler:

if (isset($_POST['treasure'])){
echo "treasure will be set if the form has been submitted (to TRUE, I believe)";
}
Tzshand
quelle
6
Dies ist die richtige Antwort. Nur nach $ _POST zu suchen, ist nicht gut genug, da es an verschiedenen Stellen generiert werden könnte ... nicht nur aus einem Formularbeitrag. Danke Tzshand.
Houston
Idealerweise sollten Sie jetzt verwenden, if (null !== (filter_input(INPUT_POST, 'macaddress'))){was Sie zur Gewohnheit macht, filter_input
depicus
2
POST kann mit Ajax durchgeführt werden, das keine Schaltfläche zum Senden hat. Dies ist also keine universelle Lösung.
Muhammad bin Yusrat
Das ist richtig; Es kann auch jede von AJAX veröffentlichte Variable überprüfen.
Tzshand
34

Verwenden

if(isset($_POST['submit'])) // name of your submit button
Rikesh
quelle
1
Die einfachste Lösung. Alle Formulare sollten einen Senden-Button haben!
Anh Tran
1
Einige Formulare können jedoch mehrere Schaltflächen haben.
Progrock
2
@rilwis manchmal Formulare werden von JavaScript gesendet und brauchen / haben keine Schaltfläche zum
Senden
28

if ($_SERVER['REQUEST_METHOD'] == 'POST').

CodeCaster
quelle
14

Versuche dies

 <form action="" method="POST" id="formaddtask">
      Add Task: <input type="text"name="newtaskname" />
      <input type="submit" value="Submit"/>
 </form>

    //Check if the form is submitted
    if($_SERVER['REQUEST_METHOD'] == 'POST' && !empty($_POST['newtaskname'])){

    }
rizon
quelle
2
Diese Methode wird am meisten empfohlen, da sie von der "Coding Academy" als "Best Practice" anerkannt zu werden scheint.
Darkeden
1

In einem anderen Fall ist es auch immer eine gute Praxis, Ihrem Formular ein Token hinzuzufügen und es zu überprüfen, um zu überprüfen, ob die Daten nicht von außerhalb gesendet wurden. Hier sind die Schritte:

  1. Generieren Sie ein eindeutiges Token (Sie können Hash verwenden). Beispiel:

    $token = hash (string $algo , string $data [, bool $raw_output = FALSE ] );
  2. Weisen Sie dieses Token einer Sitzungsvariablen zu. Ex:

    $_SESSION['form_token'] = $token;
  3. Fügen Sie eine versteckte Eingabe hinzu, um das Token zu senden. Ex:

    input type="hidden" name="token" value="{$token}"
  4. Überprüfen Sie dann im Rahmen Ihrer Validierung, ob das übermittelte Token mit der Sitzungsvariablen übereinstimmt.

    Ex: if ( $_POST['token'] === $_SESSION['form_token'] ) ....
Professor
quelle
0

Ich hatte das gleiche Problem - stellen Sie auch sicher, dass Sie name=""die Eingabetaste hinzufügen . Nun, dieses Update hat bei mir funktioniert.

if($_SERVER['REQUEST_METHOD'] == 'POST' && !empty($_POST['add'])){
    echo "stuff is happening now";
}

<input type="submit" name="add" value="Submit">
Jen
quelle
-6

Sie könnten auch verwenden:

is_array($_POST)
SW4
quelle
4
is_array($_POST)gibt immer wahr (auf meiner Maschine). Laut stackoverflow.com/questions/5594020/php-check-if-post-is-array : $_POST is a superglobal array which is always defined, unless somewhere in your code you either unset or overwrite $_POST somehowscheint also zu erwarten, dass dies immer wahr ist ..
GitaarLAB
is_array($_POST)ist definitiv nicht der Weg zu überprüfen, ob das Formular gesendet wurde.
Lukas