Affenformular
Hakan
- php
Hallo Leute,
ich hab da mal eine Frage:
Ich bau gerade ein Formular mit der Affentechnik bzw. Affenformular.
Info hierzu: www.de.wikipedia.org und einfach Affenformular eingeben.
Vereinfacht:
Form-Tag: method='POST' action='<?php print $_SERVER["PHP_SELF"]; ?>'
Text-Feld: value='<?php if (isset($_REQUEST['textfeld'])) echo htmlspecialchars($_REQUEST['textfeld']); ?>'
Das Formular ruft sich beim "action" selbst auf.
Dann wird eine Validierung des Textfeldes durchgeführt:
if(isset($_REQUEST['textfeld'])){
if (strlen($_REQUEST['textfeld']) < 3){
FEHLER!!!! Böse!!!
}else{
header("Location: weiter.php");
}
}
Problem:
auf der Seite weiter.php werden keine Werte übergeben. Also $_REQUEST['textfeld'] ist nicht existend.
Liegt wohl daran, dass mit header keine POST-Variablen mit übergeben werden. Aber wozu ist dann dieses Affentheater sonst gut??
Gruß!
Hallo Hakan,
Du hast das Prinzip nicht verstanden. Du musst/solltest nicht auf weiter.php redirecten (was du im übrigren auch nicht richtig machst, Stickwort komplette URL) sondern du machst alles innerhalb der gleichen php-Datei (Sachen mit require/include einbinden geht natürlich). Das heißt, sowohl das Anfangsformular, als auch die Formularkontrolle, das Anzeigen von Formularfehlern und auch das Verarbeiten des Formulars sollte in der gleichen Datei stattfinden.
Also nix mit weiterleitung.
Jonathan
Im übrigen haben alle Formulare (und allgemein alle Skripts), die $_SERVER['PHP_SELF'] unmaskiert übernehmen, ein XSS-Problem. Verwende htmlspecialchars() oder htmlentities(), oder gib das action-Attribut direkt an.
Hallo,
Was spricht dagegen es einfach leer zu lassen?
<form action="" method="post">
netten Tag
^da Powl
Hallo Powl,
Was spricht dagegen es einfach leer zu lassen?
<form action="" method="post">
Das ist so meines Wissens nicht im Webstandard enthalten und führt auch zumindest im manchen Textbrowsern zu Problemen, die dann ne leere Seite oder sonstwas aufrufen.
Jonathan
Hallo,
Das ist so meines Wissens nicht im Webstandard enthalten und führt auch zumindest im manchen Textbrowsern zu Problemen, die dann ne leere Seite oder sonstwas aufrufen.
Validiert aber ohne Probleme XHTML 1.0 strict und das mit den Browser wäre mir neu. Wer zickt denn bei leerem action?
netten Tag
^da Powl
Hello,
Was spricht dagegen es einfach leer zu lassen?
<form action="" method="post">Das ist so meines Wissens nicht im Webstandard enthalten und führt auch zumindest im manchen Textbrowsern zu Problemen, die dann ne leere Seite oder sonstwas aufrufen.
Es ist enthalten.
Es gibt dazu hier im Archiv einen Thread, in dem alle Möglichkeiten und ihre Folgen (mit Ausnahme der ['PHP_SELF']-Geschichte) diskutiert wurden und auch die passenden Stellen aus den RFCs herausgesucht wurden.
Ein harzliches Glückauf
Tom vom Berg
Hallo,
Was spricht dagegen es einfach leer zu lassen?
<form action="" method="post">netten Tag
^da Powl
Nichts, aber warum einfach, wenns auch schwer geht? :)
Im ernst: Ich war bisher der Meinung, dass nicht alle Browser bei einem leeren action-Attribut die aktuelle URL aufrufen. Hab jetzt aber im Forum gestöbert und weiß es nun besser.
Hallo Patrick,
Im ernst: Ich war bisher der Meinung, dass nicht alle Browser bei einem leeren action-Attribut die aktuelle URL aufrufen. Hab jetzt aber im Forum gestöbert und weiß es nun besser.
Nein du hast recht, das machen nicht alle Browser.
Jonathan
Hallo Patrick,
Im ernst: Ich war bisher der Meinung, dass nicht alle Browser bei einem leeren action-Attribut die aktuelle URL aufrufen. Hab jetzt aber im Forum gestöbert und weiß es nun besser.
Nein du hast recht, das machen nicht alle Browser.
Jonathan
Sicher? Wenn ich RFC 3986 richtig deute, sind alle leeren action-Attribute Same-Document References.
Hallo
Sicher? Wenn ich RFC 3986 richtig deute, sind alle leeren action-Attribute Same-Document References.
Ich kann zwar weder bestätigen noch ausschließen, dass einzelne Browser damit Probleme haben, aber was nützt es, dem Standard zu genügen, wenn es die Browser eventuell nicht tun? Was spricht dagegen, den Namen der Seite z.B. mit $_SERVER["SCRIPT_NAME"], welches im Gegensatz zu $_SERVER["PHP_SELF"] nach heutiger Kenntnis sicher ist, oder hartkodiert explizit in das action-Attribut einzutragen?
Tschö, Auge
Hallo,
... aber was nützt es, dem Standard zu genügen, wenn es die Browser eventuell nicht tun?
Pädagogik. ;) Der Browser soll dem Standard genügen. Das sollten die MSler 1000 mal an die Tafel schreiben.
Was spricht dagegen, den Namen der Seite z.B. mit $_SERVER["SCRIPT_NAME"], welches im Gegensatz zu $_SERVER["PHP_SELF"] nach heutiger Kenntnis sicher ist, oder hartkodiert explizit in das action-Attribut einzutragen?
Faulheit! (Da bin ich ehrlich. Die Zeit kann ich besser im Forum lurken.)
Es ist ja auch konform es freizulassen.
netten Tag
^da Powl
Hello,
Faulheit! (Da bin ich ehrlich. Die Zeit kann ich besser im Forum lurken.)
Es ist ja auch konform es freizulassen.
Mann sollte sich aber darüber im Klaren sein, dass dann der alte Aufruf des Scriptes wiederholt wird, also die URi (nebst Get-Parametern und Path-Info) wiederverwendet wird.
Wenn man das nicht will, sollte man ein '#' einsetzen. Dann wird die alte URi mit der neuen überschrieben.
Ein harzliches Glückauf
Tom vom Berg
Hello,
Ich kann zwar weder bestätigen noch ausschließen, dass einzelne Browser damit Probleme haben, aber was nützt es, dem Standard zu genügen, wenn es die Browser eventuell nicht tun? Was spricht dagegen, den Namen der Seite z.B. mit $_SERVER["SCRIPT_NAME"], welches im Gegensatz zu $_SERVER["PHP_SELF"] nach heutiger Kenntnis sicher ist, oder hartkodiert explizit in das action-Attribut einzutragen?
$_SERVER['SCRIPT_NAME']
enthält nur den Namen der Ressource, ohne Domain und ohne Pathinfo.
Es ist also genau die passende Wahl für den Einsatzzweck.
Dann sollte man aber auch noch auf
$_SERVER['REQUEST']
verzichten und gezielt
$_GET
oser
$_POST
verwenden, es sei denn, dass es tatscählich egal ist, auf welche Weise die Parameter an den Server übergeben wurden.
Ein harzliches Glückauf
Tom vom Berg
Hi,
$_SERVER['SCRIPT_NAME']
enthält nur den Namen der Ressource, ohne Domain und ohne Pathinfo.
Es ist also genau die passende Wahl für den Einsatzzweck.
Auch damit kann man sich schoen ins Knie schiessen - wenn bspw. mod_rewrite zum Einsatz kommt, dann muss der Name der angeforderten Ressource mit dem SCRIPT_NAME nicht das Geringste gemein haben.
MfG ChrisB
Hello,
$_SERVER['SCRIPT_NAME']
enthält nur den Namen der Ressource, ohne Domain und ohne Pathinfo.
Es ist also genau die passende Wahl für den Einsatzzweck.Auch damit kann man sich schoen ins Knie schiessen - wenn bspw. mod_rewrite zum Einsatz kommt, dann muss der Name der angeforderten Ressource mit dem SCRIPT_NAME nicht das Geringste gemein haben.
Und was steht dann in $_SERVER['PHP_SELF']?
Ein harzliches Glückauf
Tom vom Berg
http://bergpost.annerschbarrich.de
Hello,
Im übrigen haben alle Formulare (und allgemein alle Skripts), die $_SERVER['PHP_SELF'] unmaskiert übernehmen, ein XSS-Problem. Verwende htmlspecialchars() oder htmlentities(), oder gib das action-Attribut direkt an.
oder benutze $_SERVER['SCRIPT_NAME']
Das hat das 'Problem' mit der Path-Info nicht.
Oder schalte beim Webserver (Apachen) die Pathinfo ab.
Ein harzliches Glückauf
Tom vom Berg
Hallo Hakan,
Problem:
auf der Seite weiter.php werden keine Werte übergeben. Also $_REQUEST['textfeld'] ist nicht existend.Liegt wohl daran, dass mit header keine POST-Variablen mit übergeben werden. Aber wozu ist dann dieses Affentheater sonst gut??
also, was in der Wikipedia dazu steht finde ich nicht sonderlich erhellend, bzw. vor allem das Beispiel finde ich ein wenig wirr. Man sollte das vielleicht mal ändern ...
Schau doch mal auf FAQ der Newsgroups de.comp.lang.php.* - 27.2. Von HTML zu PHP: Schreibe Formularverarbeitungen in Normalform, dort steht ein Beispiel, das ganz ohne header() auskommt.
Übrigens: Eine ähnliche Frage wurde hier kürzlich bereits beantwortet (auch damals stiftete dieser Wikipedia-Eintrag Verwirrung ...).
Grüße aus Stockholm,
Götz