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

130

Ein Typ nannte eine meiner Snipplr-Einsendungen "Mist", weil ich if ($_SERVER['REQUEST_METHOD'] == 'POST')stattdessen verwendet habeif ($_POST)

Das Überprüfen der Anforderungsmethode scheint mir korrekter zu sein, da ich das wirklich tun möchte. Gibt es einen betrieblichen Unterschied zwischen den beiden oder handelt es sich nur um ein Problem mit der Codeklarheit?

Scott
quelle
213
Sag dem Kerl, dass er saugt.
Vinko Vrsalovic
12
Sie sollten ===anstelle von ==hier als verwenden 0 == 'POST'.
Dave1010
5
$ _SERVER ["REQUEST_METHOD"] enthält möglicherweise "POST" für HTTP-GET-Anforderungen in einigen PHP + Apache2-Installationen. Wie mein. Und so bin ich hierher gekommen.
Tiberiu-Ionuț Stan
3
@ Tiberiu-IonuțStan Wenn das stimmt (was ich nicht glaube), ist es ein grob schwerwiegender Fehler. Können Sie einen Link zu einem PHP- oder Apache-Fehlerbericht bereitstellen? Schritte zum Reproduzieren? So wie es ist, glaube ich dir einfach nicht.
Mark Amery
1
@ dave1010 Warum sollte $_SERVER['REQUEST_METHOD']jemals die Nummer sein 0? Soweit ich weiß, ist das unmöglich.
Mark Amery

Antworten:

168

Nun, sie machen nicht wirklich dasselbe.

$_SERVER['REQUEST_METHOD'] enthält die Anforderungsmethode (Überraschung).

$_POST enthält alle Postdaten.

Es ist möglich, dass eine POST-Anforderung keine POST-Daten enthält.

Ich überprüfe die Anforderungsmethode - ich habe eigentlich nie daran gedacht, das $_POSTArray zu testen . Ich überprüfe jedoch die erforderlichen Postfelder. Eine leere Post-Anfrage würde dem Benutzer also viele Fehlermeldungen geben - was für mich sinnvoll ist.

Gnud
quelle
Theoretisch könnte es möglich sein, dass die Anforderungsmethode "post" ist (Klein- oder sogar Großbuchstaben). Bereinigt PHP dies automatisch bei GET und POST?
Boldewyn
Nach einem kurzen Test macht mein PHP 5.2 unter WinXP dies offensichtlich nicht, daher sollte die request_method wahrscheinlich nur in Großbuchstaben bereinigt werden.
Boldewyn
3
@Boldewyn Nein, das ist nicht der Fall, aber wenn der Client Ihnen eine Anforderungsmethode "Post" oder "Post" sendet, wenn er eine POST-Anforderung ausführen möchte, verstoßen sie gegen die Spezifikation, da bei HTTP-Methoden zwischen Groß- und Kleinschreibung unterschieden wird gemäß Spezifikation und Spezifikation definiert nur die POST-Methode, nicht zB die Post- oder Post- oder pOsT-Methode. Ich gehe in meiner Antwort hier näher darauf ein: stackoverflow.com/a/21511879/1709587 . Sie haben die Wahl, ob Sie die Methode in Großbuchstaben umwandeln möchten, um spezifikationswidrigen Clientcode zu verarbeiten.
Mark Amery
Und da sie nicht dasselbe sind, ist es sinnvoll, sie für verschiedene Zwecke zu verwenden - Nutzdaten eingeben und anfordern. Ich frage mich, ob dies jemanden barf macht: Ich benutze $ _SERVER ['REQUEST_METHOD'], um herauszufinden, was wir tun, und ich benutze $ _REQUEST, um auf die Nutzdaten zuzugreifen, die ein wenig Unabhängigkeit zwischen den Konzepten bewahren (mit anderen Worten, ich Verwenden Sie selten $ _POST oder $ _GET (speziell).
Grantwparks
@grantwparks Das klingt nach einem schlechten Geschäft. $ _GET und $ _POST haben mehr damit zu tun, wohin die Daten transportiert wurden. Bedenken Sie: "curl -k -L -X POST -H 'Inhaltstyp: text / csv' --data-binary \ @ sample.csv 'test-script.php? Test = 12345'" Der Wert "test" wird ausgefüllt $ _GET obwohl die Methode POST ist.
Txyoji
36

if ($_SERVER['REQUEST_METHOD'] == 'POST') ist der richtige Weg, können Sie eine Post-Anfrage ohne Post-Daten senden.

stuartloxton
quelle
17

Ich habe immer nachgesehen, $_POSTbis ich Probleme mit größeren POST-Daten und hochgeladenen Dateien hatte. Es gibt Konfigurationsanweisungen post_max_sizeund upload_max_filesize- wenn eine davon überschritten wird, wird das $_POSTArray nicht ausgefüllt.

Der "sichere Weg" ist also zu überprüfen $_SERVER['REQUEST_METHOD']. Sie müssen jedoch immer noch für isset()jede $_POSTVariable verwenden, und es spielt keine Rolle, ob Sie prüfen oder nicht $_SERVER['REQUEST_METHOD'].

binaryLV
quelle
9

Wenn Ihre Anwendung auf Anfrage vom Typ Post reagieren muss, verwenden Sie Folgendes:

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
}

