PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : XMLHttpRequest-Upload auslesen



Qudus
14-03-2005, 14:28
hi

Eigentlich gehört das ja nicht nur in das PHP-Forum, sondern ist ein Problem aus der Kombination JavaScript (XMLHttpRequest) und PHP.

Ich habe einen String (wird wahrscheinlich XML werden) und will ihn mit dem XMLHttpRequest-Objekt senden. Also erstelle ich eine neue Instanz und führe darauf folgendes aus:
xhr.open("POST", URL, true); // URL ist ohne request (also kein GET)
xhr.onreadystatechanged = func;
xhr.send(str);

Das Auswerten des Geladenen mittels der Funktion "func" ist kein Problem. Aber nun zu meinem tatsächlichen Problem:

Mir fehlt der PHP-Code, um den über POST gesendeten String auszuwerten. Ich habe schon das gesamt Internet durchgelesen, bin aber leider nirgends fündig geworden. Ich hoffe sehr, dass mir her jemand weiterhelfen kann.

Qudus

----------------------
Mandrake Linux 10.1
PHP 4.3.8
Apache 2.x
Firefox 1.01

Gaert
14-03-2005, 15:25
Hallo,

ich werde aus deiner Frage nicht ganz schlau.... was genau willst du denn auswerten?

Gruß,

Gaert

(PS: Du musst ja viel Zeit haben wenn du das ganze Internet liest :D ).

Qudus
14-03-2005, 15:42
ich werde aus deiner Frage nicht ganz schlau.... was genau willst du denn auswerten?

