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?


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')

168

E se

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

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)";
}

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

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


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'])){

    }

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'] ) ....

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">

-6

Você também pode usar:

is_array($_POST)

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.