Sprawdzanie, czy formularz został przesłany - PHP

122

Jaki jest najlepszy sposób sprawdzenia, czy formularz został przesłany, czy nie, aby określić, czy powinienem przekazać zmienne formularza do mojej klasy walidacji?

Najpierw pomyślałem, że może:

isset($_POST)

Ale to zawsze wróci prawdą, ponieważ superglobal jest zdefiniowany wszędzie. Nie chcę powtarzać każdego elementu mojego formularza za pomocą:

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

Pisząc to pytanie, pomyślałem o dużo bardziej podstawowym rozwiązaniu, dodając ukryte pole, które będzie działać jako flaga, którą mogę sprawdzić.

Czy jest na to „czystszy” sposób niż dodanie własnej flagi?

Anonimowy
źródło
4
Cóż, możesz utworzyć przycisk przesyłania, który ma określoną nazwę, na przykład, submiteda następnie użyć php if(isset($_POST['submited']))lub ukrytego wejścia ...
Max Allan
2
Powinieneś dodać rzeczownik, aby zapobiec atakom powtórek na formularzu.
hakre

Odpowiedzi:

191

Aby sprawdzić, czy było jakieś POSTdziałanie, użyj:

if (!empty($_POST))

EDYCJA : Jak stwierdzono w komentarzach, ta metoda nie będzie działać w niektórych przypadkach (np. Z polami wyboru i przyciskiem bez nazwy). Naprawdę powinieneś użyć:

if ($_SERVER['REQUEST_METHOD'] == 'POST')
matino
źródło
168

Co powiesz na

if($_SERVER['REQUEST_METHOD'] == 'POST')
Olaf
źródło
69

Właściwie przycisk przesyłania już pełni tę funkcję.

Wypróbuj w FORMULARZU:

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

Następnie w module obsługi PHP:

if (isset($_POST['treasure'])){
echo "treasure will be set if the form has been submitted (to TRUE, I believe)";
}
Tzshand
źródło
6
To jest poprawna odpowiedź. Samo sprawdzenie, czy $ _POST nie jest wystarczająco dobre, ponieważ mogło zostać wygenerowane z wielu różnych miejsc ... nie tylko z postu formularza. Dzięki Tzshand.
Houston
Najlepiej if (null !== (filter_input(INPUT_POST, 'macaddress'))){
byłoby,
2
POST można wykonać za pomocą Ajaxa, który nie ma przycisku przesyłania, więc nie jest to rozwiązanie uniwersalne.
Muhammad bin Yusrat
To prawda; może również sprawdzić każdą zmienną przesłaną przez AJAX.
Tzshand
34

Posługiwać się

if(isset($_POST['submit'])) // name of your submit button
Rikesh
źródło
1
Najprostsze rozwiązanie. Wszystkie formularze powinny mieć przycisk przesyłania!
Anh Tran
1
Ale niektóre formularze mogą mieć wiele przycisków.
Progrock
2
@rilwis czasami formularze są przesyłane przez JavaScript i nie potrzebują / mają przycisku przesyłania
Waqas Malik
28

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

CodeCaster
źródło
14

Spróbuj tego

 <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
źródło
2
Ta metoda jest najbardziej polecana, ponieważ wydaje się być uznawana przez „akademię kodowania” za „najlepszą praktykę”.
Darkeden
1

Z drugiej strony, zawsze dobrym zwyczajem jest dodanie tokena do formularza i zweryfikowanie go, aby sprawdzić, czy dane nie zostały wysłane z zewnątrz. Oto kroki:

  1. Wygeneruj unikalny token (możesz użyć hasha) Np .:

    $token = hash (string $algo , string $data [, bool $raw_output = FALSE ] );
  2. Przypisz ten token do zmiennej sesji. Dawny:

    $_SESSION['form_token'] = $token;
  3. Dodaj ukryte dane wejściowe, aby przesłać token. Dawny:

    input type="hidden" name="token" value="{$token}"
  4. następnie w ramach walidacji sprawdź, czy przesłany token pasuje do zmiennej sesji.

    Ex: if ( $_POST['token'] === $_SESSION['form_token'] ) ....
Profesor
źródło
0

Miałem ten sam problem - również upewnij się, że dodałeś name=""przycisk wejścia. Cóż, ta poprawka zadziałała dla mnie.

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

<input type="submit" name="add" value="Submit">
Jen
źródło
-6

Możesz również użyć:

is_array($_POST)
SW4
źródło
4
is_array($_POST)zawsze daje prawdę (na moim komputerze). Według 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 somehow, więc wydaje się, że należy się spodziewać, że ten zawsze zwraca true ..
GitaarLAB
is_array($_POST)zdecydowanie nie jest sposobem na sprawdzenie, czy formularz został przesłany.
Lukas,