2009-09-14 13 views
8

Ich habe gerade diesen Code während des Studierens des Wordpress-Quellcodes (PHP) gesehen. Sie können sehen, dass sie alle get- und post-Werte in ein Request-Array umwandeln.

Nun, wie ich weiß es, $ _GET und $ _POST bereits verfügbar ist von $ _REQUEST OHNE mit der array_merge() -Funktion, so Ideen rufen, warum sie das tun würde?

$_REQUEST = array_merge($_GET, $_POST); 

Antwort

17

Das ist, weil die Standardeinstellung $_REQUEST eine Zusammenführung von $_GET, $_POST UND $_COOKIE ist. Auch die Reihenfolge, in der die Variablen dieser Superglobals in $_REQUEST zusammengeführt werden, ist abhängig von der Ini-Einstellung variables_order und kann ab PHP 5.3.0 auch durch request_order beeinflusst werden. Also meine Vermutung ist, dass der Entwickler sicherstellen wollte, $_REQUEST besteht nur aus $_GET und $_POST, in dieser bestimmten Reihenfolge zusammengeführt, wenn er nicht Zugriff auf Ini-Einstellungen (auf einem gemeinsamen Host zum Beispiel). Sie sehen, variables_order und request_order sind nicht pro Skript Basis konfigurierbar.

HTH

3

Dies ist so, wenn Sie ein GET-Variable und eine POST-Variablen mit dem gleichen Namen haben, wird die POST-Variablen über die GET einen wählen.

Auch möchten Sie möglicherweise nicht die Cookies in der Variable $ _REQUEST.

+2

Eigentlich wird es die $ _POST über die $ _GET gewählt. array_merge manual: http://www.php.net/manual/en/function.array-merge.php – Havenard

+0

"[...] es wird die GET-Variable über den POST eins wählen". Das ist nicht wahr; es ist umgekehrt. Werte von letzteren Arrays mit entsprechenden Schlüsseln überschreiben frühere Werte. Siehe http://www.php.net/array_merge –

+0

Feste Informationen. –

1

Ich weiß nicht genau, warum es gemacht wurde, wo Sie es gesehen haben, aber ich habe gesehen, dass zuvor getan, wenn die Werte in dem einen oder anderen Array verarbeitet wurden und Sie diese Änderungen wieder in $ zusammenführen möchten _REQUEST, damit jeder, der $ _REQUEST verwendet, die Änderungen erhält, obwohl sie an den Variablen $ _POST oder $ _GET vorgenommen wurden.

Dies kommt in Situationen wie Wordpress hat, weil Plugin-Entwickler alle diese Variablen verwenden können, um auf Daten zuzugreifen, und der Wordpress-Kern müsste sicherstellen, dass sie alle die gleichen Daten erhalten.

Warum möchten Sie nicht direkt zu $ ​​_REQUEST? Weil $ _REQUEST eine Tonne zusätzlicher Informationen enthält, die $ _POST und $ _GET nicht haben. Möglicherweise möchten Sie Ihre Verarbeitung nicht auf alle zusätzlichen Bits anwenden.

6

$_REQUEST enthält den Inhalt von $_GET, $_POST und $_COOKIE Arrays standardmäßig. Vielleicht möchten sie COOKIE-Variablen davon ausschließen, da sie in der Regel nicht für diesen Zweck verwendet werden.

+0

+1 Nur das gleiche schreiben. – Havenard

+0

ya, vielleicht aus Sicherheitsgründen wollen sie COOKIES aus $ _REQUEST beseitigen, können GET und POST zusammen verwenden. +1 für die großen Köpfe, die gleich denken. – mauris

+0

Ja, dies ist ein üblicher XSS-Angriffsvektor, weil bösartiges JavaScript Cookie-Vars setzen kann, ohne dass der Benutzer es merkt, und PHPs Standard-GPC-Reihenfolge bedeutet, dass diese Cookie-Werte überschreiben, was der Benutzer in das Formular eingibt. – joelhardi