kschroeder wrote:Ich versuchs mal so einfach zu formulieren, dass auch Wenn ich eine Fomular baue und einen Submit button... dann werden automatisch alle Formulardaten an das Script übergeben. Ich muss weiter nichts machen. Im Script liste.php stehen mir alle Formulardaten direkt zur Verfügung. Ich jedenfalls seh da nichts an Javascript, dass den Übergabestring erst Parameter für Parameter zusammenbastelt und übergibt.
Doppelt bis dreifach falsch. Zunächst werden bei einem POST-Request die Daten vom Browser an Apache gesandt, der startet den PHP Interpreter und dieser fügt für Dich die Daten in Array (ein assoziatives Array) mit dem Namen $_POST. Würdest Du stattdessen beispielsweise mit C-Programmen die CGI Scripts schreiben, so müßtest Du selbst den Datenstrom analysieren.
Weiters: exakt wie in PHP hast Du auch in JavaScript die Variablen in einem Array aufgearbeitet - nahezu 100%ig identisch. Nur: da heißt es nicht $_POST, sondern da JavaScript eine OO-Sprache ist, ist es dort ein Attribut eines Formulars im Document: document.formular.elements - das ist Pendant zu $_POST (oder $_GET oder $_REQUEST). Das ist nun einmal eine andere Sprache und eine andere Syntax.
Bei PHP erhältst Du die Feldinhalte, wenn Du die Namen angibst(!) - beispielsweise $_PHP['feld1']. Das funktioniert in JavaScript identisch, aber nicht vergessen, es ist OO, also muss ein weiteres Attribut herhalten, hier das neue Attribut "value" - das ergibt diese Syntax: document.formular.feld1.value - absolut logisch und semantisch identisch mit $_POST['feld1'].
Bei PHP kann man aber auch, ohne Kenntnis der Feldnamen, die Werte ermitteln, indem man beispielsweise einen Loop programmiert, da gibt es viele Varianten, ich nenne jetzt nur eine, die sieht ungewöhnlich aus, aber ich will sie an die JavaScript Syntax halbwegs annähern:
- Code: Select all
<?php
....
$count = count($_POST);
for ($i = 0;$i < $count;$i++) {
$name = key($_POST);
$value = current($_POST);
...
next($_POST);
}
?>
Mit diesem Code klapperst Du (ohne die Namen der Felder zu kennen), die Variablen in PHP ab. Mit foreach ginge es leichter, aber ich wollte mal mit einem Zähler arbeiten.
Wie die Syntax dafür in JavaScript aussieht, siehst Du im meinem obigen Beispiel - auch dort braucht man die Feldnamen nicht unbedingt zu kennen (obwohl man ja auch direkt mit den Namen zugreifen kann), sondern man kann mit einem ganz ähnlichen Zähler wie das PHP Codebeispiel die Variablen abklappern.
Dabei ist JavaScript sogar PHP überlegen, denn während PHP nur noch den Wert des Feldes kennt, stellt JavaScript außerdem noch den Type zur Verfügung - und ggf. noch mehr Attribute, ich habe jetzt kein Manual zur Hand.
Wie Du siehst, funktioniert in JavaScript die Abarbeitung der Variablen eines Formulars eigentlich identisch wie in PHP.
Das Problem ist, dass Du Dein Problem nicht verstehst: Du willst einen Request abbilden - einen HTTP Request - und dafür die Daten von JavaScript an einen Webserver senden. Das hat mit PHP gar nichts zu tun, denn Du mußt die HTTP Spezifikationen erfüllen, nicht die PHP Spezifikation.
Wenn Du das gleiche Problem in PHP lösen willst, sieht der Ansatz prinzipiell genauso aus: wenn Du mit PHP und der fsockopen()-Funktion einen HTTP-Request ausführen willst, mußt Du genauso für den Request die sog. "URL-Encoded" Variablen aufbereiten, nach dem gleichen Muster (feld1=wert1&feld2=wert2 usw.). Wenn Du dort allerdings die Werte aus einem Formular (sprich: Request) direkt weiterreichen willst, so ginge das aber ausnahmsweise in der Tat leichter, denn PHP selbst hat ja schon die Variablen auch via HTTP-Request bekommen, aber die PHP-Einstiegsroutinen stellen diese Variablen nicht nur als $_POST bzw. $_GET/$_REQUEST zur Verfügung, sondern es gibt auch den ganzen Query-String als einzigen String durchgereicht, das ist die Variable $_SERVER["QUERY_STRING"].
So eine Variable oder Methode bzw. Attribut kennt aber JavaScript nicht (wobei ich davon ausgehe, dass Du da auch noch gar nicht dran gedacht hast betreffend PHP).
Woran liegt das?
Das liegt daran, dass bei einem Request auf einen Webserver der Browser die Form-Variablen in dieses Format bringt und überträgt - und gnädigerweise läßt der PHP-Startcode diesen Querystring 1:1 durch und stellt ihn zur Verfügung.
Bei JavaScript aber wird überhaupt kein HTTP-Request ausgeführt, im Gegenteil, der Browser bekommt das gar nicht mit, es wird ein onSubmit-Event gestartet (bevor der Browser dran ist) innerhalb der JavaScript-Engine und die stellt die Felder NATÜRLICH NICHT URL-Encoded zur Verfügung - das wäre ja auch unsinnig, weil diese Formvariablen so noch zu parsen wären. Stattdessen gibt es die jetzt ja bekannten Objekte document und Formular mit den bekannten Eigenschaften.
Was es ist nicht gibt, ist genau die Funktion, die zu bauen aber wirklich einfach ist, wir haben sie ja quasi fertig, die aus den Formvariablen händisch einen URL-Encoded String bastelt - weil nämlich Ajax nichts anderes ist, als mit JavaScript einen HTTP-Request auszuführen, quasi unter dem Hintern des Browsers.
Ich hoffe, dass Du vielleicht jetzt verstehst, dass es das, was Du vermeintlich vermißt, nicht gibt und nicht geben kann, dass aber die avisierte Lösung standesgemäß ist und Deine Vorstellungen davon, dass in PHP alles einfacher und besser ist, nicht den Tatsachen entspricht. PHP ist eine andere Sprache, hat eine andere Syntax und JavaScript handelt die Formvariablen genau so, wie es das Modell der ObjektOrientierung vorschreibt. Absolut stringent und logisch.
kschroeder wrote:Und zu guter letzt, wäre da noch das Problem der maximalen URL-Länge.
Soweit mein Kenntnisstand beträgt die maximale Länge 2048 Zeichen, ich bin aber hier auch schon an die Grenze gestoßen.
Deswegen sollst Du ja auch nicht GET, sondern POST benutzen, da werden die Parameter nicht via URL übertragen, sondern es wird ein Datenstrom zum Server gesandt.
kschroeder wrote:Wie auch immer, Problem umgangen, Aufgabe gelöst und damit ist der Thread hier für mich geschlossen!
Gelöst hatte ich es bereits - leider hast Du es nur nicht verstanden. Vielleicht verstehst Du es jetzt besser - ich gebe die Hoffnung nicht auf.