Frage zum Affenformular
tinu
- php
0 tinu0 Der Martin0 Vinzenz Mai0 tinu
0 tinu0 tinu0 Vinzenz Mai0 tinu0 Tom0 tinu1 Vinzenz Mai0 tinu
Hi
Ich habe eine Frage zum Thema Affenformular und beziehe mich dabei auf dieses Beispiel.
Sehe ich das richtig, dass man für jedes blöde Formular-Eingabefeld nun eine eigene Funktion schreiben müsste?! Wär meiner Meinung nach sehr bescheuert.
Und was bitteschön bedeutet das /\s/ in diesem Abschnitt:
if (preg_match("/\s/", $val))
Ok, es heisst anscheinend "Leerzeichen" und "Tabulator" aber welches Zeichen ist was?!
Und wofür wird die Variable $valid als true oder false definiert, wenns nirgends verwendet wird ausser hier:
<?php if ($valid and isset($_REQUEST["do_form_x"])) { ?>
~~~?
Und darauf kann ich mir keinen mir auch keinen Reim machen, denn was soll eine if-Abfrag mit einer Variable die auf nix überprüft wird?! If "true" oder "false" dann mach was... ?! hä? bitte? If ($valid = "true") { mach irgendwas....} würd ich ja noch verstehen.
\*grrr\*... mich ärgerts dass ich anscheinend echt unfähig bin.
tinu
If ($valid = "true") { mach irgendwas....} würd ich ja noch verstehen.
Mein natürlich:
if ($valid == "true") {...
und soll nur ein Beispiel sein.
tinu
Hallo,
[Affenformular]
Sehe ich das richtig, dass man für jedes blöde Formular-Eingabefeld nun eine eigene Funktion schreiben müsste?! Wär meiner Meinung nach sehr bescheuert.
sagen wir's anders: Du musst jeden Eingabewert aus dem Formular "irgendwie" überprüfen. Ob mit einer separaten Funktionen für jedes Feld, oder durch Anwendung einer bestimmten Systematik, ist dabei nebensächlich.
Und was bitteschön bedeutet das /\s/ in diesem Abschnitt:
if (preg_match("/\s/", $val))
Ok, es heisst anscheinend "Leerzeichen" und "Tabulator" aber welches Zeichen ist was?!
Die Escape-Sequenz \s matcht auf jedes Zeichen, das als Whitespace gilt, also Leerzeichen, Tab, CR, LF und FF. Hab ich eins vergessen?
Und wofür wird die Variable $valid als true oder false definiert, wenns nirgends verwendet wird ausser hier:
Das würde doch reichen.
<?php if ($valid and isset($_REQUEST["do_form_x"])) { ?>
Und darauf kann ich mir keinen mir auch keinen Reim machen, denn was soll eine if-Abfrag mit einer Variable die auf nix überprüft wird?!
Ganz von vorn: Was macht denn die if-Anweisung?
Sie wertet den Ausdruck in der Klammer aus. Wenn er im boolschen Sinn zu true ausgewertet wird, dann wird der Anweisungsblock nach dem if ausgeführt, wenn nicht, dann der zugehörige else-Block (falls vorhanden).
If "true" oder "false" dann mach was... ?! hä? bitte? If ($valid = "true") { mach irgendwas....} würd ich ja noch verstehen.
Nein, if ($valid==true) wäre Blödsinn. Warum sollte ich einen Wert, der schon true oder false ist, nochmal explizit mit einem dieser Werte vergleichen? Alle nachfolgenden Beispiele ergeben true oder false im boolschen Sinn, sind also als Argument des if-Ausdrucks mehr oder weniger sinnvoll:
if ($var==4) // das Ergebnis eines Vergleichs ist true oder false
if (isset($var)) // isset() liefert true oder false
if (17) // jeder Wert !=0 ergibt true
if ($k=func()) // ja, auch eine Zuweisung hat ein Ergebnis!
if ($a && $b) // Verknüpfung zweier Bedingungen
*grrr*... mich ärgerts dass ich anscheinend echt unfähig bin.
Systematisch denken - das hilft! :-)
So long,
Martin
Hallo tinu,
schön, dass Du nicht aufgegeben hast!
Ich habe eine Frage zum Thema Affenformular und beziehe mich dabei auf dieses Beispiel.
Sehe ich das richtig, dass man für jedes blöde Formular-Eingabefeld nun eine eigene Funktion schreiben müsste?! Wär meiner Meinung nach sehr bescheuert.
nicht für jedes, aber für jeden Typ von Überprüfung. So etwas kannst Du in einer Klasse machen. Beispielsweise kannst Du eine Prüfmethode schreiben, die auf Minimal- eine, die auf Maximallänge prüft, wobei die Grenzwerte als Parameter übergeben werden können.
Und was bitteschön bedeutet das /\s/ in diesem Abschnitt:
if (preg_match("/\s/", $val))
Ok, es heisst anscheinend "Leerzeichen" und "Tabulator" aber welches Zeichen ist was?!
siehe SELFHTML, Kapitel Perl, Abschnitt Reguläre Ausdrücke für einzelne Zeichen. preg_match arbeitet mit Perl-kompatiblen regulären Ausdrücken, deswegen nicht verwundert sein über einen Verweis zu Perl, auch wenn es hier um PHP geht.
Und wofür wird die Variable $valid als true oder false definiert, wenns nirgends verwendet wird ausser hier:
<?php if ($valid and isset($_REQUEST["do_form_x"])) { ?>
> Und darauf kann ich mir keinen mir auch keinen Reim machen, denn was soll eine if-Abfrag mit einer Variable die auf nix überprüft wird?!
Du gehst durch eine Reihe von Prüfungen. Auch bei einem Feld könnten die verschiedensten Fehler auftreten. Ein Beispiel:
Textfeld ist nicht ausgefüllt, aber Pflichtfeld.
Textfeld enthält zu wenig Zeichen,
Textfeld enthält zu viele Zeichen,
Textfeld enthält unzulässige Zeichen ...
Wenn irgendeine fehlschlägt, wird $valid auf false (nicht "false" gesetzt). Aber nur wenn alle Prüfungen erfolgreich waren und halt eben auch etwas im Eingabefeld stand, dann gibts das Verarbeitungsergebnis (bei Dir war das show.php, glaube ich), sonst halt eben das Formular mit der bisherigen Eingabe.
> \*grrr\*... mich ärgerts dass ich anscheinend echt unfähig bin.
jeder hat mal angefangen. Mach' Dich doch nicht unnötig fertig.
Mir ist das auch schon öfter passiert, dass ich vor irgendwelchem Code saß, Stunden über Stunden und die einfache und eigentlich offensichtliche Lösung nicht fand.
Freundliche Grüße
Vinzenz
nicht für jedes, aber für jeden Typ von Überprüfung. So etwas kannst Du in einer Klasse machen. Beispielsweise kannst Du eine Prüfmethode schreiben, die auf Minimal- eine, die auf Maximallänge prüft, wobei die Grenzwerte als Parameter übergeben werden können.
Ok, aber dann ist meine Annahme richtig, dass es nicht sonderlich sinnvoll ist mehrere Funktionen zu definieren die dann je nur einmal verwendet werden. Dann könnte man anstelle der Funktionsdefinition gleich deren Inhalt im Skript integrieren.
Ansonsten danke an beide Helfer. Dann versuch ich mal aufgrund des Affenformulars erneut ein GB zu konstruieren (auch wenns mich mittlerweile ankotzt).
gruss
tinu
Witzig
Hab grad festgestellt, dass bei dieser Art Affenformular ein reset-button seine Wirkung verliert, sobald man einmal auf Senden geklickt hat, da dann immer wieder die bereits eingetragenen Daten als value erscheinen. Man müsste also dann ein script schreiben, welches beim betätigen des reset-button erst das $_REQUEST Array leert.
Man, irgend ein Idiot hat mal behauptet PHP sei einfach... also ich finds total kompliziert
Hmm... und nochmal ist mir was aufgefallen.
Ich möcht ja garnicht, dass das Eintragsformular auf der selben Seite angezeigt wird, wie das Gästebuch selbst. Also müsst ich ja, sofern alle Daten richtig eingegeben wurden wieder auf das Gästebuch (die Einträge) weiterleiten... Was mit header() allerdings nicht mehr geht, da mit dem Formular ja bereits ein header ausgegeben wurde.
Hmm... also bringt das dämliche Affenformular für meine Bedürfnisse eigentlich garnix?! (ausser dass bei falschen Eingaben wieder das Formular mit den bereits eingegebenen Daten angezeigt werden würde).
*ggrrrrrrrrrrrr*
Hallo tinu,
Ich möcht ja garnicht, dass das Eintragsformular auf der selben Seite angezeigt wird, wie das Gästebuch selbst. Also müsst ich ja, sofern alle Daten richtig eingegeben wurden wieder auf das Gästebuch (die Einträge) weiterleiten... Was mit header() allerdings nicht mehr geht, da mit dem Formular ja bereits ein header ausgegeben wurde.
da gibt es einen einfachen Trick: gib das Formular noch nicht aus.
Hmm... also bringt das dämliche Affenformular für meine Bedürfnisse eigentlich garnix?! (ausser dass bei falschen Eingaben wieder das Formular mit den bereits eingegebenen Daten angezeigt werden würde).
Schauen wir uns zwei Grundtechniken an:
a) alles in einer Datei
Ermittle Typ des Aufrufs
Mehrfachauswahl (in PHP switch())
Erstaufruf
Ausgabevariable := Gästebuch
Erstelle neuen Eintrag
Ausgabevariable := Leeres Formular
Fehlerhaft ausgefülltes Formular
Ausgabevariable := Ausgefülltes Formular mit Fehlermeldung
(ggf. alle Fehler markieren)
Korrekt ausgefülltes Formular
Speichere den Eintrag ab
Ausgabevariable := Gästebuch
Sonst was
Ausgabevariable := Gästebuch
Ende Mehrfachauswahl
Zeige den Inhalt der Ausgabevariablen an.
b) zwei Dateien: 1) Gästebuch 2) Formularseite
Ermittle Aufruftyp der Formularseite
Mehrfachauswahl (in PHP switch())
Neuen Eintrag erstellen
Ausgabevariable := Leeres Formular
Fehlerhaft ausgefülltes Formular
Ausgabevariable := Ausgefülltes Formular mit Fehlermeldung
(ggf. alle Fehler markieren)
Korrekt ausgefülltes Formular
Speichere den Eintrag ab
Leite ohne eine Ausgabe vorzunehmen auf das Gästebuch weiter
Sonst was
Ausgabevariable := Gästebuch
Ende Mehrfachauswahl
Zeige den Inhalt der Ausgabevariablen an (im Falle der Weiterleitung
wird dieser Code nicht erreicht)
b) hat den Vorteil, dass man nach erfolgreichem Abspeichern die
Zuückschaltfläche im Browser bedienen kann, ohne dass ein zweiter Eintrag
mit den gleichen Daten abgespeichert wird.
Im Fall von a) könntest Du das erfolgreiche Speichern über einen Session-
Mechanismus absichern, so dass doppelte Einträge verhindert werden.
Eines der Grundprinzipien, das Du verinnerlichen solltest ist das EVA-Prinzip:
- E ingabe
- V erarbeitung
- A usgabe
Mache also keine Ausgaben, während Du noch an der Verarbeitung der Eingabedaten bist.
Freundliche Grüße
Vinzenz
Uff
Danke für den Aufwand den Du da für mich getrieben hast, aber ich befürchte es war vergebens. Auch wenn ich nach fünfmaligem Lesen das von Dir vorgestellte Prinzip (bzw. die Grundtechniken) einigermassen verstanden habe, habe ich absolut keinen Schimmer wie ich sowas umsetzen sollte. Schon allein bei der Überprüfung ob es sich um einen Erstaufruf handelt oder nicht, bin ich hoffnungslos überfordert. Und die hoffnungslose Überforderung zieht sich nahtlos bis zum Schluss durch.
Das EVA-Prinzip hab ich mir schon tausendmal zu Gemüte geführt... dachte auch ich habs verstanden, aber dem ist scheinbar nicht so.
Und bevor ich weiter eure Zeit verschwende, verabschiede ich mich mit freundlichen Grüssen aus dieser für mich zu komplizierten Welt.
tinu
Hello,
Schon allein bei der Überprüfung ob es sich um einen Erstaufruf handelt oder nicht, bin ich hoffnungslos überfordert.
Erstaufruf bedeutet meistens, dass die Ressource per Link, also per GET, angefordert wurde.
Dann sollten die POST-Daten leer sein
if(count($_POST) == 0))
{
## Erstaufruf
}
oder im nächsten Denkschritt: Ein Folgeaufruf liegt vor, wenn einer Deiner Post-Buttons gedrückt wurde:
if (isset($_POST['btn']))
{
## Da will einer 'was bestimmtes von meiner Ressoruce
## näheres regelt ein Unterprogramm
}
## wenn die Buttons z.B. so eingebunden wurden:
<input type="submit" name="btn[preview]" value="Vorschau" />
<input type="submit" name="btn[send]" value="Eintragen" />
und im Unterprogramm fragst Du dann nur:
if (isset($_POST['btn']['preview']))
{
## Lade nun die Vorschhauseite in die Ausgabevariable
}
elseif(isset($_POST['btn']['send']))
{
## Lade nun den Verarbeitungsschritt
## und die Antwortseite
}
else
{
## Irgend ein Idiot hat sich einen Button ausgedacht, den es nicht gibt
## in Deinem Programm. Lade ihm ein schönes Comic, dass ihn wütend macht
}
Das "lade" steht entweder für ein passendes include() oder für den Aufruf einer Funktion, die die Ausgabevariable mit den passenden Werten versorgen wird.
Ausgabevariable steht für:
<body>
<?php echo $_out['body']; ?>
</body>
Und dieses $_out['body'] hast Du Dir ganz amm Anfang Deines Scriptes als leeres (oder mit Minimalangaben) belegtes Element angelegt und füllst es über die Laufzeit Deines Scriptes immer weiter
$_out['body'] .= htmlout($_buttons);
wobei htmlout($_buttons) Deine Funktions ist, die dir Deine zulässignen Buttons für die Seite generiert.
So ungefähr hat Vinzenz das gemeitn mit EVA.
Besdchäftige Dich also ein wenig mit Funktionen (oder Methoden, wenn Du es objektorientiert programmieren willst) und alles wird gut...
Liebe Grüße aus Syburg bei Dortmund
Tom vom Berg
Danke Tom,
aber ich raff nichtmal diese "Antwort für Dummies", denn ich könnte den Rest nicht selbständig herleiten. Und dass das ganze dann noch irgendwie ein Affenformular darstellen sollte verwirrt mich nurnoch mehr. Ich dachte ja schon, dass ich dann halt eben einfach mit etwas einfacherem beginne, aber wirklich viel einfacheres als ein minimales Gästebuch gibts wahrscheinlich garnicht.
Und bringt mir nicht wirklich viel wenn ihr mir den Code Stück für Stück auf die Nase bindet.
lg
tinu
Hallo tinu,
aber ich raff nichtmal diese "Antwort für Dummies", denn ich könnte den Rest nicht selbständig herleiten. Und dass das ganze dann noch irgendwie ein Affenformular darstellen sollte verwirrt mich nurnoch mehr. Ich dachte ja schon, dass ich dann halt eben einfach mit etwas einfacherem beginne, aber wirklich viel einfacheres als ein minimales Gästebuch gibts wahrscheinlich garnicht.
ich habe mit "Hello, world!" angefangen und bin dann zu "Hello, PHP" übergegangen - mit Formulareingabe und war ganz stolz, dass es funzte [tm]. Dass ich bei entsprechenden Eingaben auf die Nase geflogen wäre, war mir überhaupt nicht bewußt. Selbstverständlich verwendete ich bei der Ausgabe kein htmlspecialchars(), um die Ausgabe für den HTML-Kontext aufzubereiten.
Verflixt, für vieles, was ich heute weiß, habe ich lange gebraucht. Nicht nur ein paar Tage oder ein paar Wochen. Es gibt enorm viel, was ich nicht weiß. Ich lerne jeden Tag dazu.
Daher: "Don't panic!"
Freundliche Grüße
Vinzenz
Verflixt, für vieles, was ich heute weiß, habe ich lange gebraucht. Nicht nur ein paar Tage oder ein paar Wochen. Es gibt enorm viel, was ich nicht weiß. Ich lerne jeden Tag dazu.
Schön und gut für Dich, aber ist ja nicht so, dass ich mich erst ein paar Tage oder ein paar Wochen an PHP versuche sonder mittlerweile schon ein paar Monate. Ich denke Du verstehst... ;)