Entre $ _REQUEST, $ _GET y $ _POST, ¿cuál es el más rápido?


177

¿Cuál de estos códigos será más rápido?

$temp = $_REQUEST['s'];

o

if (isset($_GET['s'])) {
  $temp = $_GET['s'];
}
else {
  $temp = $_POST['s'];
}

66
Hay un tercer caso, ya sabes. !isset($_REQUEST['s']).
Franz

55
¿Qué tan importante es que otras personas entiendan su código claramente? POST y GET son explícitos, mientras que SOLICITUD podría provenir de varias fuentes. Creo que la eficiencia es insignificante ya que las superglobales SOLICITUD, POST y GET siempre se cargan para cada solicitud.
Kevin

Respuestas:


273

$_REQUEST, Por defecto, contiene el contenido de $_GET, $_POSTy$_COOKIE .

Pero es solo un valor predeterminado, que depende de variables_order ; y no estoy seguro de querer trabajar con cookies.

Si tuviera que elegir, probablemente no usaría $_REQUEST, y elegiría $_GETo $_POST, dependiendo de lo que debería hacer mi aplicación (es decir, una u otra, pero no ambas) : en general:

  • Debe usar $_GETcuando alguien solicita datos de su aplicación.
  • Y debe usarlo $_POSTcuando alguien está empujando (insertando o actualizando; o eliminando) datos a su aplicación.

De cualquier manera, no habrá mucha diferencia sobre las actuaciones: la diferencia será insignificante, en comparación con lo que hará el resto de su guión.


1
Idealmente, siempre debería poder usar $ _REQUEST. Pero eso, por supuesto, es solo un mundo perfecto.
Tyler Carter

2
$ _REQUEST es supuestamente (o al menos solía ser) más costoso que usar $ _POST y $ _GET directamente.
Darrell Brogdon

3
+1 para el concepto de que la diferencia de rendimiento es insignificante y la perspectiva de mantenimiento es más importante: $ _GET y $ _POST transmiten significado de una manera que $ _REQUEST no puede.
Jon Cram

9
Usar $ _REQUEST no causa XSS / XSRF. No entender los matices de XSS / XSRF causa XSS / XSRF. Mientras mitigue con tokens, no hay ningún problema Y obtiene los beneficios de usar $ _REQUEST (todas sus variables están en una superglobal). De hecho, reconstruyo $ _REQUEST antes de usarlo en base a las otras superglobales debido a 'variables_order'. Proceso $ _COOKIE, luego $ _GET, luego $ _POST. De esa forma, los vars POST tienen la máxima prioridad y los vars de cookies obtienen los más bajos, lo que me permite corregir implícitamente una serie de errores (por ejemplo, Adobe Flash y citas mágicas).
CubicleSoft

está en el nombre, Get = get from, Post = post to
Grumpy

32

OBTENER vs. POSTAR

1) Tanto GET como POST crean una matriz (por ejemplo, matriz (clave => valor, clave2 => valor2, clave3 => valor3, ...)). Esta matriz contiene pares clave / valor, donde las claves son los nombres de los controles del formulario y los valores son los datos de entrada del usuario.

2) Tanto GET como POST se tratan como $ _GET y $ _POST. Estos son superglobales, lo que significa que siempre son accesibles, independientemente del alcance, y puede acceder a ellos desde cualquier función, clase o archivo sin tener que hacer nada especial.

3) $ _GET es una matriz de variables pasadas al script actual a través de los parámetros de URL.

4) $ _POST es una matriz de variables pasadas al script actual a través del método HTTP POST.

¿Cuándo usar GET?

La información enviada desde un formulario con el método GET es visible para todos (todos los nombres y valores de las variables se muestran en la URL). GET también tiene límites en la cantidad de información a enviar. La limitación es de unos 2000 caracteres. Sin embargo, debido a que las variables se muestran en la URL, es posible marcar la página. Esto puede ser útil en algunos casos.

GET puede usarse para enviar datos no confidenciales.

Nota: ¡GET NUNCA debe usarse para enviar contraseñas u otra información confidencial!

¿Cuándo usar POST?

La información enviada desde un formulario con el método POST es invisible para otros (todos los nombres / valores están integrados en el cuerpo de la solicitud HTTP) y no tiene límites en la cantidad de información a enviar.

Además, POST admite funcionalidades avanzadas, como la compatibilidad con entradas binarias de varias partes al cargar archivos al servidor.

Sin embargo, debido a que las variables no se muestran en la URL, no es posible marcar la página.


66
Agregue también algo sobre SOLICITUD.
Black Mamba

¿Qué pasa con $ _REQUEST?
Aamir Kalimi el

22

$ _GET recupera variables de la cadena de consulta o su URL.>

$ _POST recupera variables de un método POST, como los formularios (generalmente).

