Comprobando si se ha enviado el formulario - PHP

122

¿Cuál es la mejor manera de verificar si un formulario ha sido enviado o no para determinar si debo pasar las variables del formulario a mi clase de validación?

Primero pensé que tal vez:

isset($_POST)

Pero eso siempre será cierto ya que un superglobal se define en todas partes. No quiero tener que recorrer cada elemento de mi formulario con:

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

Mientras escribía esta pregunta, pensé en una solución mucho más básica, agregue un campo oculto para que actúe como una marca que pueda verificar.

¿Hay una forma 'más limpia' de hacerlo que agregar mi propia bandera?

Anónimo
fuente
44
Bueno, podría hacer un botón de envío que tenga un nombre específico, como submitedy luego usar el php if(isset($_POST['submited']))o una entrada oculta ...
Max Allan
2
Debe agregar un sustantivo para evitar ataques de repetición en su formulario.
Hakre

Respuestas:

191

Para verificación general si hubo una POSTacción, use:

if (!empty($_POST))

EDITAR : como se indica en los comentarios, este método no funcionará en algunos casos (por ejemplo, con casillas de verificación y botón sin nombre). Realmente deberías usar:

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

Qué tal si

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

En realidad, el botón Enviar ya realiza esta función.

Prueba en el FORMULARIO:

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

Luego en el controlador PHP:

if (isset($_POST['treasure'])){
echo "treasure will be set if the form has been submitted (to TRUE, I believe)";
}
Tzshand
fuente
66
Esta es la respuesta correcta. Simplemente comprobar $ _POST no es lo suficientemente bueno porque podría haberse generado desde varios lugares diferentes ... no solo desde una publicación de formulario. Gracias Tzshand
Houston
Idealmente, ahora debería usar el if (null !== (filter_input(INPUT_POST, 'macaddress'))){que le acostumbra a usar filter_input
representa
2
La POST se puede hacer con Ajax, que no tendrá ningún botón de envío, por lo que esta no es una solución universal.
Muhammad bin Yusrat
Es verdad; También puede verificar cualquier variable publicada por AJAX.
Tzshand
34

Utilizar

if(isset($_POST['submit'])) // name of your submit button
Rikesh
fuente
1
La solución más simple. ¡Todos los formularios deben tener un botón de enviar!
Anh Tran
1
Pero algunas formas pueden tener múltiples botones.
Progrock
2
@rilwis a veces los formularios se envían por JavaScript y no necesitan / tienen un botón de envío
Waqas Malik
28

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

CodeCaster
fuente
14

Prueba esto

 <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
fuente
2
Este método es el más recomendado, ya que parece ser reconocido como "mejor práctica" por la "academia de codificación".
Darkeden
1

En una nota diferente, también es siempre una buena práctica agregar un token a su formulario y verificarlo para verificar si los datos no se enviaron desde el exterior. Aquí están los pasos:

  1. Genere un token único (puede usar hash) Ej:

    $token = hash (string $algo , string $data [, bool $raw_output = FALSE ] );
  2. Asigne este token a una variable de sesión. Ex:

    $_SESSION['form_token'] = $token;
  3. Agregue una entrada oculta para enviar el token. Ex:

    input type="hidden" name="token" value="{$token}"
  4. luego, como parte de su validación, verifique si el token enviado coincide con la var. de sesión

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

Tuve el mismo problema: también asegúrate de agregar name=""el botón de entrada. Bueno, esa solución funcionó para mí.

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

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

También puedes usar:

is_array($_POST)
SW4
fuente
44
is_array($_POST)Siempre da verdad (en mi máquina). De acuerdo con 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 lo que parece que se espera que esto siempre devuelve verdadero ..
GitaarLAB
is_array($_POST)definitivamente no es la forma de verificar si se envió el formulario.
Lukas