$ _POST contre $ _SERVER ['REQUEST_METHOD'] == 'POST'

130

Un type a qualifié l'une de mes soumissions Snipplr de "merde" parce que j'ai utilisé à la if ($_SERVER['REQUEST_METHOD'] == 'POST')place deif ($_POST)

Vérifier la méthode de requête me semble plus correct car c'est ce que je veux vraiment faire. Y a-t-il une différence opérationnelle entre les deux ou s'agit-il simplement d'un problème de clarté du code?

Scott
la source
214
Dites à ce mec qu'il est nul.
Vinko Vrsalovic
12
Vous devriez utiliser à la ===place de ==ici comme 0 == 'POST'.
dave1010
5
$ _SERVER ["REQUEST_METHOD"] peut contenir "POST" pour les requêtes HTTP GET sur certaines installations PHP + Apache2. Comme le mien. Et c'est comme ça que je suis arrivé ici.
Tiberiu-Ionuț Stan
3
@ Tiberiu-IonuțStan Si c'est vrai (ce que je ne crois pas), c'est un bogue extrêmement sérieux. Pouvez-vous fournir un lien vers un rapport de bogue PHP ou Apache? Étapes à suivre pour reproduire? En l'état, je ne te crois pas.
Mark Amery
1
@ dave1010 Pourquoi $_SERVER['REQUEST_METHOD']le nombre serait-il jamais 0? Autant que je sache, c'est impossible.
Mark Amery

Réponses:

169

Eh bien, ils ne font pas la même chose, vraiment.

$_SERVER['REQUEST_METHOD'] contient la méthode de requête (surprise).

$_POST contient toutes les données de publication.

Il est possible qu'une requête POST ne contienne aucune donnée POST.

Je vérifie la méthode de requête - je n'ai en fait jamais pensé à tester le $_POSTtableau. Je vérifie cependant les champs de publication requis. Donc, une demande de publication vide donnerait à l'utilisateur beaucoup de messages d'erreur - ce qui a du sens pour moi.