Wenn Ihre Anwendung auf Daten reagieren muss, die per Post-Anfrage eingegangen sind, verwenden Sie Folgendes:

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

Es ist implementierungsspezifisch, aber Sie werden beide verwenden, + $ _FILES superglobal.

DUzun
quelle
3

Sie sind beide richtig. Persönlich bevorzuge ich Ihren Ansatz besser wegen seiner Ausführlichkeit, aber es hängt wirklich von Ihren persönlichen Vorlieben ab.

Das Ausführen von if ($ _ POST) würde keinen Fehler auslösen - das Array $ _POST ist vorhanden, unabhängig davon, ob die Anforderung mit POST-Headern gesendet wurde. Ein leeres Array wird bei einer booleschen Prüfung in false umgewandelt.

Eran Galperin
quelle
3

Sie können ein Formular senden, indem Sie in den meisten Browsern die Eingabetaste drücken (dh ohne auf die Schaltfläche "Senden" zu klicken). Dies sendet jedoch nicht unbedingt "Senden" als Variable. Es ist also möglich, ein leeres Formular zu senden, d. H. $_POST es ist leer, aber das Formular bleibt bestehen habe eine http post Anfrage an die PHP Seite generiert. In diesem Fall if ($_SERVER['REQUEST_METHOD'] == 'POST')ist besser.

Eamon
quelle
1
In diesem Fall $_POSTwäre nicht leer: Es wäre ein Array mit leeren Werten.
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
quelle
4
Obwohl Ihre Antwort richtig sein könnte, ist sie ohne Erklärung nicht hilfreich! Bitte schauen Sie sich an, wie man antwortet ! Danke dir!
Jkalden
0

Solange ich mit mehr als einer Methode auf meine PHP-Skripte zugreifen muss, mache ich Folgendes:

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

Es wird geprüft, ob die Seite über POST aufgerufen wurde (im Gegensatz zu GET, HEAD usw.). Wenn Sie eine URL in die Menüleiste eingeben, wird die Seite über GET aufgerufen. Wenn Sie jedoch ein Formular mit method = "post" senden, wird die Aktionsseite mit POST aufgerufen.

Shreekanth
quelle
-3

Es ist wirklich eine 6 von einer, ein halbes Dutzend von der anderen Situation.

Das einzig mögliche Argument gegen Ihren Ansatz ist $ _SERVER ['REQUEST_METHOD'] == 'POST' ist möglicherweise auf bestimmten Webservern / Konfigurationen nicht ausgefüllt, wohingegen das $ _POST-Array immer in PHP4 / PHP5 vorhanden ist (und falls nicht). t existieren, du hast größere Probleme (- :)

Alan Storm
quelle
-17

Sie funktionieren beide auf die gleiche Weise, $_POSTsollten jedoch verwendet werden, da sie sauberer sind. Sie können es hinzufügen, isset()um zu überprüfen, ob es vorhanden ist.

Alex UK
quelle
6
$_POSTwird immer existieren, obwohl es leer sein kann (was in Boolesche Werte umgewandelt wird false). Und was meinst du mit "sauberer"?
TRiG
2
Vielleicht meinte er, dass weniger Zeichen benötigt werden, um auf der Tastatur zu tippen = P
Julian