2009-01-03 91 views
107

Un tipo llamado uno de mi Snipplr presentaciones "basura" porque solía if ($_SERVER['REQUEST_METHOD'] == 'POST') en lugar de if ($_POST)

Comprobación del método de la petición parece más correcto para mí porque eso es lo que realmente quiero hacer. ¿Hay alguna diferencia operativa entre los dos o solo se trata de un problema de claridad del código?

+174

Dile a ese tipo que apesta. –

+0

@vinkoVrsalovic especialmente porque como menciona en su respuesta que no son lo mismo y ($ POST) es una especie de "hack" en el que su cheque si existe una matriz, que solo está presente durante una solicitud POST. También el método de solicitud se puede usar en otros casos como GET. – Hawken

+9

Debería usar '===' en lugar de '==' aquí como '0 == 'POST''. – dave1010

Respuesta

140

Bueno, realmente no hacen lo mismo.

$_SERVER['REQUEST_METHOD'] contiene el método de solicitud (sorpresa).

$_POST contiene los datos de la publicación.

Es posible que una solicitud POST no contenga datos POST.

Compruebo el método de solicitud. De hecho, nunca pensé en probar la matriz $_POST. Sin embargo, verifico los campos requeridos. Por lo tanto, una solicitud de publicación vacía le daría al usuario una gran cantidad de mensajes de error, lo cual tiene sentido para mí.

+0

Teóricamente, podría ser posible que el método de solicitud sea 'post' (menor o incluso caso mixto). ¿PHP automáticamente desinfecta esto en GET y POST? – Boldewyn

+0

Después de una breve prueba, mi PHP 5.2 en WinXP, obviamente, no lo hace, por lo que probablemente el método request_dethod debe ser esterilizado a mayúsculas solamente. – Boldewyn

+3

@Boldewyn No, no es así, pero si el cliente le envía un método de solicitud de 'publicación' o 'publicación' cuando intentan realizar una solicitud POST, infringen las especificaciones, ya que los métodos HTTP son sensible según la especificación y la especificación solo define el método POST, no p. ej. el método post o Post o pOsT. Voy a entrar en más detalles sobre esto en mi respuesta aquí: http://stackoverflow.com/a/21511879/1709587. Si usted desea forzar el método a mayúsculas para manejar el código del cliente que viola las especificaciones, es su elección. –

-15

Ambos funcionan del mismo modo, pero se debe usar $_POST ya que es más limpio. Puede agregar isset() para verificar que exista.

+3

'$ _POST' siempre existirá, aunque puede estar vacío (que se envía a boolean' false'). ¿Y a qué te refieres con "limpiador"? – TRiG

+1

tal vez quiso decir que se necesitan menos caracteres para escribir en el teclado = P – Julian

+0

lol a la definición de limpiador aquí. –

1

Ambos son correctos. Personalmente, prefiero su enfoque mejor por su nivel de detalle, pero realmente se debe a las preferencias personales.

No disponible, ejecutándose si ($ _ POST) no arrojaría un error - la matriz $ _POST existe independientemente de si la solicitud se envió con encabezados POST. Un conjunto vacío se convierte en falso en un control booleano.

31

if ($_SERVER['REQUEST_METHOD'] == 'POST') es la forma correcta, puede enviar una solicitud de envío sin ningún dato de publicación.

-3

Es realmente un 6 de una, media docena de la otra situación.

El único argumento posible en contra de su enfoque es $ _SERVER ['REQUEST_METHOD'] == 'POST' puede no estar poblado en ciertos servidores web/configuración, mientras que la matriz $ _POST siempre existirá en PHP4/PHP5 (y si no existe, tiene problemas más grandes (- :)

13

he utilizado para comprobar $_POST hasta que llegué a un problema con los datos POST más grandes y subido archivos Existen directivas de configuración post_max_size y upload_max_filesize -. si alguno de ellos se excede, $_POST matriz no se rellena.

Por lo tanto, la "manera segura" es marcar $_SERVER['REQUEST_METHOD']. Todavía tiene que usar isset() en cada variable $_POST sin embargo, y no importa, si marca o no marca $_SERVER['REQUEST_METHOD'].

3

Puede enviar un formulario presionando la tecla Intro (es decir, sin hacer clic en el botón Enviar) en la mayoría de los navegadores, pero esto no necesariamente envía enviar como variable, por lo que es posible enviar un formulario vacío, es decir $_POST estará vacío pero el formulario aún generará una solicitud posterior a la página php. En este caso, if ($_SERVER['REQUEST_METHOD'] == 'POST') es mejor.

+1

En ese caso, '$ _POST' no estaría vacío: sería una matriz con valores vacíos. – TRiG

4

Si la aplicación necesita para reaccionar a petición del tipo de mensaje, utilice esto:

if(strtoupper($_SERVER['REQUEST_METHOD']) === 'POST') { // if form submitted with post method 
    // validate request, 
    // manage post request differently, 
    // log or don't log request, 
    // redirect to avoid resubmition on F5 etc 
} 

Si su aplicación tiene que reaccionar a los datos recibidos a través de la solicitud posterior, utilice esto:

if(!empty($_POST)) { // if received any post data 
    // process $_POST values, 
    // save data to DB, 
    // ... 
} 

if(!empty($_FILES)) { // if received any "post" files 
    // validate uploaded FILES 
    // move to uploaded dir 
    // ... 
} 

Es específico de la implementación, pero vas a usar ambos, + $ _FILES superglobal.

-1

Comprueba si la página ha sido llamada a través de POST (a diferencia de GET, HEAD, etc.). Cuando escribe una URL en la barra de menú, la página se llama a través de GET. Sin embargo, cuando envía un formulario con method = "post", se llama a la página de acción con POST.

1
$this->method = $_SERVER['REQUEST_METHOD']; 
if ($this->method == 'POST' && array_key_exists('HTTP_X_HTTP_METHOD', $_SERVER)) { 
    if ($_SERVER['HTTP_X_HTTP_METHOD'] == 'DELETE') { 
     $this->method = 'DELETE'; 
    } else if ($_SERVER['HTTP_X_HTTP_METHOD'] == 'PUT') { 
     $this->method = 'PUT'; 
    } else { 
     throw new Exception("Unexpected Header"); 
    } 
} 
+2

¡Aunque su respuesta podría ser correcta, no es útil sin explicación! Por favor, eche un vistazo a [respuesta]! ¡Gracias! – jkalden