POST-Daten an "übernächste" Seite weitergegen
signorpiccolo
- php
0 Felix Riesterer0 Sash0 signorpiccolo0 Tom
Liebe Gemeinde,
mein Ziel ist, dass der User nach der Eingabe von Formulardaten diese nocheinmal auf einer Prüfseite in einer Tabelle (aber NICHT im selben Formular, Stichwort Affenformular http://de.wikipedia.org/wiki/Affenformular") angezeigt bekommt und wenn sie ok sind sie erst dann weiterverarbeitet werden.
Dazu werden die Daten aus dem Forular per POST an die unter action="pruefen.php" angegebene Seite geschickt und hier (in pruefen.php) aufgelistet. Wenn der User mit seinen Angaben einverstanden ist, soll durch Klick auf einen Button eine weitere Seite z.B. fertig.php aufgerufen werden und an diese Seite die POST-Daten abermals weitergegeben werden.
Ich bin nur zu blöd, die an pruefen.php erstmals übergebenen Daten ein weiteres Mal an eine darauffolgende Seite zu übergeben.
Könnt Ihr mir helfen?
Vielen Dank!
Lieber signorpiccolo,
was hindert Dich denn, alle Index/Werte-Paare aus dem Array $_POST in versteckte Input-Felder zu verpacken und auf der Seite mitzugeben?
$_POST sieht ja nach dem Abschicken in etwa so aus:
$_POST = array(
'name1' => wert1,
'name2' => wert2,
....)
Daraus kannst Du jetzt das hier basteln:
<form id="abgeschickte_werte">
<p>
<input type="hidden" name="name1" value="wert1" />
<input type="hidden" name="name2" value="wert2" />
...
<input type="submit" name="bestaetigt" value="bestätigen" />
<input type="submit" name="verworfen" value="verwerfen" />
</p>
</form>
Noch Fragen?
Liebe Grüße aus Ellwangen,
Felix Riesterer.
<form method='POST' action='xyz.php'>
<?
foreach ($_POST as $key => $value)
{
echo "<input type='hidden' name='$key' value='$value'>";
}
...
?>
</form>
Etwa so habe ich das bei mir gelöst in der Seite in der die Daten zur Kontrolle ausgegeben werden.
Greez, Sash
Sauber, Leute!
Danke für Eure Vorschläge. Da Ihr beide den gleichen Vorschlag gemacht habt, denke ich mal, dass das die gängigste oder vielleicht auch einzige Lösung ist. Ich find die Methode mit dem hidden zwar irgendwie komisch, aber mit der foreach-Schleife ist das ganze so kurz, dass es auch nicht weiter weh tut.
Vielen Dank nochmal für Eure SEHR schnellen Antworten!
Hello,
Danke für Eure Vorschläge. Da Ihr beide den gleichen Vorschlag gemacht habt, denke ich mal, dass das die gängigste oder vielleicht auch einzige Lösung ist. Ich find die Methode mit dem hidden zwar irgendwie komisch, aber mit der foreach-Schleife ist das ganze so kurz, dass es auch nicht weiter weh tut.
Beide sind aber unvollständig und werden bei üblicher Installation nicht funktionieren oder zumindest häufig zu Fehlern führen.
Ich nehme mal die Methode von Sash:
<form method='POST' action='xyz.php'>
Ok.
<?
foreach ($_POST as $key => $value)
{
echo "<input type="hidden" name="$key" value="". htmlspecialchars($value) ."">";
}
...
?>
</form>
Das mindeste ist, die Values in den HTML-Kontext zu stellen, also die HTML-eigenen Zeichen gegen benannte auszutauschen.
Die Umstellung auf Doppelhäkchen hat auch ihren Sinn, weil die Funktion htmlspecialchars() nur die doppelten Quotes in benannte Zeichen verwandelt, wenn keinen speziellen zusätzlichen Parameter (ENT_QUOTES) setzt.
Der nächste Fehler steckt im meistens eingeschalteten Magic_Quotes_GPC
Wenn dies eingeschaltet ist ( get_magic_quotes_gpc() fragen ), dann muss man die Maskierungen erst wieder entfernen, sonst werden es von Stufe zu Stufe mehr, oder man muss die Magic Quotes eben ausschalten. Dann muss man aber auch alle seine Datenbankanfragen und Mailprogramme etc. dringend nochmal prüfen, ob dort ordnungsgemäß escaped wurde.
Der dritte Fehler steckt darin, dass man i.d.R. auch einen Absendebutton im Formular hat und oft in allen Formularen denselben Namen dafür benutzt. Wenn man nun alle Post-Daten ins nächste Formular weiterreicht, ist der Button auf jeden Fall auch dabei. Dann muss man sich nicht wundern, wenn das zugehörige Auswertescript dann eventuell fehlerhaft arbeitet.
Daher solltest Du Dir angewöhnen, Daten, Aktionen und Controls (Nicht direkt an Daten gebundene Dialogelemente, wie Checkboxen, Radio-Buttons, Hidden-Fields z.B. für aktuelle Seitennummer, Select-Elemente, usw.) trennst. Das geht ganz einfach über den Namen.
echo "<input type="hidden" name="ctrl[$key]" value="". htmlspecialchars($value) ."" />";
echo "<input type="text" name="data[vorname]" value="". htmlspecialchars($value) ."" />";
echo "<input type="checkbox" name="ctrl[checkrecord][1]" value="checked" />";
echo "<input type="checkbox" name="ctrl[checkrecord][2]" value="checked" />";
echo "<input type="checkbox" name="ctrl[checkrecord][4]" value="checked" />";
echo "<input type="submit" name="btn[save]" value="Speichern" />";
echo "<input type="submit" name="btn[back]" value="Zurück" />";
Lass Dir das mal per print_r($_POST) im Script ausgeben.
Dann wären wir also bei:
<form method="post" enctype="multipart/form-data">
<?php
if isset($_POST['data'])
{
foreach ($_POST['data'] as $key => $value)
{
if (get_magic_quotes_gpc())
{
$value = stripslashes($value);
}
echo "<input type="hidden" name="data[$key]" value="". htmlspecialchars($value) ."">";
}
}
# ...
?>
</form>
Das stripslashes() kann man aber sinnvoller in einen anderen Scriptbereich, nämlich die Datenübernahme (EINGABE) verfrachten. Dort ist dann eine Funktion sinnvoll.
function strip($_data)
{
if (!get_magic_quotes_gpc())
{
return $_data;
}
if (is_array($_data))
{
foreach($_data as $key => $val)
{
$data[$key] = strip($val);
}
}
else
{
$_data = stripslashes($_data);
}
return $_data;
}
Beispiel: $_POST = strip($_POST);
Im Beispiel mit den Hidden-Fields habe ich absichtlich nur "$_POST['data']" weitergegeben, denn alle anderen Dialogklassen bedürfen besonderer Behandlung.
Außerdem bietet es sich an, nicht dutzende einzelner hidden-Fields, die im Klartext vorliegen, weiterzureichen, sondern ein einziges, in dem man das gesamte Array der Daten, die man weitergeben will, übergibt.
Array serialisieren mit serialize()
Zwischenergebnis mit base64_encode() für den HTML-Kontext codieren
Ergebnis ins Hidden-Field schreiben
Response an den Client
Client Request ans nächste Script
Hidden-Feld mit base64_decode() wieder dekodieren
Zwischenergebnis mit unserialize() wieder zum Array zurückverwandeln
Mit dem Array arbeiten
Alterntiv stehen für die Weitergabe von Daten natürlich Sessions zur Verfügung
Harzliche Grüße vom Berg
http://bergpost.annerschbarrich.de
Tom