Welches von $ _REQUEST, $ _GET und $ _POST ist das schnellste?

176

Welcher dieser Codes wird schneller sein?

$temp = $_REQUEST['s'];

oder

if (isset($_GET['s'])) {
  $temp = $_GET['s'];
}
else {
  $temp = $_POST['s'];
}
Kobra
quelle
6
Es gibt einen dritten Fall, weißt du? !isset($_REQUEST['s']).
Franz
5
Wie wichtig ist es, dass andere Ihren Code klar verstehen? POST und GET sind explizit, während REQUEST aus verschiedenen Quellen stammen kann. Ich denke, die Effizienz ist vernachlässigbar, da die Superglobalen REQUEST, POST und GET immer für jede Anfrage geladen werden.
Kevin

Antworten:

273

$_REQUEST, Standardmäßig enthält den Inhalt $_GET, $_POSTund $_COOKIE.

Aber es ist nur eine Standardeinstellung, die davon abhängt variables_order; und nicht sicher, ob Sie mit Cookies arbeiten möchten.

Wenn ich mich entscheiden müsste, würde ich wahrscheinlich nicht verwenden $_REQUEST, und ich würde wählen $_GEToder $_POST- je nachdem, was meine Anwendung tun soll (dh das eine oder das andere, aber nicht beide) : im Allgemeinen:

  • Sie sollten verwenden, $_GETwenn jemand Daten von Ihrer Anwendung anfordert .
  • Und Sie sollten verwenden, $_POSTwenn jemand Daten in Ihre Anwendung pusht (einfügt oder aktualisiert oder löscht) .

In beiden Fällen wird es keinen großen Unterschied bei den Aufführungen geben: Der Unterschied ist vernachlässigbar im Vergleich zu dem, was der Rest Ihres Skripts tun wird.

Pascal MARTIN
quelle
1
Idealerweise sollten Sie immer $ _REQUEST verwenden können. Aber das ist natürlich nur eine perfekte Welt.
Tyler Carter
2
$ _REQUEST ist angeblich (oder zumindest früher) teurer als die direkte Verwendung von $ _POST und $ _GET.
Darrell Brogdon
3
+1 für das Konzept, dass der Leistungsunterschied vernachlässigbar ist und die Wartungsperspektive wichtiger ist: $ _GET und $ _POST vermitteln Bedeutung auf eine Weise, die $ _REQUEST nicht kann.
Jon Cram
9
Die Verwendung von $ _REQUEST verursacht kein XSS / XSRF. Das Nichtverstehen der Nuancen von XSS / XSRF führt zu XSS / XSRF. Solange Sie mit Token abmildern, gibt es kein Problem UND Sie erhalten die Vorteile der Verwendung von $ _REQUEST (alle Ihre Variablen befinden sich in einem Superglobal). Ich habe $ _REQUEST tatsächlich neu erstellt, bevor ich es aufgrund von 'variables_order' basierend auf den anderen Superglobalen verwende. Ich verarbeite $ _COOKIE, dann $ _GET, dann $ _POST. Auf diese Weise haben POST-Variablen die höchste Priorität und Cookie-Variablen die niedrigste, wodurch ich implizit eine Reihe von Fehlern beheben kann (z. B. Adobe Flash und magische Anführungszeichen).
CubicleSoft
Es ist im Namen, Get = get from, Post = post to
Grumpy
32

GET vs. POST

1) Sowohl GET als auch POST erstellen ein Array (z. B. Array (Schlüssel => Wert, Schlüssel2 => Wert2, Schlüssel3 => Wert3, ...)). Dieses Array enthält Schlüssel / Wert-Paare, wobei Schlüssel die Namen der Formularsteuerelemente und Werte die Eingabedaten des Benutzers sind.

2) Sowohl GET als auch POST werden als $ _GET und $ _POST behandelt. Dies sind Superglobale, dh sie sind unabhängig vom Umfang immer verfügbar - und Sie können von jeder Funktion, Klasse oder Datei aus auf sie zugreifen, ohne etwas Besonderes tun zu müssen.

3) $ _GET ist ein Array von Variablen, die über die URL-Parameter an das aktuelle Skript übergeben werden.

4) $ _POST ist ein Array von Variablen, die über die HTTP-POST-Methode an das aktuelle Skript übergeben werden.

Wann soll GET verwendet werden?

Informationen, die von einem Formular mit der GET-Methode gesendet werden, sind für alle sichtbar (alle Variablennamen und -werte werden in der URL angezeigt). GET hat auch Grenzen für die Menge der zu sendenden Informationen. Die Beschränkung beträgt ca. 2000 Zeichen. Da die Variablen jedoch in der URL angezeigt werden, ist es möglich, die Seite mit einem Lesezeichen zu versehen. Dies kann in einigen Fällen hilfreich sein.

