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?


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

168

Qué tal si

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

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

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

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


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

    }

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

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

-6

También puedes usar:

is_array($_POST)

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.