$ _REQUEST es una fusión de $ _GET y $ _POST donde $ _POST anula $ _GET. Es bueno usar $ _REQUEST en formularios autorreferenciales para validaciones.


3
+1 Esto es básicamente lo que me enseñaron. No es técnico como otras respuestas, pero es mucho más fácil de recordar ( GETde la cadena de consulta, POSTdel envío del formulario).
jp2code

18

Sugeriría usar $_POSTy$_GET explícitamente.

Usar $ _REQUEST debería ser innecesario con el diseño adecuado del sitio de todos modos, y viene con algunas desventajas, como dejarlo abierto para que sea más fácil CSRF/XSS ataques y otras tonterías que provienen del almacenamiento de datos en la URL.

La diferencia de velocidad debe ser mínima en ambos sentidos.


8

Utilice SOLICITUD. A nadie le importa la velocidad de una operación tan simple, y es un código mucho más limpio.


77
Buena respuesta, con la advertencia de que en muchas situaciones se debe elegir un GET o un POST en función de la situación en lugar de usar cualquiera de ellos.
ceejayoz

3
Tienes razón en que a nadie le importa, pero en mi opinión, usar $_REQUESTes la conclusión incorrecta. Mira mi respuesta.
Franz

44
¿Por qué usar $ _REQUEST es más limpio en comparación con $ _GET o $ _POST? $ _REQUEST realiza la misma lógica detrás de escena y elegir GET o POST le da más control.
Jay Zeng

66
La afirmación de que _REQUEST es más higiénica necesita elaboración.

2
Recomiendo usar GET si desea que el usuario pueda copiar la URL y realizar la misma operación, es decir (la URL es visible como 'google.com/q=searchWord' mientras que POST debe usarse para publicar datos en un sitio web eso solo debe insertarse una vez, o muchos datos están activos y el usuario no debería poder mantener la URL como insertar datos en bases de datos, iniciar sesión, etc.
Dean Meehan

7

No te preocupes Pero todavía se debe usar la segunda solución (más un cheque adicional para ninguna de las variables existentes), porque hay problemas de seguridad con $_REQUEST(puesto $_GETy$_POST no son las únicas fuentes de esa matriz).

Hubo una publicación sobre los problemas con $_REQUESTayer, creo. Déjame ir a buscarlo.

EDITAR : Bueno, no directamente una publicación, pero aquí está de todos modos: http://kuza55.blogspot.com/2006/03/request-variable-fixation.html


6
if (isset($_GET['s'])) {
  $temp = $_GET['s'];
}
else {
  $temp = $_POST['s'];
}

Úselo porque es más seguro y no hará una diferencia de velocidad notable


No es una mala solución en absoluto. Se ocupa de las fallas de seguridad asociadas, $_REQUESTpero aún permite acceder al mismo script de cualquier manera (en mi caso, el mismo script se usa con diferentes 'acciones' y algunas veces $ _GET estaría bien, pero otras veces necesito $ _POST para ocultar / asegurar los datos).
Xandor

4

Hay ciertas preocupaciones de seguridad involucradas ya que un hacker puede configurar una cookie que anulará un valor de $ _POST o $ _GET. Si maneja datos confidenciales, no recomendaría usar $ _REQUEST. - Xandor

no se puede usar como $_GETalternativa $_POSTen algún caso.

Cuando ??

  • cuando quieres subir un archivo.
  • cuando no quiere mostrar datos en la URL.

GETTambién tiene límites en la cantidad de información a enviar. La limitación es de unos 2000 caracteres.

Otra cosa es que hay pocos casos en los que no puede recuperar datos usando $_POST

Cuando ?

  • cuando los datos se pasan en la URL.

Para servicio de descanso

`GET` - Provides a read only access to a resource.

`PUT` - Used to create a new resource.

No hay nada de malo en usar $_REQUEST.

Pero la forma de hacerlo es verificar $ _SERVER ['REQUEST_METHOD'] explícitamente, no confiar en que $ _POST esté vacío para GET.


1
Un buen consejo sobre cómo usar $_SERVER['REQUEST_METHOD']para verificar si el script se llamará con cualquiera de los dos. Pero decir que no hay nada malo $_REQUESTno es 100% cierto. Hay ciertos problemas de seguridad involucrados ya que un hacker puede configurar una cookie que anulará un valor de $ _POST o $ _GET. Si maneja datos confidenciales, no recomendaría usarlos $_REQUEST.
Xandor

He agregado su comentario en mi respuesta, es ayuda, gracias
Parth Chavda

3

$ _GET recupera variables de la cadena de consulta o su URL.>

$ _POST recupera variables de un método POST, como los formularios (generalmente).

$ _REQUEST es una fusión de $ _GET y $ _POST donde $ _POST anula $ _GET. Es bueno usar $ _REQUEST en formularios autorreferenciales para validaciones.


2
La anulación depende request_ordery también puede contener valores de cookies, por lo que no es una característica muy confiable ni útil.
Ja͢ck

1

Usaría el segundo método ya que es más explícito. De lo contrario, no sabes de dónde vienen las variables.

¿Por qué necesita verificar GET y POST de todos modos? Seguramente usar uno u otro solo tiene más sentido.


1
He visto esto antes, ya que GETse usa solo para un elemento (por ejemplo, moverlo) y POSTpara varios de ellos (un formulario con casillas de verificación ...).
Franz

1

Solo uso _GET o _POST. Prefiero tener el control.

Lo que no me gusta de ninguno de los fragmentos de código en el OP es que descartan la información sobre la cual se utilizó el método HTTP. Y esa información es importante para la desinfección de insumos.

Por ejemplo, si un script acepta datos de un formulario que se va a ingresar en la base de datos, entonces el formulario debería usar POST ( use GET solo para acciones idempotentes) ). Pero si el script recibe los datos de entrada a través del método GET, entonces (normalmente) debería ser rechazado. Para mí, tal situación podría justificar escribir una violación de seguridad en el registro de errores, ya que es una señal de que alguien está probando algo.