GET kann zum Senden nicht sensibler Daten verwendet werden.

Hinweis: GET darf NIEMALS zum Senden von Passwörtern oder anderen vertraulichen Informationen verwendet werden!

Wann wird POST verwendet?

Informationen, die von einem Formular mit der POST-Methode gesendet werden, sind für andere nicht sichtbar (alle Namen / Werte sind in den Hauptteil der HTTP-Anforderung eingebettet) und die Anzahl der zu sendenden Informationen ist unbegrenzt.

Darüber hinaus unterstützt POST erweiterte Funktionen wie die Unterstützung mehrteiliger Binäreingaben beim Hochladen von Dateien auf den Server.

Da die Variablen jedoch nicht in der URL angezeigt werden, ist es nicht möglich, die Seite mit einem Lesezeichen zu versehen.

Zee Ken
quelle
6
Bitte fügen Sie auch etwas zu REQUEST hinzu.
Black Mamba
Was ist mit $ _REQUEST?
Aamir Kalimi
22

$ _GET ruft Variablen aus dem Querystring oder Ihrer URL ab.>

$ _POST ruft Variablen aus einer POST-Methode ab, z. B. (allgemein) Formulare.

$ _REQUEST ist eine Zusammenführung von $ _GET und $ _POST, wobei $ _POST $ _GET überschreibt. Es ist gut, $ _REQUEST für selbstauffrischende Formulare zur Validierung zu verwenden.

gewel
quelle
3
+1 Dies ist im Grunde das, was mir beigebracht wurde. Nicht technisch wie andere Antworten, aber viel einfacher zu merken ( GETvon der Abfragezeichenfolge, POSTvon der Formularübermittlung).
jp2code
18

Ich würde vorschlagen, $_POSTund $_GETexplizit zu verwenden.

Die Verwendung von $ _REQUEST sollte bei ordnungsgemäßem Site-Design ohnehin unnötig sein und einige Nachteile mit sich bringen, z. B. die Offenheit für einfachere CSRF/XSSAngriffe und andere Dummheiten, die durch das Speichern von Daten in der URL entstehen.

Der Geschwindigkeitsunterschied sollte in beiden Fällen minimal sein.

Daniel Bruce
quelle
8

Verwenden Sie REQUEST. Niemand kümmert sich um die Geschwindigkeit einer so einfachen Operation, und es ist viel sauberer Code.

