Verificando se o formulário foi enviado - PHP

122

Qual é a melhor maneira de verificar se um formulário foi ou não enviado para determinar se devo passar as variáveis ​​do formulário para minha classe de validação?

Primeiro pensei que talvez:

isset($_POST)

Mas isso sempre retornará verdadeiro, pois uma superglobal é definida em todos os lugares. Não quero ter que percorrer cada elemento do meu formulário com:

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

Enquanto escrevia essa pergunta, pensei em uma solução muito mais básica, adicione um campo oculto para atuar como uma bandeira que eu possa verificar.

Existe uma maneira 'mais limpa' de fazer isso do que adicionar minha própria bandeira?

Anônimo
fonte
4
Bem, você poderia fazer um botão que tem uma nam específico, como enviar submitede, em seguida, usar o php if(isset($_POST['submited']))ou uma entrada escondida ...
Max Allan
2
Você deve adicionar um nounce para evitar ataques de repetição no seu formulário.
hakre

Respostas:

191

Para verificação geral, se houve uma POSTação, use:

if (!empty($_POST))

EDIT : Como indicado nos comentários, este método não funciona em alguns casos (por exemplo, com caixas de seleção e botão sem nome). Você realmente deve usar:

if ($_SERVER['REQUEST_METHOD'] == 'POST')
matino
fonte
168

E se

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

Na verdade, o botão enviar já executa essa função.

Tente no FORMULÁRIO:

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

Então, no manipulador PHP:

if (isset($_POST['treasure'])){
echo "treasure will be set if the form has been submitted (to TRUE, I believe)";
}
Tzshand
fonte
6
Essa é a resposta correta. Simplesmente verificar $ _POST não é bom o suficiente, pois poderia ter sido gerado a partir de vários lugares diferentes ... não apenas de uma postagem de formulário. Obrigado Tzshand.
Houston
Idealmente agora você deve usar if (null !== (filter_input(INPUT_POST, 'macaddress'))){o que você recebe o hábito de usar filter_input
depicus
2
O POST pode ser feito com o Ajax, que não possui botão de envio, portanto, essa não é uma solução universal.
Muhammad bin Yusrat
Isso é verdade; também pode verificar qualquer variável postada pelo AJAX.
Tzshand
34

Usar

if(isset($_POST['submit'])) // name of your submit button
Rikesh
fonte
1
A solução mais simples. Todos os formulários devem ter um botão de envio!
Anh Tran
1
Mas alguns formulários podem ter vários botões.
Progrock 20/09/17
2
@rilwis, por vezes, os formulários são apresentados por JavaScript e não precisa / tem um botão de envio
Waqas Malik
28

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

CodeCaster
fonte
14

Tente isto

 <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
fonte
2
Este método é o mais recomendado, pois parece ser reconhecido como "melhor prática" pela "academia de codificação".
precisa saber é o seguinte
1

Em uma observação diferente, também é sempre uma boa prática adicionar um token ao seu formulário e verificar se os dados não foram enviados de fora. Aqui estão os passos:

  1. Gere um token exclusivo (você pode usar o hash)

    $token = hash (string $algo , string $data [, bool $raw_output = FALSE ] );
  2. Atribua esse token a uma variável de sessão. Ex:

    $_SESSION['form_token'] = $token;
  3. Adicione uma entrada oculta para enviar o token. Ex:

    input type="hidden" name="token" value="{$token}"
  4. como parte de sua validação, verifique se o token enviado corresponde à var da sessão.

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

Eu tive o mesmo problema - também certifique-se de adicionar name=""o botão de entrada. Bem, essa correção funcionou para mim.

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

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

Você também pode usar:

is_array($_POST)
SW4
fonte
4
is_array($_POST)sempre dá verdade (na minha máquina). De acordo com 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, por isso parece-se esperar que este sempre retorna true ..
GitaarLAB
is_array($_POST)definitivamente não é a maneira de verificar se o formulário foi enviado.
Lukas