PHP - Formular - $PHP_SELF und Variablen
Mark
- php
0 Harry0 Mark
0 Andreas Korthaus0 Andreas Korthaus0 Mark
Hallo und guten Morgen,
ich habe ein Formular, dass sich zuvor mit Hilfe von Variablen dynamisch zusammensetzt. Dieses Formular soll die Seite in dem es eingebunden ist, erneut aufrufen und eine Aktion ausführen und dann wieder so erscheinen wie's vorher "zusammengebaut" wurde. Mit der Variable $PHP_SELF komme ich nicht weiter als Aktion, dann sind die Variablen die das Formular gebaut haben futsch. Gibt es ausser einem/mehrere "Hiddenfelder" andere Möglichkeiten?
Gruss, MArk
Holladiewaldfee,
Gibt es ausser einem/mehrere "Hiddenfelder" andere Möglichkeiten?
Was hast Du gegen die hidden-Felden?
Du kannst die Anzahl der Felder auf eins reduzieren indem Du alle fraglichen Variablen in ein Array packst und dann mit serialize() einen String draus machst. unserialize() macht wieder ein Array draus.
Sollten allerdings "vertrauliche" Informationen dabei sein, die der User keinesfalls manipulieren darf, dürftest Du wohl auf Sessions umsteigen müssen.
Ciao,
Harry
Hallo Harry,
Was hast Du gegen die hidden-Felden?
Du kannst die Anzahl der Felder auf eins reduzieren indem Du alle fraglichen Variablen in ein Array packst und dann mit serialize() einen String draus machst. unserialize() macht wieder ein Array draus.
Hiddenfelder könnte ich nehmen, klar. Die Daten die weiter verwendet werden sollen, sind nur für den Aufbau des Formulars relevant. Sind insgesamt 5 Werte (Ziffern) Also nichts vertrauliches. Nichtsdestotrotz möchte ich meinen Quelltext so sparsam wie möglich gestalten.
Mit einem Hiddenfeld könnte ich leben daher jetzt auch mein Interesse an "serialize". Allerdings bin ich aus php.net nicht ganz schlau geworden...
---------------------------------------
$wert1="Test 1<br>";
$wert2="Test 2<br>";
$wert3="Test 3<br>";
$ausgabe.=serialize($wert1);
$ausgabe.=serialize($wert2);
$ausgabe.=serialize($wert3);
echo $ausgabe;
$ausgabe2=unserialize($ausgabe);
echo $ausgabe2; // hier bekomme ich jetzt nur wert1 angezeigt
---------------------------------------
Mache ich es mir schon wieder zu einfach?
Gruss Mark
Hoi!
$ausgabe.=serialize($wert1);
$ausgabe.=serialize($wert2);
$ausgabe.=serialize($wert3);
echo $ausgabe;
sowas ist böse[tm] ;-)
wenn Dein PHP schlecht konfiguriert ist kann ich so böse Dinge einschleusen, indem ich dem Script irgendwas Schlimmes im Parameter "?ausgabe=<boeser_code>" übergebe, dann wird dies in der Seite ausgegeben.
Daher besser
$ausgabe=serialize($wert1);
$ausgabe.=serialize($wert2);
$ausgabe.=serialize($wert3);
hierdurch wird so ein parameter von der ersten Zuweisung überschrieben.
$ausgabe2=unserialize($ausgabe);
echo $ausgabe2; // hier bekomme ich jetzt nur wert1 angezeigt
eher so:
$array['wert1']="Test 1<br>";
$array['wert2']="Test 2<br>";
$array['wert3']="Test 3<br>";
$ausgabe = serialize($array);
echo "<input type="hidden" name="ausgabe" value="$ausgabe">"
und dann im nächsten Script:
var_dump(unserialize($_REQUEST['ausgabe']));
Das geht aber auch mit jeweils eigenen Feldern für jeden Wert. In Deinem Fall solltest Du die Werte darüber hinaus auch kodieren, z.B. mit base64... damit die Sonderzeichen wie <> Ihre Sonder-Funktionen in HTML verlieren. Natürlich entsprechend dekodieren im Script.
ich würde es allerdings anders machen:
session_start();
$_SESSION['wert1']="Test 1<br>";
$_SESSION['wert2']="Test 2<br>";
$_SESSION['wert3']="Test 3<br>";
und auf der nächsten Seite:
session_start();
echo $_SESSION['wert1'];
echo $_SESSION['wert2'];
echo $_SESSION['wert3'];
...
Links zu Infos zum Thema Sessions habe ich oben gepostet.
Grüße
Andreas
Hallo!
ich habe ein Formular, dass sich zuvor mit Hilfe von Variablen dynamisch zusammensetzt. Dieses Formular soll die Seite in dem es eingebunden ist, erneut aufrufen und eine Aktion ausführen und dann wieder so erscheinen wie's vorher "zusammengebaut" wurde. Mit der Variable $PHP_SELF komme ich nicht weiter als Aktion, dann sind die Variablen die das Formular gebaut haben futsch. Gibt es ausser einem/mehrere "Hiddenfelder" andere Möglichkeiten?
Wenn es nur eine Seite ist könntest Du die $_REQUEST Daten auslesen und hiermit die Formularfelder wieder befüllen.
Wenn es über mehrere Rerquests funktionieren soll, oder Du aus den $_REQUEST Variablen das Formular nicht mehr herstellen kannst, könntest Du es mit Sessions machen, hierüber kannst Du im superglobalen Array $_SESSION Daten über mehrere Requests hinweg serverseitig speichern und wieder drauf zugreifen (um sie z.B. erneut in ein Formular einzusetzen...)
http://www.dclp-faq.de/q/q-sessions-zweck.html
http://www.dclp-faq.de/q/q-sessions-wie.html
http://tut.php-q.net/sessions.html
http://de3.php.net/manual/en/ref.session.php
Grüße
Andreas
PS: $PHP_SELF ist veraltet und Du solltest es durch $_SYSTEM['PHP_SELF'] ersetzen.
Hoi!
PS: $PHP_SELF ist veraltet und Du solltest es durch $_SYSTEM['PHP_SELF'] ersetzen.
Ach man, ich meine natürlich: $_SERVER['PHP_SELF'] ;-)
Grüße
Andreas
Hallo Andreas,
die Idee mit Sessions kam mir auch schon, aber ich denke das ist ein Thema mit dem ich mich -> unwissender -> erst einmal intensiver beschäftigen sollte. Das bringt bestimmt noch nichts wenn ich da jetzt bröckchenweise in meine Scripte reinschmeisse.
und Danke für den Hinweis mit $_SERVER['PHP_SELF']
Gruss, Mark
Hallo Mark!
die Idee mit Sessions kam mir auch schon, aber ich denke das ist ein Thema mit dem ich mich -> unwissender -> erst einmal intensiver beschäftigen sollte. Das bringt bestimmt noch nichts wenn ich da jetzt bröckchenweise in meine Scripte reinschmeisse.
Sessions sind eine wirklich nützliche Sache in PHP, das slohnt sich sehr soch damit zu beschäftigen. Du solltest Dir mal ein bisschen Zeit nehmen die von mir geposteten Links sorgfältig durchzulesen, dann solltest Du das Session-Konzept von PHP verstanden haben udn hast damit ein neues, nützliches Werkzeug. Dass das ganze wirklich recht einfach ist siehst Du an meinem Beisüpiel unten, und es bietet viel Vorteile gegenüber hidden-fields.
Bedenke auch, dass jemand hidden-fields manipulieren kann. Das mag Dir jetzt bei so "unwichtigen" Saten nicht wichtig erscheinen, aber Du gibst bei Dir die Werte direkt aus, das heißt wenn ich an Stelle dem was Du vorsiehst was anderes an Dein Script schicke kann ich damit böse Dinge machen, auch wenn Du das mit $ausgabe .= änderst! Bei Sessions besteht die Gefahr nicht weil die Daten serverseitig gespeichert werden, und PHP übernimmt das komplett für Dich. Du muss nur die Session starten und bekommst dann einen Array($_SESSION) in dem Du serverseitig Daten temporär ablegen kannst.
und Danke für den Hinweis mit $_SERVER['PHP_SELF']
Entsprechendes gilt übrigens für URL-Parameter und Formularwerte.
Verwende zum Zugriff hierauf ausschließlich noch $_POST, $_GET oder $_REQUEST.
Lies hierzu mal http://de3.php.net/manual/de/language.variables.predefined.php
http://de3.php.net/manual/de/reserved.variables.php
http://www.dclp-faq.de/q/q-formular-register-globals.html
Das solte man unbedingt beachten, denn sonst laufen Deine Script auf einmal nicht mehr wenn der Provider das umstellt, oder Du den Provider wechselt, oder der Provider irgendwann auf eine PHP-Version updatet die register-globals überhaupt nicht mehr unterstzützt...
Außerdem hat das ganze durchaus seinen Grund, wenn Du "register-globals=off hättest bestünde das im anderen Posting beschriebene Risiko mit $ausgabe .=... nicht(!).
Und evtl. hast Du sowas unbewußt schon ananderen Stellen gemacht... es gibt hier auch gefährlichere Varianten wenn es zum Beispiel um Zugriffskontrolle geht...
Viele Grüße
Andreas
Hallo Andreas,
denke auch, dass es Zeit wird, mich mit Sessions zu beschäftigen. Vor allem nachdem was ich hier lese. Und den Fehler mit $variable.= habe ich nicht nur 2x gemacht... murks, muss ich alles nochmal durchschauen.
Vielen Dank für die Links, hoffe ich kann dem auch folgen und muss nicht soviel blöd nachfragen ;)
Gruss, Mark
Hi Mark!
Vielen Dank für die Links, hoffe ich kann dem auch folgen und muss nicht soviel blöd nachfragen ;)
Och, das schaffst Du schon ;-)
Als erstes würde ich das Kapitel im Tutorial lesen, dann die beiden Artikel aus den DCLP-FAQ, und dann den Text im offiziellen Manual.
Am besten die Beispiel direkt mal ein bisschen ausprobieren.
Grüße
Andreas