$ _POST vs. $ _SERVER ['REQUEST_METHOD'] == 'POST'


130

Qualcuno ha chiamato "merda" una delle mie osservazioni su Snipplr perché l'ho usata if ($_SERVER['REQUEST_METHOD'] == 'POST')invece diif ($_POST)

Controllare il metodo di richiesta mi sembra più corretto perché è quello che voglio davvero fare. C'è qualche differenza operativa tra i due o è solo un problema di chiarezza del codice?


214
Di 'a quel ragazzo che fa schifo.
Vinko Vrsalovic,

12
Dovresti usare ===invece di ==qui come 0 == 'POST'.
dave1010,

5
$ _SERVER ["REQUEST_METHOD"] può contenere "POST" per richieste HTTP GET su alcune installazioni PHP + Apache2. Come il mio. Ed è così che sono arrivato qui.
Tiberiu-Ionuț Stan,

3
@ Tiberiu-IonuțStan Se questo è vero (cosa che non credo lo sia), è un bug gravemente grave. Potete fornire un collegamento a una segnalazione di bug PHP o Apache? I passaggi per riprodurre? Così com'è, non ti credo.
Mark Amery,

1
@ dave1010 Perché $_SERVER['REQUEST_METHOD']mai dovrebbe essere il numero 0? Per quanto ne so, è impossibile.
Mark Amery,

Risposte:


169

Beh, non fanno la stessa cosa, davvero.

$_SERVER['REQUEST_METHOD'] contiene il metodo di richiesta (sorpresa).

$_POST contiene eventuali dati di post.

È possibile che una richiesta POST non contenga dati POST.

Controllo il metodo di richiesta - in realtà non ho mai pensato di testare l' $_POSTarray. Controllo i campi postali richiesti, comunque. Quindi una richiesta di posta vuota darebbe all'utente molti messaggi di errore, il che ha senso per me.


In teoria, potrebbe essere possibile che il metodo di richiesta sia "post" (maiuscolo o minuscolo). PHP lo disinfetta automaticamente su GET e POST?
Boldewyn,

Dopo un breve test, il mio PHP 5.2 su WinXP ovviamente non lo fa, quindi probabilmente il request_method dovrebbe essere disinfettato solo in maiuscolo.
Boldewyn,

3
@Boldewyn No, non lo è, ma se il client ti invia un metodo di richiesta "post" o "Post" quando intendono eseguire una richiesta POST, violano le specifiche, poiché i metodi HTTP sono sensibili al maiuscolo / minuscolo in base alle specifiche e le specifiche definiscono solo il metodo POST, non ad esempio il metodo post o Post o pOsT. Vado più in dettaglio su questo nella mia risposta qui: stackoverflow.com/a/21511879/1709587 . È una tua scelta decidere se forzare il metodo in maiuscolo per gestire il codice client che viola le specifiche.
Mark Amery,

E poiché non sono la stessa cosa, ha senso che potremmo usarli per cose diverse: digitare e richiedere il payload. Mi chiedo se questo faccia impazzire chiunque: uso $ _SERVER ['REQUEST_METHOD'] per capire cosa stiamo facendo e utilizzo $ _REQUEST per accedere al payload, che mantiene un po 'di indipendenza tra i concetti (in altre parole, io usa raramente $ _POST o $ _GET in particolare).
grantwparks,

@grantwparks Sembra un cattivo affare. $ _GET e $ _POST hanno più a che fare con il luogo in cui i dati sono stati trasportati. Considera: "curl -k -L -X POST -H 'Tipo-contenuto: text / csv' --data-binary \ @ sample.csv 'test-script.php? Test = 12345'" Popola il valore "test" $ _GET anche se il metodo è POST.
Txyoji,

37

if ($_SERVER['REQUEST_METHOD'] == 'POST') è il modo corretto, è possibile inviare una richiesta di posta senza dati di posta.


17

Ho controllato $_POSTfino a quando non ho avuto problemi con dati POST più grandi e file caricati. Esistono direttive di configurazione post_max_sizee upload_max_filesize, se una di esse viene superata, l' $_POSTarray non viene popolato.

Quindi il "modo sicuro" è controllare $_SERVER['REQUEST_METHOD']. Devi comunque usare isset()su ogni $_POSTvariabile, e non importa, se controlli o no $_SERVER['REQUEST_METHOD'].


9

Se l'applicazione deve reagire su richiesta di tipo post, utilizzare questo:

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
}

Se la tua applicazione deve reagire su qualsiasi dato ricevuto attraverso la richiesta di posta, usa questo:

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
   // ...
}

È specifico dell'implementazione, ma dovrai usare entrambi, + $ _FILES superglobal.


3

Sono entrambi corretti. Personalmente preferisco il tuo approccio meglio per la sua verbosità, ma dipende davvero dalle preferenze personali.

Fuori mano, in esecuzione se ($ _ POST) non genererebbe un errore: l'array $ _POST esiste indipendentemente dal fatto che la richiesta sia stata inviata con le intestazioni POST. Un array vuoto viene trasmesso su false in un controllo booleano.


forse nel 2009, ma un array vuoto! = false
clockw0rk

1
Potresti aver perso la parola "cast". L'istruzione all'interno di una struttura "if" viene lanciata su un valore booleano e un array vuoto viene quindi lanciato su un valore booleano falso. Anche nel 2020
Eran Galperin,

lol, hai ragione. +1
clockw0rk

3

Puoi inviare un modulo premendo il tasto invio (cioè senza fare clic sul pulsante di invio) nella maggior parte dei browser, ma questo non invia necessariamente invia come variabile - quindi è possibile inviare un modulo vuoto, cioè $_POSTsarà vuoto ma il modulo sarà comunque ha generato una richiesta di post http alla pagina php. In questo caso if ($_SERVER['REQUEST_METHOD'] == 'POST')è meglio.


1
In tal caso, $_POSTnon sarebbe vuoto: sarebbe un array con valori vuoti.
TRiG il

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

4
Anche se la tua risposta potrebbe essere corretta, non è utile senza spiegazioni! Dai un'occhiata a Come rispondere ! Grazie!
jkalden,

0

Finché potrei aver bisogno di accedere ai miei script PHP con più di un metodo, quello che faccio in realtà è:

if (in_array($_SERVER['REQUEST_METHOD'],array("GET","POST","DELETE"))) {
// do wathever I do 
}

-1

Verifica se la pagina è stata richiamata tramite POST (anziché GET, HEAD, ecc.). Quando si digita un URL nella barra dei menu, la pagina viene richiamata tramite GET. Tuttavia, quando si invia un modulo con method = "post" la pagina dell'azione viene chiamata con POST.


-3

È davvero un 6 su uno, una mezza dozzina dell'altra situazione.

L'unico argomento possibile contro il tuo approccio è $ _SERVER ['REQUEST_METHOD'] == 'POST' potrebbe non essere popolato su alcuni web server / configurazioni, mentre l'array $ _POST sarà sempre presente in PHP4 / PHP5 (e se non lo fa ' non esiste, hai problemi più grandi (- :)


-17

Entrambi funzionano allo stesso modo, ma $_POSTdovrebbero essere usati in quanto più puliti. Puoi aggiungerlo isset()per verificare che esista.


6
$_POSTesisterà sempre, sebbene possa essere vuoto (che viene lanciato in booleano false). E cosa intendi per "più pulito"?
TRiG il

2
forse intendeva dire che per scrivere sulla tastiera sono necessari meno caratteri = P
Julian,
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.