Tra $ _REQUEST, $ _GET e $ _POST qual è il più veloce?


177

Quale di questi codici sarà più veloce?

$temp = $_REQUEST['s'];

o

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

6
C'è un terzo caso, lo sai. !isset($_REQUEST['s']).
Franz,

5
Quanto è importante che altre persone capiscano chiaramente il tuo codice? POST e GET sono espliciti, mentre REQUEST potrebbe provenire da varie fonti. Penso che l'efficienza sia trascurabile poiché i superglobali REQUEST, POST e GET sono sempre caricati per ogni richiesta.
Kevin,

Risposte:


273

$_REQUEST, Per impostazione predefinita, contiene i contenuti di $_GET, $_POSTe $_COOKIE.

Ma è solo un valore predefinito, che dipende da variables_order; e non sei sicuro di voler lavorare con i cookie.

Se dovessi scegliere, probabilmente non userei $_REQUEST, e sceglierei $_GETo $_POST- a seconda di cosa dovrebbe fare la mia applicazione (cioè l'uno o l'altro, ma non entrambi) : in generale:

  • È necessario utilizzare $_GETquando qualcuno richiede dati dalla propria applicazione.
  • E dovresti usare $_POSTquando qualcuno sta spingendo (inserendo o aggiornando o eliminando) i dati nella tua applicazione.

Ad ogni modo, non ci sarà molta differenza nelle performance: la differenza sarà trascurabile, rispetto a ciò che farà il resto della tua sceneggiatura.


1
Idealmente, dovresti sempre essere in grado di usare $ _REQUEST. Ma quello ovviamente è solo un mondo perfetto.
Tyler Carter,

2
$ _REQUEST è presumibilmente (o almeno era) più costoso dell'utilizzo diretto di $ _POST e $ _GET.
Darrell Brogdon,

3
+1 perché il concetto di differenza prestazionale è trascurabile e la prospettiva di manutenzione è più importante: $ _GET e $ _POST trasmettono significato in un modo che $ _REQUEST non può.
Jon Cram,

9
L'uso di $ _REQUEST non causa XSS / XSRF. Non capire le sfumature di XSS / XSRF causa XSS / XSRF. Finché si attenua con i token, non ci sono problemi E si ottengono i vantaggi dell'utilizzo di $ _REQUEST (tutte le variabili sono in un superglobal). In realtà ho ricostruito $ _REQUEST prima di usarlo in base agli altri superglobali a causa di 'variabili_ordine'. Elaboro $ _COOKIE, quindi $ _GET, quindi $ _POST. In questo modo i VAR POST hanno la massima priorità e i cookie VAR ricevono la più bassa, il che mi consente di correggere implicitamente una serie di bug (ad esempio Adobe Flash e citazioni magiche).
CubicleSoft

è nel nome, Get = get from, Post = post to
Grumpy

32

OTTIENI vs. POST

1) Sia GET che POST creano un array (ad es. Array (key => value, key2 => value2, key3 => value3, ...)). Questo array contiene coppie chiave / valore, in cui le chiavi sono i nomi dei controlli del modulo e i valori sono i dati di input dell'utente.

2) Sia GET che POST sono trattati come $ _GET e $ _POST. Questi sono superglobali, il che significa che sono sempre accessibili, indipendentemente dall'ambito - e puoi accedervi da qualsiasi funzione, classe o file senza dover fare nulla di speciale.

3) $ _GET è una matrice di variabili passate allo script corrente tramite i parametri URL.

4) $ _POST è una matrice di variabili passate allo script corrente tramite il metodo POST HTTP.

Quando usare GET?