gnud
la source
Théoriquement, il pourrait être possible que la méthode de demande soit «post» (cas inférieur ou même mixte). PHP nettoie-t-il automatiquement cela sur GET et POST?
Boldewyn
Après un court test, mon PHP 5.2 sur WinXP ne le fait évidemment pas, donc probablement la request_method devrait être purifiée uniquement en majuscules.
Boldewyn
3
@Boldewyn Non, ce n'est pas le cas, mais si le client vous envoie une méthode de requête `` post '' ou `` Post '' lorsqu'il a l'intention d'exécuter une requête POST, il est en violation des spécifications, car les méthodes HTTP sont sensibles à la casse selon les spécifications et la spécification définit uniquement la méthode POST, pas par exemple la méthode post ou Post ou pOsT. Je vais plus en détail à ce sujet dans ma réponse ici: stackoverflow.com/a/21511879/1709587 . Que vous souhaitiez ou non forcer la méthode en majuscules pour gérer le code client non conforme aux spécifications est votre choix.
Mark Amery
Et comme ils ne sont pas la même chose, il est logique que nous puissions les utiliser pour différentes choses - taper et demander une charge utile. Je me demande si cela rend quelqu'un barf: j'utilise $ _SERVER ['REQUEST_METHOD'] pour comprendre ce que nous faisons, et j'utilise $ _REQUEST pour accéder à la charge utile, qui maintient un peu d'indépendance entre les concepts (en d'autres termes, je utilise rarement $ _POST ou $ _GET spécifiquement).
grantwparks
@grantwparks Cela semble être une mauvaise affaire. $ _GET et $ _POST ont plus à voir avec l'endroit où les données ont été transportées. Considérez: "curl -k -L -X POST -H 'Content-Type: text / csv' --data-binary \ @ sample.csv 'test-script.php? Test = 12345'" La valeur "test" se remplit $ _GET même si la méthode est POST.
txyoji
37

if ($_SERVER['REQUEST_METHOD'] == 'POST') est le bon moyen, vous pouvez envoyer une demande de publication sans aucune donnée de publication.

Stuartloxton
la source
17

J'avais l'habitude de vérifier $_POSTjusqu'à ce que j'aie des problèmes avec des données POST plus volumineuses et des fichiers téléchargés. Il existe des directives de configuration post_max_sizeet upload_max_filesize- si l'une d'entre elles est dépassée, le $_POSTtableau n'est pas rempli.

Le "moyen sûr" est donc de vérifier $_SERVER['REQUEST_METHOD']. Cependant, vous devez toujours utiliser isset()sur chaque $_POSTvariable, et cela n'a pas d'importance, que vous vérifiiez ou non $_SERVER['REQUEST_METHOD'].

binaryLV
la source
9

Si votre application doit réagir à la demande de type post, utilisez ceci:

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 votre application doit réagir à des données reçues via une demande de courrier, utilisez ceci:

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

C'est spécifique à l'implémentation, mais vous allez utiliser les deux, + $ _FILES superglobal.

DUzun
la source
3

Ils ont tous les deux raison. Personnellement, je préfère votre approche pour sa verbosité, mais c'est vraiment une question de préférence personnelle.

Hors main, exécuter if ($ _ POST) ne lèverait pas d'erreur - le tableau $ _POST existe, que la requête ait été envoyée avec les en-têtes POST. Un tableau vide est converti en faux dans une vérification booléenne.

Eran Galperin
la source
peut-être en 2009, mais un tableau vide! = false
clockw0rk
1
Vous avez peut-être manqué le mot «cast». L'instruction à l'intérieur d'une structure "if" est convertie en un booléen, et un tableau vide est donc converti en un booléen faux. Même en 2020
Eran Galperin le
lol, ur droit. +1
clockw0rk
3

Vous pouvez soumettre un formulaire en appuyant sur la touche Entrée (c'est-à-dire sans cliquer sur le bouton Soumettre) dans la plupart des navigateurs, mais cela n'envoie pas nécessairement soumettre comme une variable - il est donc possible de soumettre un formulaire vide, c'est $_POST-à- dire qu'il sera vide mais le formulaire sera toujours ont généré une demande de publication http sur la page php. Dans ce cas, if ($_SERVER['REQUEST_METHOD'] == 'POST')c'est mieux.

Eamon
la source
1
Dans ce cas, $_POSTne serait pas vide: ce serait un tableau avec des valeurs vides.
TRiG
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");
    }
}
Amama Alaeddine
la source
4
Bien que votre réponse puisse être correcte, elle n'est pas utile sans explication! Veuillez jeter un œil à Comment répondre ! Je vous remercie!
jkalden le
0

Tant que je peux avoir besoin d'accéder à mes scripts PHP avec plus d'une méthode, ce que je fais est en fait:

if (in_array($_SERVER['REQUEST_METHOD'],array("GET","POST","DELETE"))) {
// do wathever I do 
}
Alfredo Rahn
la source
-1

Il vérifie si la page a été appelée via POST (par opposition à GET, HEAD, etc.). Lorsque vous tapez une URL dans la barre de menus, la page est appelée via GET. Cependant, lorsque vous soumettez un formulaire avec method = "post", la page d'action est appelée avec POST.

shreekanth
la source
-3

C'est vraiment un 6 sur un, une demi-douzaine de l'autre situation.

Le seul argument possible contre votre approche est $ _SERVER ['REQUEST_METHOD'] == 'POST' peut ne pas être renseigné sur certains serveurs Web / configuration, alors que le tableau $ _POST existera toujours dans PHP4 / PHP5 (et si ce n'est pas le cas ' t existent, vous avez de plus gros problèmes (- :)

Alan Storm
la source
-17

Ils fonctionnent tous les deux de la même manière, mais $_POSTdoivent être utilisés car ils sont plus propres. Vous pouvez y ajouter isset()pour vérifier qu'il existe.

Alex Royaume-Uni
la source
6
$_POSTexistera toujours, bien qu'il puisse être vide (qui est converti en booléen false). Et qu'entendez-vous par «plus propre»?
TRiG
2
peut-être qu'il voulait dire qu'il fallait moins de caractères pour taper sur le clavier = P
Julian