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
Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
Nur selber lernen macht schlau
Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)