Steven Schlansker
quelle
7
Gute Antwort mit der Einschränkung, dass in vielen Situationen ein GET oder ein POST basierend auf der Situation ausgewählt werden sollte, anstatt eines zu verwenden.
Ceejayoz
3
Sie haben Recht, dass es niemanden interessiert, aber meiner Meinung nach $_REQUESTist die Verwendung die falsche Schlussfolgerung. Siehe meine Antwort.
Franz
4
Warum ist die Verwendung von $ _REQUEST sauberer als $ _GET oder $ _POST? $ _REQUEST führt hinter den Kulissen dieselbe Logik aus, und wenn Sie entweder GET oder POST auswählen, haben Sie mehr Kontrolle.
Jay Zeng
6
Die Behauptung, dass _REQUEST hygienischer ist, muss ausgearbeitet werden.
2
Ich würde die Verwendung von GET empfehlen, wenn Sie möchten, dass der Benutzer die URL kopieren und denselben Vorgang ausführen kann, dh (die URL ist sichtbar wie "google.com/q=searchWord", während POST zum Posten von Daten auf einer Website verwendet werden sollte Das sollte nur einmal eingefügt werden, oder viele Daten sind aktiv und der Benutzer sollte nicht in der Lage sein, die URL wie das Einfügen von Daten in Datenbanken, das Anmelden usw. beizubehalten.
Dean Meehan
7

Mach dir keine Sorgen. Sie sollten jedoch weiterhin die zweite Lösung verwenden (plus eine zusätzliche Überprüfung für keine dieser vorhandenen Variablen), da Sicherheitsprobleme mit auftreten$_REQUEST (da $_GETund $_POSTnicht die einzigen Quellen für dieses Array sind).

$_REQUESTIch glaube, es gab einen Beitrag über die Probleme mit gestern. Lass es mich finden.

EDIT : Na ja , nicht direkt ein Beitrag, aber hier ist es trotzdem: http://kuza55.blogspot.com/2006/03/request-variable-fixation.html

Franz
quelle
5
if (isset($_GET['s'])) {
  $temp = $_GET['s'];
}
else {
  $temp = $_POST['s'];
}

Verwenden Sie das, weil es sicherer ist und keinen merklichen Geschwindigkeitsunterschied macht

Kristina Brooks
quelle
Keine schlechte Lösung. Es behebt die Sicherheitslücken, die mit $_REQUESTdem gleichen Skript verbunden sind , ermöglicht aber dennoch den Zugriff auf dasselbe Skript (in meinem Fall wird dasselbe Skript mit verschiedenen 'Aktionen' verwendet, und manchmal wäre $ _GET in Ordnung, aber manchmal benötige ich $ _POST zum Ausblenden / Sichern der Daten).
Xandor
4

Es gibt bestimmte Sicherheitsbedenken, da ein Hacker ein Cookie setzen kann, das einen Wert von $ _POST oder $ _GET überschreibt. Wenn Sie mit vertraulichen Daten umgehen, würde ich die Verwendung von $ _REQUEST nicht empfehlen. - Xandor

Sie können in einigen Fällen nicht als $_GETAlternative verwendet $_POSTwerden.

Wann ??

  • wenn Sie eine Datei hochladen möchten.
  • Wenn Sie keine Daten in der URL anzeigen möchten.

GETAußerdem sind die zu sendenden Informationen begrenzt. Die Beschränkung beträgt ca. 2000 Zeichen.

Andere Dinge gibt es nur wenige Fälle, in denen Sie keine Daten mit abrufen können $_POST

Wann ?

  • wenn Daten in URL übergeben werden.

Für den Rest Service

`GET` - Provides a read only access to a resource.

`PUT` - Used to create a new resource.

Es ist nichts falsch zu benutzen $_REQUEST .

Der Weg, dies zu tun, besteht darin, $ _SERVER ['REQUEST_METHOD'] explizit zu überprüfen und sich nicht darauf zu verlassen, dass $ _POST für ein GET leer ist.

Parth Chavda
quelle
1
Gute Ratschläge zur Verwendung $_SERVER['REQUEST_METHOD'], um zu überprüfen, ob das Skript mit einem der beiden aufgerufen wird. Aber zu sagen, dass nichts falsch $_REQUESTist, ist nicht 100% wahr. Es gibt bestimmte Sicherheitsbedenken, da ein Hacker ein Cookie setzen kann, das einen Wert von $ _POST oder $ _GET überschreibt. Wenn Sie mit sensiblen Daten umgehen, würde ich die Verwendung nicht empfehlen $_REQUEST.
Xandor
Ich habe Ihren Kommentar in meiner Antwort es s make Hilfe hinzugefügt danke
Parth Chavda
3

$ _GET ruft Variablen aus dem Querystring oder Ihrer URL ab.>

$ _POST ruft Variablen aus einer POST-Methode ab, z. B. (allgemein) Formulare.

$ _REQUEST ist eine Zusammenführung von $ _GET und $ _POST, wobei $ _POST $ _GET überschreibt. Es ist gut, $ _REQUEST für selbstauffrischende Formulare zur Validierung zu verwenden.

krunal panchal
quelle
2
Das Überschreiben hängt von request_orderCookie-Werten ab und kann diese auch enthalten, weshalb es keine sehr zuverlässige oder nützliche Funktion ist.
Ja͢ck
1

Ich würde die zweite Methode verwenden, da sie expliziter ist. Ansonsten wissen Sie nicht, woher die Variablen kommen.

Warum müssen Sie GET und POST überhaupt überprüfen? Sicherlich macht die Verwendung des einen oder anderen nur mehr Sinn.


quelle
1
Ich habe dies schon einmal gesehen, GETda es nur für ein Element (z. B. Verschieben) und POSTfür mehrere Elemente (ein Formular mit Kontrollkästchen ...) verwendet wurde.
Franz
1

Ich benutze immer nur _GET oder _POST. Ich habe lieber die Kontrolle.

Was mir an beiden Codefragmenten im OP nicht gefällt, ist, dass sie die Informationen verwerfen, für die die HTTP-Methode verwendet wurde. Und diese Informationen sind wichtig für die Desinfektion von Eingaben.

Wenn ein Skript beispielsweise Daten aus einem Formular akzeptiert, das in die Datenbank eingegeben werden soll, sollte das Formular besser POST verwenden ( verwenden Sie GET nur für idempotente Aktionen ). Wenn das Skript die Eingabedaten jedoch über die GET-Methode empfängt, sollte es (normalerweise) abgelehnt werden. Für mich könnte eine solche Situation das Schreiben einer Sicherheitsverletzung in das Fehlerprotokoll rechtfertigen, da dies ein Zeichen dafür ist, dass jemand etwas anprobiert.

Mit beiden Codefragmenten im OP wäre diese Bereinigung nicht möglich.


quelle
Eigentlich ist es ganz einfach, eine kleine Seite zu schreiben, die alles, was Sie wollen, auf einer Seite veröffentlicht. Wenn Sie sich also nicht darauf verlassen, dass Referrer-Header gesendet werden, sind Post-Vars nicht sicherer als Get-Vars. Ich nehme an, der größte Vorteil eines expliziten $_POSTist, zu verhindern, dass Suchmaschinen-Crawler so etwas tun: thedailywtf.com/Articles/WellIntentioned-Destruction.aspx
Duroth
Ich sagte nichts Gegenteiliges. Was ich sagte war, dass wenn das HTML-Formular POST verwendet und das Skript, das es verarbeitet, die Daten des Formulars über GET empfängt, das Skript dies wissen möchte und diese Tatsache nicht wegwirft, wie es beide Beispiele von kobra tun. (Übrigens: Referrer ist auch nicht sicher.)
1

Ich würde verwenden $_POST, und $_GETweil anders von $_REQUESTihrem Inhalt nicht beeinflusst wird variables_order.
Wann zu verwenden $_POSTund $_GEThängt davon ab, welche Art von Operation ausgeführt wird. Ein Vorgang, der die vom Server verarbeiteten Daten ändert, sollte über eine POST-Anforderung ausgeführt werden, während die anderen Vorgänge über eine GET-Anforderung ausgeführt werden sollten. Beispielsweise sollte ein Vorgang zum Löschen eines Benutzerkontos nicht direkt ausgeführt werden, nachdem der Benutzer auf einen Link geklickt hat, während das Anzeigen eines Bildes über einen Link erfolgen kann.

kiamlaluno
quelle
1

Ich benutze das,

$request = (count($_REQUEST) > 1)?$_REQUEST:$_GET;

Die Anweisung überprüft, ob $ _REQUEST mehr als einen Parameter hat (der erste Parameter in $ _REQUEST ist die Anforderungs-URL, die bei Bedarf verwendet werden kann. Einige PHP-Pakete geben $ _GET nicht zurück. Überprüfen Sie daher, ob mehr als 1 für $ _GET, By verwendet werden Standardmäßig ist es $ _POST.

Cosmo Arun
quelle
0

Sie optimieren vorzeitig. Außerdem sollten Sie sich aus Sicherheitsgründen wirklich überlegen, ob GET für POST-fähige Dinge verwendet werden soll.

Alex Brasetvik
quelle
3
Bitte versuchen Sie nicht, den Leuten zu sagen, dass POST sicherer ist als GET.
Ich hab nicht. Der Punkt war, dass ihre Verwendung einige Überlegungen angestellt und nicht offen austauschbar verwendet werden sollte, weil "nur das Eingeben von REQUEST so viel einfacher ist".
Alex Brasetvik
Wenn Sie damit meinen, dass Kobra überprüfen soll, ob die Daten mit der erwarteten Methode gesendet wurden, stimme ich zu. Jedes seiner Codebeispiele macht solche Tests unmöglich.
0

Es ist hässlich und ich würde es nicht als endgültige Lösung empfehlen, wenn Code live übertragen wird, aber beim Erstellen von Restfunktionen ist es manchmal praktisch, einen "catch-all" -Parameter-Grabber zu haben:

public static function parseParams() {
    $params = array();
    switch($_SERVER['REQUEST_METHOD']) {
        case "PUT":
        case "DELETE":
            parse_str(file_get_contents('php://input'), $params);
            $GLOBALS["_{$_SERVER['REQUEST_METHOD']}"] = $params;
            break;
        case "GET":
            $params = $_GET;
            break;
        case "POST":
            $params = $_POST;
            break;
        default:
            $params = $_REQUEST;
            break;
    }
    return $params;
}

Jemand, der kreativ ist, könnte es wahrscheinlich sogar hinzufügen, um Befehlszeilenparameter oder was auch immer von Ihrer IDE kommt, zu verarbeiten. Sobald Sie entschieden haben, was eine bestimmte Ruhefunktion tut, können Sie eine für diesen bestimmten Aufruf geeignete auswählen, um sicherzustellen, dass Sie das erhalten, was Sie für die Bereitstellungsversion benötigen. Dies setzt voraus, dass 'REQUEST_METHOD' gesetzt ist.

Scott
quelle