Le informazioni inviate da un modulo con il metodo GET sono visibili a tutti (tutti i nomi e i valori delle variabili sono visualizzati nell'URL). GET ha anche dei limiti sulla quantità di informazioni da inviare. La limitazione è di circa 2000 caratteri. Tuttavia, poiché le variabili sono visualizzate nell'URL, è possibile aggiungere la pagina ai segnalibri. Questo può essere utile in alcuni casi.

GET può essere utilizzato per l'invio di dati non sensibili.

Nota: GET non deve MAI essere usato per inviare password o altre informazioni sensibili!

Quando utilizzare POST?

Le informazioni inviate da un modulo con il metodo POST sono invisibili agli altri (tutti i nomi / valori sono incorporati nel corpo della richiesta HTTP) e non hanno limiti sulla quantità di informazioni da inviare.

Inoltre, POST supporta funzionalità avanzate come il supporto per l'input binario multiparte durante il caricamento di file sul server.

Tuttavia, poiché le variabili non sono visualizzate nell'URL, non è possibile aggiungere la pagina ai segnalibri.


6
Si prega di aggiungere qualcosa anche su RICHIESTA.
Black Mamba

Che dire di $ _REQUEST?
Aamir Kalimi,

22

$ _GET recupera le variabili dalla stringa di query o dal tuo URL.>

$ _POST recupera le variabili da un metodo POST, come i moduli (generalmente).

$ _REQUEST è una fusione di $ _GET e $ _POST in cui $ _POST sovrascrive $ _GET. Buono a usare $ _REQUEST su moduli autoreferenziali per validazioni.


3
+1 Questo è fondamentalmente ciò che mi è stato insegnato. Non tecnico come altre risposte, ma molto più facile da ricordare ( GETdalla stringa di query, POSTdall'invio del modulo).
jp2code

18

Suggerirei di usare $_POSTed $_GETesplicitamente.

L'uso di $ _REQUEST non dovrebbe essere necessario con la corretta progettazione del sito, e presenta alcuni aspetti negativi come lasciarti aperto ad CSRF/XSSattacchi più facili e altre sciocchezze che derivano dalla memorizzazione dei dati nell'URL.

La differenza di velocità dovrebbe essere minima in entrambi i modi.


8

Usa la RICHIESTA. A nessuno importa della velocità di un'operazione così semplice, ed è un codice molto più pulito.


7
Buona risposta, con l'avvertenza che in molte situazioni un GET o un POST dovrebbero essere scelti in base alla situazione invece di utilizzare uno dei due.
Ceejayoz,

3
Hai ragione sul fatto che a nessuno importa, ma secondo me usare $_REQUESTè una conclusione sbagliata. Vedi la mia risposta
Franz,

4
perché usare $ _REQUEST è più pulito rispetto a $ _GET o $ _POST? $ _REQUEST esegue la stessa logica dietro la scena e scegliere GET o POST ti dà più controllo.
Jay Zeng,

6
L'affermazione che _REQUEST è più igienica ha bisogno di elaborazione.

2
Consiglio di utilizzare GET se si desidera che l'utente sia in grado di copiare l'URL e preformare la stessa operazione, ad esempio (l'URL è visibile come "google.com/q=searchWord" mentre POST dovrebbe essere utilizzato per pubblicare dati su un sito Web che dovrebbe essere inserito una sola volta, o molti dati sono attivi e l'utente non dovrebbe essere in grado di mantenere l'URL come inserire dati nei database, accedere ecc.
Dean Meehan,

7

Non ti preoccupare. Ma dovresti comunque usare la seconda soluzione (più un controllo extra per nessuna di quelle variabili esistenti), perché ci sono problemi di sicurezza con $_REQUEST(poiché $_GETe $_POSTnon sono le uniche fonti per quell'array).

$_REQUESTCredo che ci sia stato un post sui problemi di ieri. Lasciami andare a trovarlo.

EDIT : Oh bene, non direttamente un post, ma eccolo qui: http://kuza55.blogspot.com/2006/03/request-variable-fixation.html


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

Usalo perché è più sicuro e non farà una notevole differenza di velocità


Non è affatto una cattiva soluzione. Si prende cura dei difetti di sicurezza associati $_REQUESTma consente comunque di accedere allo stesso script in entrambi i modi (nel mio caso, lo stesso script viene utilizzato con diverse 'azioni' e alcune volte $ _GET andrebbe bene, ma altre volte ho bisogno di $ _POST per nascondere / proteggere i dati).
Xandor,

4

Vi sono alcuni problemi di sicurezza in quanto un hacker può impostare un cookie che sovrascriverà un valore $ _POST o $ _GET. Se gestisci dati sensibili, non consiglierei di utilizzare $ _REQUEST. - Xandor

non puoi essere usato $_GETalternativa a$_POST in alcuni casi.

Quando ??

  • quando vuoi caricare un file.
  • quando non vuoi mostrare un dato nell'URL.

GETha anche dei limiti sulla quantità di informazioni da inviare. La limitazione è di circa 2000 caratteri.

Altre cose ci sono pochi casi in cui non è possibile recuperare un dato utilizzando $_POST

Quando ?

  • quando i dati vengono passati nell'URL.

Per il servizio di riposo

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

`PUT` - Used to create a new resource.

non c'è niente di sbagliato da usare $_REQUEST.

Ma il modo per farlo è controllare esplicitamente $ _SERVER ['REQUEST_METHOD'], non fare affidamento sul fatto che $ _POST sia vuoto per un GET.


1
Un buon consiglio sull'uso $_SERVER['REQUEST_METHOD']per verificare se lo script verrà chiamato con uno dei due. Ma dire che non c'è nulla di sbagliato $_REQUESTnon è vero al 100%. Vi sono alcuni problemi di sicurezza in quanto un hacker può impostare un cookie che sovrascriverà un valore $ _POST o $ _GET. Se gestisci dati sensibili, non consiglierei di usarli $_REQUEST.
Xandor,

Ho aggiunto il tuo commento nella mia risposta, è di aiuto grazie
Parth Chavda

3

$ _GET recupera le variabili dalla stringa di query o dal tuo URL.>

$ _POST recupera le variabili da un metodo POST, come i moduli (generalmente).

$ _REQUEST è una fusione di $ _GET e $ _POST in cui $ _POST sovrascrive $ _GET. Buono a usare $ _REQUEST su moduli autoreferenziali per validazioni.


2
L'override dipende request_ordere può contenere anche valori di cookie, motivo per cui non è una funzionalità molto affidabile né utile.
Ja͢ck,

1

Vorrei utilizzare il secondo metodo in quanto è più esplicito. Altrimenti non sai da dove provengono le variabili.

Perché è necessario controllare sia GET che POST? Sicuramente usare l'uno o l'altro ha solo più senso.


1
L'ho già visto in precedenza, GETessendo stato utilizzato solo per un elemento (ad es. Spostandolo) e POSTper più di essi (un modulo con caselle di controllo ...).
Franz,

1

Uso sempre _GET o _POST. Preferisco avere il controllo.

Quello che non mi piace di entrambi i frammenti di codice nell'OP è che scartano le informazioni su cui è stato utilizzato il metodo HTTP. E queste informazioni sono importanti per la sanificazione dell'input.

Ad esempio, se uno script accetta dati da un modulo che verrà immesso nel database, il modulo dovrebbe utilizzare meglio POST ( utilizzare GET solo per azioni idempotenti ). Ma se lo script riceve i dati di input tramite il metodo GET, dovrebbe (normalmente) essere rifiutato. Per me, una situazione del genere potrebbe giustificare la scrittura di una violazione della sicurezza nel registro degli errori, poiché è un segno sul quale qualcuno sta provando qualcosa.

Con entrambi i frammenti di codice nel PO, questa sanificazione non sarebbe possibile.


In realtà, è molto semplice scrivere una piccola pagina che pubblica ciò che vuoi su una pagina. Quindi, a meno che tu non faccia affidamento sulle intestazioni dei referrer che vengono inviate, i post di posta non sono più sicuri di quelli di posta. Suppongo che il vantaggio più grande di un esplicito $_POSTsia quello di impedire ai crawler dei motori di ricerca di fare qualcosa del genere: thedailywtf.com/Articles/WellIntentioned-Destruction.aspx
Duroth

Non ho detto nulla del contrario. Quello che ho detto è che se il modulo HTML utilizza POST e la gestione dello script riceve i dati del modulo tramite GET, lo script vorrebbe conoscerlo e non buttare via quel fatto, come fanno entrambi l'esempio di Kobra. (A proposito: neanche il referrer è sicuro.)

1

Vorrei usare $_POST, e $_GETperché diversamente dal $_REQUESTloro contenuto non è influenzato variables_order.
Quando utilizzare $_POSTe $_GETdipende dal tipo di operazione che viene eseguita. Un'operazione che modifica i dati gestiti dal server deve essere eseguita tramite una richiesta POST, mentre le altre operazioni devono essere eseguite tramite una richiesta GET. Per fare un esempio, un'operazione che elimina un account utente non deve essere eseguita direttamente dopo che l'utente ha fatto clic su un collegamento, mentre è possibile visualizzare un'immagine tramite un collegamento.


1

Io lo uso

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

l'istruzione viene convalidata se $ _REQUEST ha più di un parametro (il primo parametro in $ _REQUEST sarà l'uri di richiesta che può essere utilizzato quando necessario, alcuni pacchetti PHP non restituiranno $ _GET, quindi controlla se i suoi più di 1 vanno per $ _GET, per predefinito, sarà $ _POST.


0

Stai ottimizzando prematuramente. Inoltre, dovresti davvero riflettere sul fatto che GET debba essere usato per cose che stai postando, per motivi di sicurezza.


3
Per favore, non provare a dire alla gente che c'è qualcosa di più sicuro in POST di quanto non ci sia in GET.

Io non. Il punto era che i loro usi dovevano essere presi in considerazione e non usati palesemente in modo intercambiabile, perché "semplicemente digitare RICHIESTA è molto più facile".
Alex Brasetvik,

Se quello che vuoi dire è che Kobra dovrebbe verificare che i dati siano stati inviati usando il metodo previsto, allora sono d'accordo. Uno dei suoi esempi di codice rende impossibile tale test.

0

È brutto e non lo consiglierei come soluzione finale quando si spinge il codice in diretta, ma durante la creazione di funzioni di riposo, a volte è utile avere un accaparratore di parametri "catch-all":

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

Qualcuno potrebbe probabilmente aggiungerlo ad esso per gestire i parametri della riga di comando o qualunque cosa provenga dal tuo IDE. Una volta deciso cosa sta facendo una determinata funzione di riposo, puoi sceglierne una appropriata per quella determinata chiamata per assicurarti di ottenere ciò di cui hai bisogno per la versione di distribuzione. Ciò presuppone che sia impostato "REQUEST_METHOD".

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.