$ _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?


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.


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.


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'].


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.


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.


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.


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

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 
}

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


-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 (- :)


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


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.