Hi!
[..] will er wahrscheinlich nur trotz POST-Requests Werte im $_GET-Array von PHP haben. Wenn PHP dieses Array $QUERY_STRING genannt hätte, wäre es auch weniger missverständlich, wenn man den Q.S. meint, aber GET dazu sagt.
Tja, GET-Parameter werden auch üblicherweise aus dem QUERY_STRING gelesen, das ist in Perl auch so (Modul CGI.pm).
Und das ist eben der Irrtum oder die Fehlimplementation in Perl und PHP. Es sind keine GET-Parameter, sondern wie gesagt "Query-String-Parameter". Denn diese GET-/Querystring-Parameter lassen sind in jedem Request unterbringen, also auch beispielsweise HEAD, weil sie Bestandteil der URL sind und die braucht es schließlich für jeden Typ von Request. GET ist ein typischer Anwendungsfall für Daten im Query-String, und als Variablennamen schön kurz (QS wäre es auch, ist aber weniger verständlich), aber eben nicht der einzige.
Bei einem POST hingegen werden die Parameter aus STDIN gelesen. Die üblichen Parser haben daher eine Kontrollstruktur, wo erstmal geguckt wird, was der UserAgent gemacht hat, POST oder GET.
Warum? Ich wüsste nicht, was es bringt, den Request-Typ als (ausschließendes) Unterscheidungsmerkmal zu verwenden. Die URL ist in jedem Fall vorhanden und damit die Möglichkeit des Query-Strings. Es müsste lediglich auf POST getestet werden, um (zusätzlich) den Body des Requests auszuwerten.
Aber wenn ich will, kann ich mich über das "Übliche" erheben und auch bei einem POST auf der Serverseite die Parameter aus dem QUERY_STRING parsen, denn der wird bei einem POST nicht verändert.
Warum sollte er?
Das ist jedoch nicht unbedingt ne Sache, die ich empfehle. Wozu auch, macht nur zusätzliche Arbeit ;-)
Warum nicht, was spricht denn dagegen, Information auf verschiedenen Wegen zu übermitteln? Und was ist daran Arbeit? Information, die ich brauche, muss ich irgendwie übertragen, und da ist es vom Arbeitsaufwand her egal, wo ich sie übertrage. Es kann sich aber für eine bestimmte Aufgabenstellung als Vorteil erweisen, getrennte Übertragungswege für unterschiedliche Informationen zu verwenden.
Wenn im POST der Formularinhalt übertragen wird, der einen zu bearbeitenden Datensatz darstellt, so ist es eventuell ungünstig, dahinein noch Metadaten zu bringen, die vielleicht einen Benennungskonflikt ergeben. Dazu ein Beispiel, doch vorab: GET und Querystring nimmt man günstigerweise für das Abfragen von Information, also eine bestimmte URL (inklusive Querystring) sollte stets die gleiche Antwort liefern. Für serverseitige Datenveränderung sollte man GET nicht verwenden. Für den Fall ist POST besser geeignet. Ein POST-Request erzeugt also irgendeine Form von Veränderung auf dem Server. (Deswegen fragen Client in der Regel nach, wenn ein POST noch einmal wiederholt werden soll.) Dies ist nur eine allgemeine Richtlinie. Gründe, anders zu verfahren, wird es sicherlich geben.
Nun das Beispiel: Dargestellt wird eine Tabelle mit Datensätzen. Diese kann zum Beispiel durch Klick auf die Spaltenüberschriften sortiert werden. Diese Information, nach welcher Spalte sortiert werden soll, überträgt man praktischerweise als Query-Parameter, denn es wird nur anders dargestellt aber nichts verändert. Ein Automat (Suchmaschinenspider) kann diese URLs gefahrlos aufrufen. Der zweite Teil der Seite zeigt ein Formular an, mit dem man einen Datensatz (vielleicht einer aus obiger Tabelle) bearbeiten kann. Nun möchte ich aber durch das Absenden des Formulars nicht die Sortierinformation der Tabelle verlieren. Wie überträgt man also beides? Baut man die Sortierinformation als Hidden-Fields in den POST-Request ein, stören sie eventuell bei der Weiterverarbeitung des geänderten Datensatzes. Sie als URL-Bestandteil zu übertragen, da wo sie beim Spaltenkopf-Link-Click sowieso schon übertragen werden, sehe ich als besser geeignet an. Sie sind also immer da, egal bei welchem Request-Typ. (Dieses Beispiel ignoriert der Einfachheit halber Plausibilitätsprüfungen auf Serverseite, bei der zum Beispiel Feldnamen gegen eine Liste der erwarteten Namen geprüft werden.)
Insgesamt gibt es 4 Wege, Information in einem Request zu übertragen:
- Querystring
- POST-Daten
- Cookie
- PathInfo, beziehungsweise der Pfadanteil in der URL allgemein
Diese Möglichkeiten sind da, also kann man sich auch sinnvoll nutzen. Und das Gute daran: sie sind alle gleichzeitig nutzbar. (POST-Daten sind natürlich an einen POST-Request gebunden.)
Lo!