Zurücksenden einer Formulareingabe an das Formular
Helmut
- php
Hallo php-Eingeweihte,
wie erreiche ich, dass in dem php-file eine neue Eingabe nach Drücken der return-Taste nicht wieder durch die Voreinstellung 3.1415 ersetzt wird?
MfG, Helmut
<html><head><title>ErstesPHP</title></head>
<?php print($_POST["x"]); ?>
<form name="Formular" method="post">
<input type="text" name="x" value="3.1415" /> </form>
</body></html>
Hello,
wie erreiche ich, dass in dem php-file eine neue Eingabe nach Drücken der return-Taste nicht wieder durch die Voreinstellung 3.1415 ersetzt wird?
<html><head><title>ErstesPHP</title></head>
<?php print($_POST["x"]); ?>
<form name="Formular" method="post">
<input type="text" name="x" value="3.1415" /> </form>
</body></html>
Indem Du auf dem Server für die betroffenen Value-Attribute Variablen bereit hältst, und diese dann einsetzt. Dazu musst Du aber eine Zustandsorientierung erzeugen, z.B. mit einer Session, da HTTP das sonst nicht unterstützt.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Indem Du auf dem Server für die betroffenen Value-Attribute Variablen bereit hältst, und diese dann einsetzt. Dazu musst Du aber eine Zustandsorientierung erzeugen, z.B. mit einer Session, da HTTP das sonst nicht unterstützt.
Hallo Tom vom Berg,
vielen Dank für Deine Antwort!
Nachdem ich unter Session und Zustandsorientierung nachgeschlagen habe, erscheint mir das ziemlich kompliziert (max in pro min out). Deshalb gebe ich den aktuellen Wert lieber separat auf dem Bildschirm in der Nähe des input-Feldes aus.
MfG, Helmut
p.s.
Machmal frage ich mich , was für ein FORTRAN, C oder MATLAB wir wohl bekommen hätten, wenn sich die html-, js- oder php-Erfinder darüber hergemacht hätten.
Hello Helmut,
Indem Du auf dem Server für die betroffenen Value-Attribute Variablen bereit hältst, und diese dann einsetzt. Dazu musst Du aber eine Zustandsorientierung erzeugen, z.B. mit einer Session, da HTTP das sonst nicht unterstützt.
Hallo Tom vom Berg,
vielen Dank für Deine Antwort!Nachdem ich unter Session und Zustandsorientierung nachgeschlagen habe, erscheint mir das ziemlich kompliziert (max in pro min out). Deshalb gebe ich den aktuellen Wert lieber separat auf dem Bildschirm in der Nähe des input-Feldes aus.
Die Session benötigst Du auch nur, wenn Die Eingabe für mehr als einen Roundturn mitgeschleppt wrden muss.
erste Antwort
Server O O
/ \ / \
/ \ / \
/ \ / \
Client O O O usw.
Erstanfrage 2. 3.
2. = erstes Anzeigen einer Seite im Client
und ggf. zweite Anfrage mit erhaltenen Werten
an den Server
Bei 2. erhältst Du vom Server die Defaults in den Feldern, so wie Du sie definiert hast
Bei 3. erhältst Du dann ggf. die vom Benutzer eingegegebenen Werte (kontrolliert) zurück
Das Ganze Pingpongspiel wird auch mit "Affenformular" bezeichnet, weil jeder Affe das Formular mit seinen (falschen) Werten sooft zurückbekommen kann, bis der Server damit zufrieden ist. Such mal unter Affenformular.
Wenn Du aber nun z.B. Eingaben von 2. nach 4. durchschleppen musst, ohne dass diese dem User zur Verfügung gestellt werden sollsn (angezeigt werden sollen), dann bietet sich eine Session an. Du könntest die Werte auch in einem Hidden-Element verstecken, das dann aber vom User noch manipuliert werden könnte. Außerdem erhöht es den Traffic, was aber heutzutage wohl eher nebensächlich ist.
Du musst also nur feststellen, ob das Formular mit einem geeigneten Wert ausgefüllt worden ist und dieser übertragen wurde. Dann kannst Du anstelle des Defaults diesen Wert einsetzen in das Value-Attribut oder in die Textarea ...
p.s.
Machmal frage ich mich , was für ein FORTRAN, C oder MATLAB wir wohl bekommen hätten, wenn sich die html-, js- oder php-Erfinder darüber hergemacht hätten.
Da wirfst Du nun einiges durcheinander. HTML ist nicht primär daran schuld, sondern die Zustandslosigkeit des Client-Server-Prozesses per HTTP-Protokoll. Jeder Request steht für sich alleine. Da keine Verbindungsorientierung vorliegt, kann auch kein Zustand für die Verbindung gespeichert werden. Sie existiert ja nicht.
In der Praxis wird diese Forderung dann künstlich durch Session-Identifier erfüllt.
Die benötigen in PHP gerade mal einen Befehl:
<?php
session_start();
Alles andere geht dann automatisch.
In dem "superglobalen" Variablen-Array $_SESSION kannst Du dann alle zu speichernden Werte hinterlegen. Beachte die Grossschreibung des Bezeichners!
Mit
if (isset($_SESSION['mein_wert'])
{
echo ' <input name="mein_wert" type="text" value="' . htmlspecialchars($_SESSION['mein_wert']) . '">';
}
else
{
echo ' <input name="mein_wert" type="text" value="3.1415">';
}
kannst Du dann den vom User gesendeten Wert in der "kastrierten" Form ausgeben lassen. Hier mal explizit ausformuliert; das kannst Du beliebig kürzer schreiben...
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
... Hier mal explizit ausformuliert; das kannst Du beliebig kürzer schreiben...
Hallo Tom vom Berg
nochmal danke!
Dein Code (genauer: was ich daraus gemacht habe)
-----------------------------------------------
<html><head>
<title>ErstesPHP</title>
</head>
<?php
session_start();
if (isset($_SESSION['mein_wert'])
{
echo ' <input name="mein_wert" type="text" value="' . htmlspecialchars($_SESSION['mein_wert']) . '">';
}
else
{
echo ' <input name="mein_wert" type="text" value="3.1415">';
}
?>
</body></html>
-----------------------------------------------
erzeugt die Meldung Parse error: syntax error, unexpected '{' in C:\PHP\xampp\htdocs\ErstesPHP_self.php on line 7
Line 7 ist die erste geschweifte Klammer nach dem if.
Warum die Klammer unerwartet ist, ist mir nicht klar. Ich würde nach der if-Bedingung immer eine { erwarten.
MfG, Helmut
Hello,
Dein Code (genauer: was ich daraus gemacht habe)
<html><head>
<title>ErstesPHP</title>
</head>
<?php
session_start();
if (isset($_SESSION['mein_wert']))
^
{
echo ' <input name="mein_wert" type="text" value="' . htmlspecialchars($_SESSION['mein_wert']) . '">';
}
else
{
echo ' <input name="mein_wert" type="text" value="3.1415">';
}
?>
</body></html>erzeugt die Meldung Parse error: syntax error, unexpected '{' in C:\PHP\xampp\htdocs\ErstesPHP_self.php on line 7
Line 7 ist die erste geschweifte Klammer nach dem if.
es fehlte eine schließende runde Klammer beim if()
Und nun musst Du selbstverständlich auch etwas reinschreiben in $_SESSION['mein_wert'], wenn in $_POST['mein_wert'] etwas gesendet wurde...
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
es fehlte eine schließende runde Klammer beim if()
Hallo Tom vom Berg,
aua! Das hätte ich auch als Anfänger sehen mussen.
Inzwischen habe ich mein (Mini-)problem so gelöst:
---------------------------------------------------------
<html><head><title>ErstesPHP</title></head>
<form name="Formular" method="post">
<?php if (! isset($_POST["x"])){$_POST["x"]=3.1415;}; ?>
x = <input type="text" name="x" value="<?php print($_POST["x"]); ?>" />
</form>
<?php $x=$_POST["x"]; print('y = x^2 = ' . $x*$x); ?>
</body></html>
---------------------------------------------------------
Der Anfangswert 3.1415 wird wunschgemäß durch den zuletzt eingegebenen Wert ersetzt.
Ich suche immer nach einfachen Wegen. Wenn es noch einfacher geht, wär's noch besser.
MfG, Helmut
Hello,
aua! Das hätte ich auch als Anfänger sehen mussen.
Inzwischen habe ich mein (Mini-)problem so gelöst:
noch nicht ganz, denn du gibst ein ungeprüftes x aus dem Usereinflussbereich in den HTML-Kontext zurück. In x kann jeder Mist drinstehen.
Hierfür bieten die neueren PHP-Verionen die Filter-Funktionen.
http://de3.php.net/manual/en/book.filter.php
Die ermöglichen Dir, das alles strukturiert abzuwickeln.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
noch nicht ganz [gelöst], denn du gibst ein ungeprüftes x aus dem Usereinflussbereich in den HTML-Kontext zurück. In x kann jeder Mist drinstehen.
Hallo,
wäre es auch eine Lösung, statt
x =
den Ausdruck
<var> x = </var>
zu schreiben? Da kann dann m.E. nichts mehr drinstehen. Aber im Fall, den Du meinst, was könnte x (ohne var) denn für ein Konstrukt sein, wenn es "Mist" enthält? html-Variablen kenne ich bisher nicht.
MfG, Helmut
Hello,
noch nicht ganz [gelöst], denn du gibst ein ungeprüftes x aus dem Usereinflussbereich in den HTML-Kontext zurück. In x kann jeder Mist drinstehen.
Hallo,
wäre es auch eine Lösung, stattx =
den Ausdruck
<var> x = </var>
Das wäre dann sicherlich bezüglich der Auszeichnung in HTML sinnvoll, hat aber nichts mit dem Inhalt des Parameters zu tun.
zu schreiben? Da kann dann m.E. nichts mehr drinstehen. Aber im Fall, den Du meinst, was könnte x (ohne var) denn für ein Konstrukt sein, wenn es "Mist" enthält? html-Variablen kenne ich bisher nicht.
Es könnte ein ganzes JavaScript drinstehen.
Das mindeste wäre also, zu schreiben:
<form name="Formular" method="post" enctype="multipart/form-data">
<?php if (! isset($_POST["x"]))
{
$_POST["x"]=3.1415;};
?> }
x = <input type="text" name="x" value="<?php echo htmlspecialchars($_POST["x"]); ?>" />
----------------
</form>
um zu verhindern, dass das JavaScript als solches erkannt werden kann am Client.
Besser wäre es eben, das Format des Post-Parameters x zu überprüfen. Das geht z.B. mit den Filterfunktionen sehr bequem. Wenn diese dann meckern, setzt Du den Default-Wert ein und/oder schaltest das Feld im Hintergurnd auf rot (als Beispiel).
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
[latex]Mae govannen![/latex]
if (isset($_SESSION['mein_wert'])
Warum die Klammer unerwartet ist, ist mir nicht klar. Ich würde nach der if-Bedingung immer eine { erwarten.
Sie ist unerwartet, weil vorher noch nicht alle offenen Klammern geschlossen wurden, s.o.
Cü,
Kai
Moin!
wie erreiche ich, dass in dem php-file eine neue Eingabe nach Drücken der return-Taste nicht wieder durch die Voreinstellung 3.1415 ersetzt wird?
<html><head><title>ErstesPHP</title></head>
<?php print($_POST["x"]); ?>
<form name="Formular" method="post">
<input type="text" name="x" value="3.1415" /> </form>
</body></html>Indem Du auf dem Server für die betroffenen Value-Attribute Variablen bereit hältst, und diese dann einsetzt. Dazu musst Du aber eine Zustandsorientierung erzeugen, z.B. mit einer Session, da HTTP das sonst nicht unterstützt.
Ich find's schon beängstigend, dass du für ein sehr simples Affenformular-Problem gleich die Riesenkeule "Sessions" auspackst.
- Sven Rautenberg
Hello,
Ich find's schon beängstigend, dass du für ein sehr simples Affenformular-Problem gleich die Riesenkeule "Sessions" auspackst.
Beängstigend ist nur Dein Posting.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Mahlzeit Tom,
Beängstigend ist nur Dein Posting.
Warum?
MfG,
EKKi
Hello,
Beängstigend ist nur Dein Posting.
Warum?
...
Was ist denn an der Verwnedung von Sessions beängstigend?
Sessions sind hier bestenfalls "überskaliert", aber das kommt auf die weitere Entwicklung an. Sie sind keinesfalls fachlich falsch für die Herstellung einer Zustandsorientierung oder Wiederholung der Eingaben des Client!
Dieses Posting von Sven ist einfach irreführend und war sicherlich nur ein Versehen in der Wortwahl, denn ich setze voraus, dass er nicht polemisieren wollte.
Da ich außerdem das "Affenformular" ebenfalls vorgeschlagen habe, und auch angedeutet habe, welche Lösung wann interessant ist, war das "beängstigend" also unnötig bis unfair.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hi,
Da ich außerdem das "Affenformular" ebenfalls vorgeschlagen habe, und auch angedeutet habe, welche Lösung wann interessant ist, war das "beängstigend" also unnötig bis unfair.
Auf Basis der Fragestellung scheint mir das simple Affenformular immer noch am ehesten das zu sein, was der Frager braucht.
Und davon hast du auch geschrieben, ja - nachdem du erst mal die Keule "Zustandsorientierung" rausgeholt hast, über die sich der Frager zwar selber informiert hat, die ihm aber - verständlicherweise - viel zu komplex erschien.
Und in der nächsten Antwort erwähnst du dann beiläufig das Affenformular - nur um sofort im nächsten Satz dann wieder Sessions auszupacken, um etwas an sich ziemlich simples doch wieder zu verkomplizieren.
Und da kann ich Svens Erstaunen verstehen, warum du hier über etwas dozierst, was a) der Frager nicht braucht, und b) ihn vermutlich auf der Suche nach einer simplen Lösung erst mal ziemlich weit vom Weg abbringt.
MfG ChrisB
Hello,
Und da kann ich Svens Erstaunen verstehen, warum du hier über etwas dozierst, was a) der Frager nicht braucht, und b) ihn vermutlich auf der Suche nach einer simplen Lösung erst mal ziemlich weit vom Weg abbringt.
Und was ist daran 'beängstigend'?
Das Wort ist schlichtweg eine Unverschämtheit in diesem Zusammenhang.
Erstens sind Sessions keine "Keule" in PHP, weil sie so implementiert sind, dass unter Normalumständen wirklich nur ein Funktionsaufruf notwendig ist, und zweitens sind sie das ganze Gegenteil von 'beängstigend', weil sie die Sicherheit eines Web-Dialogsystems erhöhen - im Gegensatz zu hin und her geschickten Variablen.
Da dem OP hier sowieso nicht mit einer einzigen oberflächlichen Antwort geholfen ist (wie man sieht), ist es also nicht 'beängstigend', den Dialog mit dem Vorschlag von Sessions zu beginnen, sondern legitim.
Weitere Themen, die zu beachten sind:
und da fehlen bestimmt noch welche.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Und da kann ich Svens Erstaunen verstehen, warum du hier über etwas dozierst, was a) der Frager nicht braucht, und b) ihn vermutlich auf der Suche nach einer simplen Lösung erst mal ziemlich weit vom Weg abbringt.
MfG ChrisB
Hallo ChrisB und die übrigen PHP-Responder,
jetzt relaxt erst mal. Meine Frage entstammte dem allerersten Gehversuch mit PHP, wofür ich mir XAMPP eingerichtet habe (das ich aber nur im localhost-Modus zum Üben benutze). Meine Frage ist gelöst und der Code sieht so aus:
----------------------------------------------------------------------
<html><head><title>Quadrat</title>
</head><body>
<form name="Formular" method="post" enctype="multipart/form-data">
<?php
if (! isset($_POST["x"])){$_POST["x"]=3.1415;};
?>
x = <input type="text" name="x" value="<?php print(htmlspecialchars($_POST["x"])); ?>" />
<?php
$x=$_POST["x"];
print('y = x^2 = ' . $x*$x);
?>
</form>
</body></html>
----------------------------------------------------------------------
Das erscheint mir als angemessene Lösung, wobei ich Besonderheiten wie enctype="multipart/form-data oder htmlspecialchars() gläubig hinnehme, solange der Code damit immer noch einfach bleibt und funktioniert.
Übrigens habe ich als Ingenieur in 4 Berufsdekaden die Erfahrung gemacht, dass die einfachste Lösung immer die beste ist und dass einem diese Lösung immer erst zuletzt einfällt.
Wie ein Saboteur in mein "x =" eine Tretmine (js-Script) einbauen kann, ist mir unklar, aber das brauche ich jetzt vielleicht auch gar nicht zu wissen.
Wenn ich eine Anregung geben darf: Der Eingeweihte kann aus dem Niveau der Frage erkennen, welche Kompetenz der Frager hat. Es gereichte einem Forum zur Zierde, wenn seine Protagonisten das bei ihren Antworten beherzigten. Z.B. sind nur in Metasprache formulierte Hinweise (in denen PHP-Sprachelemente fehlen) schwer zu verwerten. Solche implizite Wissensvermittlung kann eigentlich nur bestätigen, wer das Wissen vorher schon hatte.
Ich hoffe, es kommt an, dass dies ein freundlicher, konstruktiver Kommentar von mir sein soll. Ohne Eure Hilfe - nochmal Dank dafür - wäre ich wahrscheinlich jetzt noch am Basteln.
MfG, Helmut
Mahlzeit Helmut,
Meine Frage ist gelöst und der Code sieht so aus:
Jein. Darf ich noch ein paar Verbesserungsvorschläge anbringen?
<html><head><title>Quadrat</title>
Es fehlt die Angabe eines http://de.selfhtml.org/html/allgemein/grundgeruest.htm#dokumenttyp@title=Dokumenttyps.
<?php
if (! isset($_POST["x"])){$_POST["x"]=3.1415;};
?>
Grundsätzlich ist es eine sinnvolle Idee, beim Programmieren von Skripts nach dem EVA-Prinzip vorzugehen: (E)ingabe, (V)erarbeitung und (A)usgabe
Das bedeutet, dass Du zu Anfang eventuelle Parameter ermittelst und vorbereitest, anschließend mit Ihnen irgendetwas tust und erst zum Schluss die Ausgabe vornimmst. Das macht den Code insgesamt übersichtlicher und lesbarer.
Dein Beispiel sähe dann z.B. folgendermaßen aus:
<?php[code lang=php]
// (E)ingabe
if (!isset($_POST["x"])) {
$_POST["x"] = 3.1415;
}
// (V)erarbeitung
$x = floatval($_POST['x']);
$x_quadrat = $x * $x;
// (A)usgabe
~~~?><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Quadrat</title>
</head>
<body>
<form name="Formular" method="post" enctype="multipart/form-data">
x = <input type="text" name="x" value="<?php` print(htmlspecialchars($_POST["x"])); `{:.language-php}?>" />
y = x^2 = <?php` print($x_quadrat); `{:.language-php}?>
</form>
</body>
</html>[/code]
> $x=$\_POST["x"];
Dieses Umkopieren ist vollkommen überflüssig.
> print('y = x^2 = ' . $x\*$x);
Diese Anweisung hingegen ist fehlerträchtig - weißt Du genau, dass im POST-Parameter namens "x" nur Zahlen enthalten sein können? Du solltest den Inhalt [mittels einer geeigneten Funktion](http://de.php.net/manual/de/function.floatval.php) in den richtigen Typ konvertieren, bevor Du mathematische Operationen damit ausführst.
> Das erscheint mir als angemessene Lösung, wobei ich Besonderheiten wie enctype="multipart/form-data oder htmlspecialchars() gläubig hinnehme,
Warum? Du kannst Dich darüber doch <http://de.selfhtml.org/html/formulare/definieren.htm#bereich@title=jeweils> [informieren](http://de.php.net/manual/de/function.htmlspecialchars.php) ...
> Wie ein Saboteur in mein "x =" eine Tretmine (js-Script) einbauen kann, ist mir unklar,
Angenommen, jemand ruft Dein Formular auf. Angenommen er gibt in das Eingabefeld mit dem Namen "x" irgendetwas ein. Angenommen Du gibst das, was Du per POST entgegennimmst ohne weitere Prüfung einfach mittels echo oder print() aus ...
Probier's doch mal: bau in Dein Formular irgendwo ein einfaches "`printf($_POST['x']);`{:.language-php}" ein und gib in das Textfeld Folgendes ein:
<script>alert('Ätsch!');</script>
> aber das brauche ich jetzt vielleicht auch gar nicht zu wissen.
Doch - Du solltest Dich so früh wie möglich über eventuell vorhandene Sicherheitslücken bzw. Angriffsmöglichkeiten informieren.
MfG,
EKKi
--
sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
Jein. Darf ich noch ein paar Verbesserungsvorschläge anbringen?
Hallo EKKi,
aber ja, ist alles von mir gut aufgenommen und ausgewertet! Dein Beitrag sollte als "Modell-Antwort des Monats" ans Schwarze Brett.
Herzlichen Dank, Helmut
Hello Helmut,
Jein. Darf ich noch ein paar Verbesserungsvorschläge anbringen?
aber ja, ist alles von mir gut aufgenommen und ausgewertet! Dein Beitrag sollte als "Modell-Antwort des Monats" ans Schwarze Brett.
Ein guter Vorschlag von Dir für dieses Forum.
Die Threads sollten im Eröffnungsposting einen Schalter bekommen: [x] dieser Thread enthielt meiner Meinung nach eine Musterlösung ab [Unterthread: ......]
Das ist dann erheblich mehr, als die hilfreich-Markierung
Diese Information könnte für die Auswertung des Forums hilfreich werden.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hi,
wie erreiche ich, dass in dem php-file eine neue Eingabe nach Drücken der return-Taste nicht wieder durch die Voreinstellung 3.1415 ersetzt wird?
In dem du die "Voreinstellung", also den Inhalt des value-Attributes, nicht fest auf 3.1415 setzt - sondern, wenn bereits ein Wert übergeben wurde, *diesen* an dieser Stelle ausgibst.
(Dabei solltest du die XSS-Problematik beachten.)
MfG ChrisB