Con cualquiera de los fragmentos de código en el OP, esta desinfección no sería posible.


En realidad, es muy simple escribir una página pequeña que publique lo que quieras en una página. Entonces, a menos que confíe en el envío de encabezados de referencia, los vars posteriores no son más seguros que obtener vars. Supongo que la mayor ventaja de un explícito $_POSTes evitar que los rastreadores de motores de búsqueda hagan algo como esto: thedailywtf.com/Articles/WellIntentioned-Destruction.aspx
Duroth

No dije nada al contrario. Lo que dije fue que si el formulario HTML usa POST y el manejo del script recibe los datos del formulario a través de GET, entonces el script querría saberlo y no descartar ese hecho, como lo hacen los dos ejemplos de kobra. (Por cierto: el referente tampoco es seguro)

1

Yo usaría $_POST, y $_GETporque diferente de $_REQUESTsu contenido no está influenciado por variables_order.
Cuándo usarlo $_POSTy $_GETdepende de qué tipo de operación se esté ejecutando. Una operación que cambia los datos manejados desde el servidor debe hacerse a través de una solicitud POST, mientras que las otras operaciones deben hacerse a través de una solicitud GET. Para hacer un ejemplo, una operación que elimina una cuenta de usuario no debe ejecutarse directamente después de que el usuario haga clic en un enlace, mientras que la visualización de una imagen se puede hacer a través de un enlace.


1

Yo uso esto,

$request = (count($_REQUEST) > 1)?$_REQUEST:$_GET;

la declaración valida si $ _REQUEST tiene más de un parámetro (el primer parámetro en $ _REQUEST será la uri de solicitud que se puede usar cuando sea necesario, algunos paquetes PHP no devolverán $ _GET, así que verifique si son más de 1 para $ _GET, por predeterminado, será $ _POST.


0

Estás optimizando prematuramente. Además, realmente debería pensar si GET debe usarse para cosas que está PUBLICANDO, por razones de seguridad.


3
No intentes decirle a la gente que hay algo más seguro sobre POST que lo que hay sobre GET.

No lo hice. El punto era que sus usos deberían pensarse y no usarse descaradamente, indistintamente, porque "escribir SOLICITUD es mucho más fácil".
Alex Brasetvik

Si lo que quiere decir es que Kobra debería verificar que los datos se enviaron utilizando el método esperado, entonces estoy de acuerdo. Cualquiera de sus ejemplos de código hace que tales pruebas sean imposibles.

0

Es feo y no lo recomendaría como una solución final al insertar código en vivo, pero al crear funciones de descanso, a veces es útil tener un capturador de parámetros 'general':

public static function parseParams() {
    $params = array();
    switch($_SERVER['REQUEST_METHOD']) {
        case "PUT":
        case "DELETE":
            parse_str(file_get_contents('php://input'), $params);
            $GLOBALS["_{$_SERVER['REQUEST_METHOD']}"] = $params;
            break;
        case "GET":
            $params = $_GET;
            break;
        case "POST":
            $params = $_POST;
            break;
        default:
            $params = $_REQUEST;
            break;
    }
    return $params;
}

Alguien creativo probablemente podría incluso agregarle para manejar los parámetros de la línea de comandos o lo que sea que provenga de su IDE. Una vez que decida qué está haciendo una función de descanso determinada, puede elegir una adecuada para esa llamada dada para asegurarse de obtener lo que necesita para la versión de implementación. Esto supone que 'REQUEST_METHOD' está configurado.

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.