it-swarm.com.de

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

Ein Typ nannte einen meiner Snipplr-Beiträge "Mist", weil ich if ($_SERVER['REQUEST_METHOD'] == 'POST') anstelle von if ($_POST) verwendet habe.

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

122
Scott

Nun, sie machen nicht wirklich dasselbe.

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

$_POST enthält keine Beitragsdaten.

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

Ich überprüfe die Anforderungsmethode - ich habe eigentlich nie darüber nachgedacht, die $_POST Array. 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.

159
gnud

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

33
stuartloxton

Früher habe ich $_POST Überprüft, bis ich Probleme mit größeren POST Daten und hochgeladenen Dateien) hatte. Es gibt Konfigurationsanweisungen post_max_size Und upload_max_filesize - Wenn einer von ihnen überschritten wird, wird das Array $_POST nicht gefüllt.

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

16
binaryLV

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 eingehen, gehen Sie folgendermaßen vor:

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.

7
DUzun

Sie können ein Formular übermitteln, indem Sie in den meisten Browsern die Eingabetaste drücken (dh ohne auf die Schaltfläche "Übermitteln" zu klicken). Dabei wird jedoch nicht unbedingt "Übermitteln" als Variable gesendet. Sie können also ein leeres Formular übermitteln, dh $_POST Wird gesendet leer, aber das Formular hat immer noch eine http-Post-Anfrage an die PHP-Seite generiert. In diesem Fall ist if ($_SERVER['REQUEST_METHOD'] == 'POST') besser.

3
Eamon

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.

Wenn ausgeführt wird, wenn ($ _POST) keinen Fehler auslöst, ist das Array $ _POST vorhanden, unabhängig davon, ob die Anforderung mit den Headern POST) gesendet wurde. Ein leeres Array wird bei einer Booleschen Prüfung in false umgewandelt .

1
Eran Galperin
$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");
    }
}
1
Amama Alaeddine