Soweit ich weiß, kann man Formulardaten auf zwei Arten zum Server schicken: GET oder POST. GET funktioniert über den Zusatz an der Adresse ('?var=1&var2=xxxxx') und POST irgendwie nicht so direkt sichtbar im Hintergrund. XMLHttpRequest scheint sich ja auch dieser beiden Methoden zu bedienen, da es an das HTML-Protokoll gebunden ist. GET-Variablen kann ich ganz einfach übermitteln, in dem ich der open()-Methode folgendes übergebe: xhr.open('GET', URL+'?var1=1', true);
Will ich aber POST verwenden, schreibe ich xhr.open('POST', URL, true); und übergebe dann der send() Methode Folgendes: xhr.send(str); Diesen String 'str' will ich nun auf der Serverseite auslesen. (Oder irgendwie sonst einen kompletten String, der auch z.B. XML sein kann, übergeben, falls die send()-Methode nicht die richtige dafür ist.

Und danke, für Deine Antwort. Ich hoffe, Du kannst mir weiterhelfen.


(PS: Du musst ja viel Zeit haben wenn du das ganze Internet liest :D ).

Tja, man tut, was man kann...

Qudus

Gaert
14-03-2005, 17:23
Hallo,

du solltest dir vielleicht erstmal ein paar PHP Howtos anschauen.

- Alles was per Post an eine PHP Seite geschickt wird steht im Array $_POST[]
- Alles was per Get an eine PHP Seite geschickt wird steht im Array $_GET[]

Allerdings musst du auch sagen wie die Variable heißt, die du schickst...

Ich habe im Web folgendes Beispiel gefunden, welches dir vielleicht hilft:

Ob du in diesem Beispiel "GET" oder "POST" verwendest dürfte eigentlich egal sein...



<script src="xmlhttp.js" type="text/javascript"></script>
<script>
function calc() {
frm=document.forms[0]
url="add.1?a="+frm.elements['a'].value+"&b="+frm.elements['b'].value
xmlhttp.open("GET",url,true);
xmlhttp.onreadystatechange=function() {
if (xmlhttp.readyState==4) {
document.forms[0].elements['total'].value=xmlhttp.responseText
}
}
xmlhttp.setRequestHeader('Accept','message/x-formresult')
xmlhttp.send(null)
return false
}
</script>
<form action="add.1" method="get" onsubmit="return calc()">
<input type=text name=a value=""> + <input type=text name=b value=""> = <input type=text name=total value="">
<input type=submit value="Calculate">
</form>


Gruß,

Gaert

Qudus
14-03-2005, 17:46
du solltest dir vielleicht erstmal ein paar PHP Howtos anschauen.

Danke, aber ich glaube ich kenne mich bei weitem gut genug mit PHP aus. Ich verwende es schon seit einiger Zeit sehr intensiv. Mir ist natürlich bekannt, dass get-Zeug in $_GET ankommt und post-Zeug entsprechend. Ich habe sogar schon sicherheitshalber $_REQUEST überprüft. Aber da ist auch nichts angekommen.

Ich würde mal sagen, dass es durchaus nicht egal ist, ob GET oder POST benutzt wird, da man ja offensichtlich POST ganz anders behandeln muss. Es mag ja sein, dass die Variablen dann über POST übertragen werden, wenn ich der open()-Methode POST übergebe. Hilft mir aber auch nicht weiter, da ich ja irgendwie einen kompletten string übergeben will. Und der kommt nicht an.

Kennst Du irgendwo vollständige Doku zur XMLHttpRequest-Klasse? Mich würde insbesondere mal interessieren, was man der send()-Methode eigentlich offiziell übergeben kann.

Gaert
15-03-2005, 07:57
Hallo,

Schau mal in $HTTP_RAW_POST_DATA rein... (vorher den Flag "always_populate_raw_post_data" in der php.ini aktivieren) - das wäre fast meine letzte Vermutung wo die Daten stecken könnten.

Achja... wegen dem $_POST und $_GET - deine Frage hat sich sehr nach Anfänger angehört.

Und bei dem Beispiel von oben müsste es wirklich egal sein, da Post und Get technisch eigentlich das selbe ist (ich bin leider immer noch nicht dazu gekommen es selbst mit post zu testen).

Gruß,

Gaert

Pingu
15-03-2005, 07:59
Danke, aber ich glaube ich kenne mich bei weitem gut genug mit PHP aus. Ich verwende es schon seit einiger Zeit sehr intensiv. Mir ist natürlich bekannt, dass get-Zeug in $_GET ankommt und post-Zeug entsprechend. Ich habe sogar schon sicherheitshalber $_REQUEST überprüft. Aber da ist auch nichts angekommen.
Dann scheint es an etwas anderem zu liegen. Dann scheint der Request beim Server nicht richtig anzukommen. Was sagen denn die Server-Logs?


Ich würde mal sagen, dass es durchaus nicht egal ist, ob GET oder POST benutzt wird, da man ja offensichtlich POST ganz anders behandeln muss.
Aus Sicht eines Scriptes ist es vollkommen egal, ob es die Daten über GET, POST, PUT, usw. usf. bekommen oder nicht. Denn das ist ja gerade die Aufgabe des Web-Servers die Daten so aufzubereiten, daß die Schnittstelle für die nachfolgende Verarbeitung die Gleiche ist unabhängig von der Datenanlieferung.

Es mag ja sein, dass die Variablen dann über POST übertragen werden, wenn ich der open()-Methode POST übergebe. Hilft mir aber auch nicht weiter, da ich ja irgendwie einen kompletten string übergeben will. Und der kommt nicht an.
Was sein kann, ist, daß die Daten nicht richtig formatiert sind. Denn ein Script bekommt alle Daten als "großen" String geliefert und splitet ihn dann nach seinen Bedürfnissen auf. Deswegen muß z.B. PHP auch das Trennzeichen (normalerweise "&") mitgeteilt werden. Wenn Du jetzt Deine Daten nicht entsprechend formatiert lieferts, mußt Du Dir überlegen wegen wie Deine Formatierung ist und dies dem PHP-Interpreter sagen.
Alternativ wenn Du XML-Daten oder auch sog. SOAP-Requests verarbeiten willst, solltest Du Dich auch mit SOAP auseinandersetzen. Dies gibt es sogar im Manual zu PHP: http://de2.php.net/soap


Kennst Du irgendwo vollständige Doku zur XMLHttpRequest-Klasse? Mich würde insbesondere mal interessieren, was man der send()-Methode eigentlich offiziell übergeben kann.
Schon einmal Google probiert? http://xulplanet.com/references/objref/XMLHttpRequest.html

Also ich habe mich jetzt eigentlich nur ca. 10 min damit befaßt und auch nur zwei Google-Anfragen gestartet. Aber irgendwie habe ich immer mehr Zweifel an dieser Aussage:
. Ich habe schon das gesamt Internet durchgelesen, bin aber leider nirgends fündig geworden.
Denn so auf die Schnelle bin ich auf folgende Tutotrials gestossen:
http://developer.apple.com/internet/webcontent/xmlhttpreq.html
http://jibbering.com/2002/4/httprequest.html
http://www.xml.com/pub/a/2005/02/09/xml-http-request.html
http://www.webpasties.com/xmlHttpRequest/
http://xulplanet.com/tutorials/mozsdk/xmlparse.php
http://shiflett.org/hacks/php/streams_post
(Part 1 - Client Side) http://www.arachnion.de/conf2004/xul1.pdf und (Part 2 - Server Side) http://www.arachnion.de/conf2004/xul2.pdf

Übringes meine Keywords für Google waren einfach nur xmlhttprequest open post php (http://www.google.de/search?q=xmlhttprequest+open+post+php&sourceid=mozilla-search&start=0&start=0&ie=utf-8&oe=utf-8&client=firefox-a&rls=org.mozilla:de-DE:official)

Pingu

PS:
da es an das HTML-Protokoll gebunden ist. Es gibt kein HTML-Protkoll. HTML ist eine Beschreibungssprache. Es gibt das HTTP-Protokoll, welches allerdings wesentlich mehr Arten von Requests neben GET und POST unterscheidet. Dazu zählen unteranderem HEAD, PUT, DELETE, TRACE, OPTIONS, CONNECT.

Qudus
15-03-2005, 13:54
Schau mal in $HTTP_RAW_POST_DATA rein... (vorher den Flag "always_populate_raw_post_data" in der php.ini aktivieren) - das wäre fast meine letzte Vermutung wo die Daten stecken könnten.

Das schaue ich mir sehr gerne mal an. Allerdings scheinen diese Daten ja nun weder über GET noch über POST übertragen zu werden.


Achja... wegen dem $_POST und $_GET - deine Frage hat sich sehr nach Anfänger angehört.

Ja, stimmt. Ich wollte die frage möglichst Kenntnisneutral schreiben, damit ich alle Informationen bekomme.


Was sagen denn die Server-Logs?

Leider kann ich das jetzt nicht nachsehen, da ich auf der Arbeit bin und zu Hause noch ein oder zwei Wochen kein Internet habe.


Aus Sicht eines Scriptes ist es vollkommen egal, ob es die Daten über GET, POST, PUT, usw. usf. bekommen oder nicht. Denn das ist ja gerade die Aufgabe des Web-Servers die Daten so aufzubereiten, daß die Schnittstelle für die nachfolgende Verarbeitung die Gleiche ist unabhängig von der Datenanlieferung.

Ich glaube, ich habe da etwas falsch verstanden. Ich dachte immer, dass Daten dadurch, dass sie als Teil des Requests übertragen werden (domain?var1=x&var2=y) automatisch über GET übertragen werden. Aber das schein ja falsch zu sein über die Tatsache ist irreführend. Jedenfalls werde ich wohl POST benutzen müssen, da so eine XML-Datei ja auch mal was größer werden kann.


Wenn Du jetzt Deine Daten nicht entsprechend formatiert lieferts, mußt Du Dir überlegen wegen wie Deine Formatierung ist und dies dem PHP-Interpreter sagen.

Das ist na gute Idee. In der Doku, die Du mir angegeben hast, stand auch endlich mal klar drin, was das eigentlich ist, was man da mit der send()-Methode überträgt. Nämlich der body. Dass das dann nicht im GET oder POST erscheint, ist ja dann klar. Leider endet die Doku mit dieser Aussage und ich weiß jetzt immernoch nicht , wie ich an diese Daten rankomme. Aber mit der Formatierung muss ich wohl wirklich mal rumspielen.

SOAP will ich übrigens in meinem Projekt nicht nutzen. Aber danke für den Hinweis.


Schon einmal Google probiert?

Na klar! ich hab die letzten Tage nichts anderes gemacht.


Also ich habe mich jetzt eigentlich nur ca. 10 min damit befaßt und auch nur zwei Google-Anfragen gestartet. Aber irgendwie habe ich immer mehr Zweifel an dieser Aussage: ...

Tja, das geht mir öfters so. Ich scheine irgendwie nicht die richtigen Fragen an Google zu stellen. Obwohl ich diese Keywords auch verwendet habe, naja vielleicht nicht in der Reihenfolge. Aber das sollte wohl auch nicht wichtig sein.


Es gibt kein HTML-Protkoll. HTML ist eine Beschreibungssprache. Es gibt das HTTP-Protokoll...

Entschuldige bitte. Das meinte ich!!!


..., welches allerdings wesentlich mehr Arten von Requests neben GET und POST unterscheidet. Dazu zählen unteranderem HEAD, PUT, DELETE, TRACE, OPTIONS, CONNECT.

Interessant. Kann man die auch gebrauchen? Und ich meine das im Sinne von "Nutzen die mir was?".

Also jedenfalls vielen Dank für Deine Mühen.

Qudus

sebian
10-06-2005, 11:16
hallo

ich hatte dasselbe problem mit xmlhttprequest und POST.

die lösung ist tatsächlich folgende (vor dem send() ausführen):
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');

dann kann man als send-parameter einen query-string (im GET-format urlencoded, sorry) mitliefern.

wie man jetzt z.b. files mit xmlhttprequest hochladen kann, habe ich bisher leider auch noch nicht herausgefunden. ich hab da schon komplizierte lösungen gesehen, wo man irgendwie einen Stream zusammenbasteln muss und dann als xml-objekt mitschicken muss, oder so. mühsam. hoffentlich gehts auch einfacher...

nEox
10-06-2005, 18:11
Hallo Ihr,

hier mal noch 2 interessante Links:

http://www.modernmethod.com/sajax/
http://backbase.com/index.php

Gruß

nEox