Bei Umleitung POST-Daten mitsenden...?
Ares
- php
Hallo!
Folgende Situation:
Es geht um ein mehrseitiges Kontaktformular. Der Nutze gibt also auf einer Seite seine Daten ein, klick auf Weiter, gelangt auf die nächste Seite, gibt seine Daten ein, etc.
Die Daten werden in einer Datenbank zwischen gespeichert, von Seite zu Seite wird nur eine SessionID per verstecktem Formfeld weitergegeben.
Auf der letzten Seite kommt es nun zu einem Problem:
Alle Daten wurden gesammelt und werden nun auf der letzten Seite noch mal angezeigt. Per Klick auf "Antrag absenden" wird das Ganze dann abgeschlossen.
Problem: Das Script an dass die Daten letztendlich gesendet werden sollen, hängt davon ab, welche Daten der Nutzer zuvor eingegeben/eingestellt hat. Es gibt also nicht ein festes Ziel, sondern mehre mögliche Ziele.
Bislang habe ich das so gelöst, dass alle eingegebenen Daten auf der letzten Seite als versteckte Formfelder hinterlegt werden, und das Ziel des Form entsprechend der Eingaben auf das Zielscript eingestellt wird. Klick der Nutzer auf "Antrag absenden", werden die Daten also an das richtige Script gesendet und dort verarbeitet. Der Nutzer sieht dann die Ausgabe des jeweiligen Scriptes...
Diesen Umweg finde ich nicht so elegant und da immer wieder neue Ziele hinzukommen ist er wenig praktisch. Ich würde ganze daher gerne so handhaben:
1. Keine versteckten Fehler (außer SessionID) auf letzter Seite
2. Daten werden auf letzter Seite wie zuvor an kontakt.php gesendet
3. kontakt.php entscheidet an welches Zielscript die Daten gesendet werden sollen
4. kontakt.php leitet den Nutzer zum Zielscript um und sende die Sessiondaten per POST mit
5. Das Zielscript verarbeitet die Daten und der Nutzer sieht die Ausgabe des Zielscriptes
Problem:
Ich weiß wie, wie ich den Nutzer weiterleite kann (header("Location: ziel.php") und wie ich aus einem PHP Script Daten an ein anderes Script poste (Socket öffnen, Header senden, etc.). Aber ich weiß nicht, wie ich das gleichzeitig tun kann.
Wie sende ich bei einer Weiterleitung POST-Daten mit? Geht das überhaupt?
Bei header("Location: ziel.php"); kann ich keine POST-Daten angeben (oder doch?).
Beim POST mit dem Script baut das Script eine Verbindung zu dem Zielscript auf, und nicht der Browser des Nutzers. Die Ausgabe des Zielscriptes landet also beim script unt nicht beim Nutzer...
Hat jemand eine Idee wie ich das lösen kann?
Die Daten per GET an die Zielscript zu senden ist leider keine Lösung. Ich kann die Schnittstelle der Zielscript nicht beeinflussen und die Mehrzahl nimmt die Daten nur per POST entgegen...
Besten Dank
Ares
Mahlzeit,
Beim POST mit dem Script baut das Script eine Verbindung zu dem Zielscript auf, und nicht der Browser des Nutzers. Die Ausgabe des Zielscriptes landet also beim script unt nicht beim Nutzer...
Ja und? Diese Ausgabe kannst Du doch an den Benutzer durchreichen ...
MfG,
EKKi
Ja und? Diese Ausgabe kannst Du doch an den Benutzer durchreichen ...
Klar, aber bei der Ausgabe handelt es sich nicht nur um "Daten empfangen" oder ähnlich kurze Inhalt, sondern ggf. um eine komplette Webseite, wo wieder weitere Daten eingeben werden müssen, etc.
Wenn ich die Ausgabe einfach an den Nutzer weiter leite sieht dieser die Zielseite unter www.meinedomain.de/kontakt.php. Das ist nicht Sinn der Sache
Wenn dann auf dieser Seite irgendwelche Daten gesendet werden sollen und keine absolute URLs angegeben sind, landen diese Daten auf meinem Server und nicht auf dem Server der Zielseite wo sie hingehören.
Das funktioniert so also leider nicht...
Mahlzeit,
Das funktioniert so also leider nicht...
Dann ist vielleicht Deine Problembeschreibung nicht ausführlich bzw. detailliert genug. Wie wär's mit einem (abgespeckten) Programmablaufplan bzw. Struktogramm, damit man mal sehen kann, wie überhaupt der "Workflow" ist und welche Datei auf welche weiterleitet bzw. als Formularziel hat? Wie wär's mit sonstigen technischen oder "politischen" Einschränkungen ("Diesunddas darf aber so nicht angezeigt werden"), die Du uns bisher verschwiegen hast?
MfG,
EKKi
Mhh, ich dachte eigentlich das Problem schon ziemlich genau beschrieben zu haben.
Die ganze Frage lässt sich auf den Titel des Postings zusammenstauchen. Ich denke es macht wenig Sinn, die eigentlich ganz einfache Frage mit weiteren Details unnötig zu überladen:
Wie kann ich den Nutzer mit Hilfe eines Scriptes auf eine andere Webseite umleiten und dabei gleichzeitig POST-Daten mitsenden?
Dabei gelten folgende Bedingungen:
1. Vor dem Absenden befindet sich der Nutzer auf www.meinedomain.de/kontakt.php
2. Beim Abenden werden die Daten an www.meinedomain.de/kontakt.php übergeben
3. kontakt.php entscheidet wo der Nutzer hin umgeleitet werden soll: www.zielseite.de/zielscipt.php
4. kontakt.php leitet den Nutzer an www.zielseite.de/zielscipt.php weiter UND gibt dabei Session Daten per POST an weiter.
5. Der Nutzer "befindet sich auf" www.zielseite.de/zielscipt.php, kommuniziert also mit dem neuen Server. Es findet keine Ausgabe der Daten von www.zielseite.de/zielscipt.php über www.meinedomain.de/kontakt.php statt.
Das Ganze ist wie gesagt leicht möglich, wenn kontakt.php die Daten direkt per versteckter Formfelder an zeilscript.php senden. Dies verstößt jedoch gegen Bedingung 2 und 3.
Ist eine solche Weiterleitung mit diesen Bedingungen möglich?
Wie kann ich den Nutzer mit Hilfe eines Scriptes auf eine andere Webseite umleiten und dabei gleichzeitig POST-Daten mitsenden?
Mit einer Weiterleitung via Location-Header garnicht.
Einzige Möglichkeit die mir bekannt wäre (und die ich für ziemlich schwachsinnig halte):
Erzeuge eine Weiterleitungs-Seite mit einem Formular an die Ziel-Adresse, füge alle Daten als hidden-Felder ein und versende dieses Formular mittels JavaScript beim sofortigen Laden der Seite (<body onload="document.forms[0].submit();" />) - für nicht JS Nutzer plaziere noch einen "Weiterleiten" Submit-Button auf der Seite.
Das ganze ist in etwa das was du wohl schon bisher hast, mit der Ausnahme dass das PHP Skript die Zieladresse ins Formular schreiben kann.
POST Daten via Location-Header sind definitiv nicht möglich.
Die Sache mit POST Daten selbst via Socket an die Ziel-Adresse senden geht nur bedingt und hängt davon ab, was auf der Zielseite gemacht werden soll (das hast ja selbst erkannt) - im Allgemeinen ist dies also auch keine Lösung.
Eine schöne Lösung für dein Problem fällt mir nicht ein, daher solltest du vielleicht deinen ganzen Ablauf überdenken, vielleicht kann man die Sache ja auch anders lösen.
Gruß,
Andreas
echo $begrüßung;
Es geht um ein mehrseitiges Kontaktformular. Der Nutze gibt also auf einer Seite seine Daten ein, klick auf Weiter, gelangt auf die nächste Seite, gibt seine Daten ein, etc.
Die Daten werden in einer Datenbank zwischen gespeichert, von Seite zu Seite wird nur eine SessionID per verstecktem Formfeld weitergegeben.
Warum nicht in der Session? Bei einem Abbruch des angefangenen Vorgangs hast du Leichen in der Datenbank. Sessiondaten werden automatisch weggeräumt, wenn sie lange Zeit nicht verwendet wurden. Aber das nur nebenbei.
Problem: Das Script an dass die Daten letztendlich gesendet werden sollen, hängt davon ab, welche Daten der Nutzer zuvor eingegeben/eingestellt hat. Es gibt also nicht ein festes Ziel, sondern mehre mögliche Ziele.
Ist diese Vorgehensweise bei der Verarbeitung zwingend? Oder kannst du die Daten von einem einzigen Script bearbeiten lassen und dann nur noch anschließend mit einer einfachen Weiterleitung auf die Zielseite verweisen? Diese kann ja bei Bedarf Daten aus der Session anzeigen.
Wie sende ich bei einer Weiterleitung POST-Daten mit? Geht das überhaupt?
Bei header("Location: ziel.php"); kann ich keine POST-Daten angeben (oder doch?).
Eine Weiterleitung ist nur ein Verkehrsschild. Das trägt dem Wegzuweisenden kein Gepäck hinterher. Der Browser muss selbst dafür sorgen, dass er das Umleitungsziel aufruft und notwendige Daten erneut mitsendet.
Um das Zurückgehen und erneute Senden von POST-Daten zu verhindern, bedient man sich gern eines Tricks. Das per POST aufgerufenen Script verarbeitet die Daten und antwortet mit einem Location-Header. Der Browser ruft daraufhin das angegebene Ziel per GET auf. Ein Zurückgehen führt auf die Seite vor dem POST-Aufruf. Dass dieser Trick (soweit ich weiß) immer funktioniert, zeigt, dass ein Location-Header einen GET-Request zur Folge hat. Die POST-Daten werden dabei verworfen.
Hat jemand eine Idee wie ich das lösen kann?
Versuche Weiterleitungen generell sparsam zu verwenden. Umleititis ist keine Lösung sondern in vielen Fällen bestenfalls überflüssig. Fallunterscheidungen kann man in einem einzigen Script abarbeiten. Man muss dazu nicht unbedingt mehrere Scripte vorhalten. Wenn das Script zu umfangreich wird, kann man Code oder feststehende Texte auslagern und inkludierern, per readfile() durchreichen oder mit anderen Filesystemfunktionen einlesen, gegebenenfalls bearbeiten und zum Anwender ausgeben.
echo "$verabschiedung $name";
Hi,
Um das Zurückgehen und erneute Senden von POST-Daten zu verhindern, bedient man sich gern eines Tricks. Das per POST aufgerufenen Script verarbeitet die Daten und antwortet mit einem Location-Header. Der Browser ruft daraufhin das angegebene Ziel per GET auf. Ein Zurückgehen führt auf die Seite vor dem POST-Aufruf. Dass dieser Trick (soweit ich weiß) immer funktioniert, zeigt, dass ein Location-Header einen GET-Request zur Folge hat.
Nicht per se - es kommt auf den verwendeten 3xx-Statuscode an.
http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
"If the 301/302/307 status code is received in response to a request other than GET or HEAD, the user agent MUST NOT automatically redirect the request unless it can be confirmed by the user, since this might change the conditions under which the request was issued."
"303 See Other - The response to the request can be found under a different URI and SHOULD be retrieved using a GET method on that resource."
"Note: RFC 1945 and RFC 2068 specify that the client is not allowed to change the method on the redirected request. However, most existing user agent implementations treat 302 as if it were a 303 response, performing a GET on the Location field-value regardless of the original request method. The status codes 303 and 307 have been added for servers that wish to make unambiguously clear which kind of reaction is expected of the client."
Die POST-Daten werden dabei verworfen.
In den in der Praxis existierenden Implementierungen in den gaengigen Clients trifft das wohl weitgehend zu.
Fazit ist also, "Redirect mit POST-Daten" ist derart nicht "funktionierend" zu erreichen.
MfG ChrisB
Hallo,
so richtig verstehe ich den Sinn der zwischengeschalteten "kontakt.php" nicht.
In Deiner letzten Formularseite hast Du doch alle eingegebenen Daten vorliegen und bestimmst anhand dieser das Ziel des Formulars. Wenn weitere Ziele hinzukommen, musst Du diese ja trotzdem manuell anlegen, ob nun in der Formularseite oder in "kontakt.php" - oder hab ich was nicht verstanden?
Grüße Basti