Yadgar: Problem mit Antispam-Abfrage

High!

Ich bin dabei, für meinen Website (www.khyberspace.de) nach zehn Jahren endlich mal ein Gästebuch zu programmieren... und würde dort gerne einen solchen "mathematischen" Spamschutz einbauen, wie ihn z. B. auch www.final-frontier.ch verwendet - eine einfache zufallsgenerierte Rechenaufgabe, die vom Benutzer gelöst werden muss, bevor er seinen Gästebucheintrag abschicken kann.

Offensichtlich kann sich PHP aber keine Variablenwerte aus dem vorherigen Aufruf einer Seite (die Formularseite sendet die eingegebenen Daten an sich selbst, siehe beigefügten Code) merken, so dass mit jedem neuen Aufruf (und folglich neu generierter Rechenaufgabe) das alte Ergebnis auf jeden Fall falsch ist... da bleibt wohl nur der Umweg über eine externe Textdatei, in die jedes Mal das Ergebnis für den ersten Aufruf der Seite hineingeschrieben wird... oder täusche ich mich da?

Hier ist der Code:

  
    <form method="post" action="gaestebuch.php">  
      <b>Name*</b><br>  
      <input type="text" name="user"><br>  
      <b>E-Mail*</b> (wird nicht veröffentlicht)<br>  
      <input type="text" name="email"><br>  
      <b>Eigene Webpage</b><br>  
      <input type="text" name="url"><br>  
      <b>Dein Eintrag ins Gästebuch:</b><br>  
      <textarea rows="20" cols="80" wrap="physical" name="eintrag">  
	Bitte hier Text eingeben!  
      </textarea>  
      <br><br>  
      <b>Spamschutz - bitte Ergebnis eingeben:</b>  
      <?php  
	srand((double)time());  
	$zahl1 = rand(1, 100);  
	$zahl2 = rand(1, 100);  
	static $z1;  
        static $z2;  
        $z1 = $zahl1;  
        $z2 = $zahl2;  
	echo $zahl1." + ".$zahl2." = ";  
	if (isset($_POST['antispam']))  
	{  
	  if ($_POST['antispam'] != $z1+$z2)  
	    echo $_POST['antispam']." Falsches Ergebnis!";  
	  else  
	  {  
	    echo "Dein Text wird in Kürze im Gästebuch erscheinen!";  
	    $date=getdate(time());  
	    $betreff = "Gästebuch-Eintrag von".$_POST['user']."(".$_POST['email'].") vom ".$date['mday'].".".$date['mon'].".".$date['year']." um ".$date['hours'].":".$date['minutes']." Uhr";  
	    $text = $_POST['eintrag'];  
	    mail("yazdegird@gmx.de",$betreff,$text);  
	  }  
	}  
      ?>  
      <input type="text" name="antispam"><br>  
      <input type="submit" value="Daten abschicken">  
    </form>  

Bis bald im Khyberspace!

Yadgar

  1. @@Yadgar:

    nuqneH

    echo $_POST['antispam']." Falsches Ergebnis!";

    AUTSCH!! https://forum.selfhtml.org/?t=205445&m=1392539 ff.

    Qapla'

    --
    Gut sein ist edel. Andere lehren, gut zu sein, ist noch edler. Und einfacher.
    (Mark Twain)
    1. Hi(gh)!

      nuqneH

          echo $\_POST['antispam']." Falsches Ergebnis!";  
      

      AUTSCH!! https://forum.selfhtml.org/?t=205445&m=1392539 ff.

      Qapla'

      Das soll nicht so bleiben, ist nur eine Test-Ausgabe!

      Bis bald im Khyberspace!

      Yadgar

  2. Hi!

    Offensichtlich kann sich PHP aber keine Variablenwerte aus dem vorherigen Aufruf einer Seite [...] merken [...]

    In eigentlich jedem Anfängertutorial wird für genau deswegen das Sessions-Konzept vorgestellt.

    Lo!

  3. Offensichtlich kann sich PHP aber keine Variablenwerte aus dem vorherigen Aufruf einer Seite [...] merken [...]

    Mir fällt spontan keine Sprache ein, die automatisch alle Variablen in einer Session mitschleift.

  4. h1,

    Offensichtlich kann sich PHP aber keine Variablenwerte aus dem vorherigen Aufruf einer Seite (die Formularseite sendet die eingegebenen Daten an sich selbst, siehe beigefügten Code) merken, so dass mit jedem neuen Aufruf (und folglich neu generierter Rechenaufgabe) das alte Ergebnis auf jeden Fall falsch ist... da bleibt wohl nur der Umweg über eine externe Textdatei, in die jedes Mal das Ergebnis für den ersten Aufruf der Seite hineingeschrieben wird... oder täusche ich mich da?

    Schreibe 2 Funktionen:
    f1(): erstellt das Form und schickt es zum Browser
    f2(): verarbeitet die Eingaben

    Nachdem f2() die Eingaben verarbeitet hat, wird f1() aufgerufen. Somit kannst Du die Eingaben (geprüft! und verarbeitet) von f2 nach f1 übergeben (affenartig).

    Hotti

    1. Hi(gh)!

      Schreibe 2 Funktionen:
      f1(): erstellt das Form und schickt es zum Browser
      f2(): verarbeitet die Eingaben

      Nachdem f2() die Eingaben verarbeitet hat, wird f1() aufgerufen. Somit kannst Du die Eingaben (geprüft! und verarbeitet) von f2 nach f1 übergeben (affenartig).

      Wie soll das denn funktionieren? Um Eingaben zu verarbeiten, muss doch vorher das Formular schon vorhanden sein - wie soll ich sonst etwas eingeben können?

      Und was meinst du mit "affenartig"?

      Bis bald im Khyberspace!

      Yadgar

      1. hi,

        Schreibe 2 Funktionen:
        f1(): erstellt das Form und schickt es zum Browser
        f2(): verarbeitet die Eingaben

        Nachdem f2() die Eingaben verarbeitet hat, wird f1() aufgerufen. Somit kannst Du die Eingaben (geprüft! und verarbeitet) von f2 nach f1 übergeben (affenartig).

        Wie soll das denn funktionieren? Um Eingaben zu verarbeiten, muss doch vorher das Formular schon vorhanden sein - wie soll ich sonst etwas eingeben können?

        Es funktioniert so: Funktion f1 erzeugt das HTML-Formular. Funktion f2 verarbeitet die Eingaben. Die Funktionen f1 und f2 gehören zu einem Script.

        Und was meinst du mit "affenartig"?

        Stichwort: Affenformular. Bei fehlerhaften Eingaben wird das Formular erneut gezeigt mit Hinweisen auf die fehlerhaften Eingaben. Selbstverständlich kann das Formular auch dann gezeigt werden, wenn alles richtig eingegeben und verarbeitet wurde. Der Benutzer sollte immer sehen, was Sache ist.

        Hotti

        1. Hi(gh)!

          Es funktioniert so: Funktion f1 erzeugt das HTML-Formular. Funktion f2 verarbeitet die Eingaben. Die Funktionen f1 und f2 gehören zu einem Script.

          Stichwort: Affenformular. Bei fehlerhaften Eingaben wird das Formular erneut gezeigt mit Hinweisen auf die fehlerhaften Eingaben. Selbstverständlich kann das Formular auch dann gezeigt werden, wenn alles richtig eingegeben und verarbeitet wurde. Der Benutzer sollte immer sehen, was Sache ist.

          Ah, ich verstehe... dann dürfen aber die beiden Aufrufe von rand() (für die zufallsgesteuerte Erzeugung der Additionsaufgabe) weder in f1() noch in f2() enthalten sein, sondern nur bei einem Erst- bzw. expliziten Neuaufruf des gesamten Skripts durchlaufen werden!

          Mal probieren, ob ich das hinbekomme...

          Bis bald im Khyberspace!

          Yadgar

          1. Hi(gh)!

            Ah, ich verstehe... dann dürfen aber die beiden Aufrufe von rand() (für die zufallsgesteuerte Erzeugung der Additionsaufgabe) weder in f1() noch in f2() enthalten sein, sondern nur bei einem Erst- bzw. expliziten Neuaufruf des gesamten Skripts durchlaufen werden!

            Nur... wie sende ich die Eingaben an f2() statt wie gehabt an das ganze Skript? Was muss bei "action" statt "gaestebuch.php" stehen?

            Bis bald im Khyberspace!

            Yadgar

            1. hi,

              Nur... wie sende ich die Eingaben an f2() statt wie gehabt an das ganze Skript? Was muss bei "action" statt "gaestebuch.php" stehen?

              Attribut action="gaestebuch.php" ist schon OK. "gaestebuch.php" ist das Script. Es muss nur so sein, dass Dein

              <?php
               // Code
              ?>

              von Anfang der Datei bis Ende der Datei geht, d.h., in der Datei steht nur Code und nicht irgendwo HTML. Alles was HTML ist, wird per echo oder print ausgegeben. Und: Keine BOM!

              Hotti

              Bis bald im Khyberspace!

              Klaro ;)

              1. High!

                von Anfang der Datei bis Ende der Datei geht, d.h., in der Datei steht nur Code und nicht irgendwo HTML. Alles was HTML ist, wird per echo oder print ausgegeben. Und: Keine BOM!

                Was bitte ist BOM?

                Bis bald im Khyberspace!

                Yadgar

                1. hei,

                  Was bitte ist BOM?

                  das ist die Falle, in die (fast) jeder PHP-Entwickler tappt, der die Funktion header() einsetzt.

                  Zu Deutsch: BOM heißt Byte Order Mark, das sind 3 Byte, die ein Editor im Default an den Anfang einer Datei setzt, die in utf-8 gespeichert werden soll.

                  Sofern es eine BOM gibt, PHP generiert von sich aus einen HTTP-Header und meldet einen Fehler, wenn im Code die header() Funktion steht (FM: Header already sent...). Sofern Du Deine Scripts in utf-8 speicherst, nimm einen Editor, der keine BOM schreibt, bzw. einen Editor, der das Speichern von UTF-8-Dateien auch ohne BOM ermöglicht.

                  Ein PHP-Script

                  <?php
                  // zweite Zeile
                  /**/

                  // vorletzte Zeile
                  ?>

                  Braucht die eigene header()-Funktion. Also keine BOM ;)

                  Hotti

                  1. High!

                    Also, diese Funktion header() habe ich nicht verwendet, sondern den ganzen ursprünglich gemischten Code auf PHP umgestellt:

                      
                    <?php  
                    echo '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"';  
                    echo '"http://www.w3.org/TR/html4/strict.dtd">';  
                    echo '<html>';  
                    echo '<head>';  
                    echo '<title>Yadgars Tor zum Khyberspace: Gästebuch</title>';  
                    echo '<meta http-equiv="Content-Type" content="text/html; charset=utf-8">';  
                    echo '<style>';  
                    echo 'h1 { text-align:center }';  
                    echo '</style>';  
                    echo '</head>';  
                    echo '<body bgcolor="#ffbfd3">';  
                    echo '<h1>Gästebuch</h1>';  
                    echo '<form method="post" action="gaestebuch.php">';  
                    echo '<b>Name*</b><br>';  
                    echo '<input type="text" name="user"><br>';  
                    echo '<b>E-Mail*</b> (wird nicht veröffentlicht)<br>';  
                    echo '<input type="text" name="email"><br>';  
                    echo '<b>Eigene Webpage</b><br>';  
                    echo '<input type="text" name="url"><br>';  
                    echo '<b>Dein Eintrag ins Gästebuch:</b><br>';  
                    echo '<textarea rows="20" cols="80" wrap="physical" name="eintrag">Bitte hier Text eingeben!</textarea><br>';  
                    echo '<b>Anti-Spam-Abfrage:</b> ';  
                    srand((double)time());  
                    $zahl1 = rand(1, 100);  
                    $zahl2 = rand(1, 100);  
                    echo $zahl1." + ".$zahl2." = ";  
                    echo '<input type="text" name="antispam">';  
                    echo '<input type="submit" value="Daten abschicken">';  
                    if (isset($_POST['user']) && isset($_POST['email']) && isset($_POST['eintrag']))  
                    {  
                      if ($_POST['antispam'] == $zahl1+$zahl2)  
                      {  
                        echo "Dein Text wird in Kürze im Gästebuch erscheinen!";  
                        $date=getdate(time());  
                        $betreff = "Gästebuch-Eintrag von ".$_POST['user']." (".$_POST['email'].") vom ".$date['mday'].".".$date['mon'].".".$date['year']." um ".$date['hours'].":".$date['minutes']." Uhr";  
                        $text = $_POST['eintrag'];  
                        mail("yazdegird@gmx.de",$betreff,$text,"von: ".$_POST['user']);  
                      }  
                    }  
                    echo '</form>';  
                    echo '</body>';  
                    echo '</html>';  
                    ?>  
                    
                    

                    ...es funktioniert aber trotzdem nicht, die Bedingung

                      
                    if ($_POST['antispam'] == $zahl1+$zahl2)  
                    
                    

                    wird nie wahr! Warum nicht?

                    Bis bald im Khyberspace!

                    Yadgar

                    1. hi,

                      ...es funktioniert aber trotzdem nicht, die Bedingung

                      if ($_POST['antispam'] == $zahl1+$zahl2)

                      
                      >   
                      > wird nie wahr! Warum nicht?  
                        
                      Erfolgt überhaupt ein Submit? Dein Submit-Button hat kein name='Attribut'  
                      Daher möglicherweise gar kein Submit.  
                        
                      Vorschlag: Baue Dir eine Kontrollstruktur, die prüft, ob überhaupt ein POST erfolgte:  
                        
                      ~~~php
                        
                      <?php  
                      header(...); // text/html; charset=...  
                      if($_SERVER['REQUEST_METHOD'] == 'POST'){  
                         // gibt das POST_Array aus mit var_dump  
                      }  
                      else{  
                         // gib das HTML-Formular aus mit echo  
                         // nutze Here-Doc  
                      }  
                      ?>  
                      
                      

                      Hotti

                      1. High!

                        Erfolgt überhaupt ein Submit? Dein Submit-Button hat kein name='Attribut'
                        Daher möglicherweise gar kein Submit.

                        Vorschlag: Baue Dir eine Kontrollstruktur, die prüft, ob überhaupt ein POST erfolgte:

                        <?php
                        header(...); // text/html; charset=...
                        if($_SERVER['REQUEST_METHOD'] == 'POST'){
                           // gibt das POST_Array aus mit var_dump
                        }
                        else{
                           // gib das HTML-Formular aus mit echo
                           // nutze Here-Doc
                        }
                        ?>

                          
                        Habe ich gemacht... das POST ist erfolgt, die einzelnen Elemente werden angezeigt!  
                          
                        Das Problem scheint zu sein, dass das Skript die Daten an sich selbst sendet - sobald es aber ein zweites Mal aufgerufen wird, werden zwei neue Zufalls-Summanden erzeugt, und das vom Benutzer eingegebene und übermittelte Ergebnis stimmt natürlich nicht mehr...  
                          
                        Bis bald im Khyberspace!  
                          
                        Yadgar
                        
                        1. hi Yadgar,

                          Das Problem scheint zu sein, dass das Skript die Daten an sich selbst sendet - sobald es aber ein zweites Mal aufgerufen wird, werden zwei neue Zufalls-Summanden erzeugt, und das vom Benutzer eingegebene und übermittelte Ergebnis stimmt natürlich nicht mehr...

                          An sich selbst senden ist ok. Ich stelle mir diese Frage: Warum sollte die "Benutzeraufgabe" zweimal funktionieren? Ich denke, einmal wäre ok:

                          Jedes Formular bekommt eine eindeutige "Kennung". Zu dieser Kennung gibt es das Ergebnis und die Rechenaufgabe, letztere bekommt der Besucher zu sehen. Serverseitig ist hinterlegt: die "Kennung" und das Ergebnis. Und natürlich fest "verdrahtet" wie alle drei Dingens zusammenhängen.

                          Jetzt drückt der Besucher aufn Knopf, an den Server geht die Kennung und das Ergebnis. Egal, ob richtig oder falsch, das Formular was als Antwort kommt, hat eine neue "Kennung". Die könnte so aussehen:

                          cbfe5f1d18461b518177a73ab4e6b0dd-a
                          cbfe5f1d18461b518177a73ab4e6b0dd-b
                          ..................................
                          cbfe5f1d18461b518177a73ab4e6b0dd-z
                          ^ von hier bis            da    ^  Reiner Zufall, was die Sache eindeutig macht (MD5). Die Buchstaben a-z sind Deine Rechenaufgaben, 26 Stück. Mach die nicht zu schwer, die Leute sind doof.

                          Hotti

                          --
                          Das kleine Einmaleins geht ungefähr bis zwei wenn Plus dabei ist.
                          1. High!

                            Ich glaube, ich gebe auf... ich bin einfach noch nicht erfahren genug in PHP, um eure Tipps zu verstehen! Fürs Erste reicht auch ein Gästebuch ohne Spamsicherung, wer weiß, wie viele Leute sich überhaupt jemals nach www.khyberspace.de verirren - und da die Einträge mir sowieso erstmal als E-Mail zugeschickt werden sollen, bevor ich sie dann von Hand reinsetze (oder auch nicht), ist so eine Spamsicherung eher ein nice-to-have, aber nichts Unverzichtbares...

                            Das kommt davon, wenn man nur alle paar Jahre mal mit PHP zu tun hat und sich nicht dazu durchringen kann, Tag für Tag damit zu arbeiten... oder bin ich schlicht und ergreifend zu dumm zum Programmieren?!?

                            Trotzdem hätte ich schon noch gerne gewusst, wie man mail() dazu überreden kann, die eingegebenen Texte als utf-8 zu versenden...

                            Bis bald im Khyberspace!

                            Yadgar

                            1. hi,

                              Ich glaube, ich gebe auf...

                              schmeiß es nicht allzu weit weg. Damit Du es ggf. wiederfinden kannst ;)

                              Trotzdem hätte ich schon noch gerne gewusst, wie man mail() dazu überreden kann, die eingegebenen Texte als utf-8 zu versenden...

                              Üblicherweise im Body codiert als Quoted Printable. Dazu braucht es die Header in der Maildatei:

                              Content-Type: text/plain; charset=utf-8
                              Content-Transfer-Encoding: quoted-printable

                              Beispiel mit "äöüß" im Body, siehr so aus:

                              From: otto@example.com
                              To: horst@example.com
                              Subject: Feedback
                              Content-Type: text/plain; charset=utf-8
                              Content-Transfer-Encoding: quoted-printable
                              Date: Wed, 15 Jun 2011 20:43:30 +0200
                              Message-Id: 20110615204330.6994D22556B85@web04.net-server.de

                              =C3=A4=C3=B6=C3=BC=C3=9F=

                              Zum Encoden gibs Libraries, auch in PHP. Mit Quoted Printable haben alle Zeichen im Body 7 bit, also ASCII. Neue Mailclients verstehen zwar auch native UTF-8, aber manche Mailserver (MTA) spielen da nicht mit, die Maildatei könnte unlesbar werden (die wird vom MTA verändert, Header komen hinzu...). QP und alles wird gut.

                              Hotti

                              1. High!

                                Das utf-8-Problem hat sich erledigt (lag bloß an der Kodierungseinstellung meines E-Mail-Clients)... und ich habe es mit der Antispam-Abfrage dann noch mal probiert, diesmal mit Weiterleitung auf eine zweite Seite, aber die beiden Zufallszahlen, für die ich zwei "hidden"-Felder angelegt habe, werden einfach nicht mit übermittelt!

                                Hier der Code:

                                  
                                <?php  
                                  srand((double)time());  
                                  $zahl1 = rand(1, 100);  
                                  $zahl2 = rand(1, 100);  
                                  echo $zahl1." + ".$zahl2." = ";  
                                ?>  
                                      <input type="hidden" name="zahl1" value="<? $zahl1 ?>">  
                                      <input type="hidden" name="zahl2" value="<? $zahl2 ?>">  
                                
                                

                                Wie muss ich die beiden Variablen in den HTML-Code integrieren, damit es funktioniert? Meine Handbücher lassen mich dazu leider im Stich...

                                Bis bald im Khyberspace!

                                Yadgar

                            2. oder bin ich schlicht und ergreifend zu dumm zum Programmieren?!?

                              Nein, du fällst nur gerade auf hotti rein. Das ist einer von der Sorte, die erstmal versuchen, aus Brettern einen Herd zu bauen, wenn sie sich Mikrowellenfraß warm machen wollen. ;-)

                              1. Schöner Vergleich ;)

                                oder bin ich schlicht und ergreifend zu dumm zum Programmieren?!?

                                Nein, du fällst nur gerade auf hotti rein. Das ist einer von der Sorte, die erstmal versuchen, aus Brettern einen Herd zu bauen, wenn sie sich Mikrowellenfraß warm machen wollen. ;-)

                                Das ist der übliche Weg, einer Sache auf den Grund zu gehen, wenn die nicht tut. Voraussetzung ist, dass der Herd selbst gebaut wurde, somit ists auch bekannt, wo die Nägel zu ziehen sind.

                                Heute jedoch werden Herde nicht mehr mit Brettern und Nägeln gebaut sondern mit großen Teilen aus einem noch größeren Baukastensystem, was dem Anwender suggeriert, dass er das Wissen um den inneren Zusammenhalt nicht braucht, sondern nur vorgefertigte Funktionseinheiten verbauen muss. Wer so baut, dem ist freilich schwer zu helfen, wenn der Herd nicht erwartungsgemäß funktioniert.

                                Die Frage, wer hier auf wen reinfällt, beantwortet sich somit.

                                Hotti

                                --
                                Ein eigener Herd ist Goldes wert.
                                1. Sorry, wenn es zu persönlich klang. Den Dingen auf den Grund zu gehen hat durchaus auch seine Berechtigung und kann ein sehr schönes Hobby sein.

                                  In dem Thread hier hatte Yadgar aber ein Problem, das sich mit einem millionenfach erprobten Mechanismus leicht lösen lässt, und ich hatte den Eindruck, dass die vielen Hinweise, wie man das selbst nachbauen könnte,* nur den Eindruck erwecken, dass das alles extrem kompliziert sei, und zur Verzweiflung des OP angesichts dieses "riesigen" Problems führen.

                                  Der größte Teil des Threads beschäftigt sich eben mit Dingen, die Yadgar erstmal nicht braucht, sondern sich bei Interesse auch hinterher noch anschauen kann. Ich unterstelle nicht, dass es Absicht gewesen sei, aber ich denke, Du hast Yadgar eher in die Irre geführt als unterstützt.

                                  Wenn man einem Kind das Lesen beibringen will, erwähnt man ja auch nicht alle 26 Buchstaben plus alle französischen Akzente plus chinesische Zeichen und von allen noch die Unicode-Eigenschaften am ersten Tag. ;)

                                  Viele Grüße,
                                  Alexander

                                  * Und mit "reinventing the square wheel" wollte ich darauf hinaus, dass ein solcher Nachbau eines Anfängers garantiert schlechter wird als die Standardlösung. Solche Nachbauten macht man entweder, wenn man die Details wirklich verstehen will, als Hobby, oder wenn man sich wirklich auskennt und glaubt, dass man es besser kann. Aber eben nicht als Anfänger, der ein konkretes Problem lösen will.

                          2. Hi!

                            Jedes Formular bekommt eine eindeutige "Kennung". Zu dieser Kennung gibt es das Ergebnis und die Rechenaufgabe, letztere bekommt der Besucher zu sehen. Serverseitig ist hinterlegt: die "Kennung" und das Ergebnis. Und natürlich fest "verdrahtet" wie alle drei Dingens zusammenhängen.

                            So eine "Kennung" nennt sich Session-ID, und die "Verdrahtung" ist einfach das Speichern in der $_SESSION.
                            Reinventing the square wheel

                            Der ganze Thread ist unnötig kompliziert. f1 und f2 kann man machen, man kann den Kram auch anders aufteilen. Ausgabe kann per echo erfolgen, muss aber nicht unbedingt, ?>HTML<?php ist für größere Blöcke eventuell leserlicher. Die BOM spielt nur eine Rolle, wenn man den HTTP-Header verändern will - da aber jeder Fall hier als 200 OK mit dem gleichen MIME-Type ausgeliefert wird, besteht dazu kein Grund.

                            Das Problem besteht schlicht darin, dass beim Überprüfen der Eingabe keine neuen Zufallszahlen erzeugt werden dürfen, weil die natürlich so gut wie nie mit den alten übereinstimmen. Man muss sich die alten merken. Lösung: Session.

                            MfG
                            Alexander

                2. Om nah hoo pez nyeetz, Yadgar!

                  Was bitte ist BOM?

                  Fragen, die mit was beginnen: lmgtfy

                  Matthias

                  --
                  1/z ist kein Blatt Papier. http://www.billiger-im-urlaub.de/kreis_sw.gif
                  1. Hi(gh)!

                    Om nah hoo pez nyeetz, Yadgar!

                    Ich glaube, ich bin nicht kewl genug, um das zu verstehen... muss ich?

                    Was bitte ist BOM?

                    Fragen, die mit was beginnen: lmgtfy

                    Ich hasse Google! Es schüttet einen den Kopf mit Hits zu, die üblicherweise zu 99 % unbrauchbarer Informationsmüll sind, Blog- und Forengequassel, E-Commerce ("jetzt BOM kaufen!!!") oder computergenerierte Schlagworthalden!
                    Würg!!!

                    Bis bald im Khyberspace!

                    Yadgar

            2. Hi,

              Nur... wie sende ich die Eingaben an f2() statt wie gehabt an das ganze Skript? Was muss bei "action" statt "gaestebuch.php" stehen?

              Eine der vielen Möglichkeiten: du verweist auf die Seite, die dein Formular generiert hast. Dessen Logik baust du ein wenig um.

              Zu Beginn schaust du, ob per Request-Variablen schon Daten vorhanden sind.
              Wenn ja, dann validierst du diese ggü. deinen Regeln.
              Sind sie valide (vollständig und fehlerfrei), dann leitest du an ein Skript weiter, welches dann für die Weiterverarbeitung zuständig ist. Im Zusammenhang von PHP hilft dir vielleicht weiter, dass du das andere Skript inkludieren (include) könntest. Wichtig dabei, dass du bis hierhin noch keine Ausgabe erzeugst. Dann brichst du die Verarbeitung deines ersten Skripts (gaestebuch.php) ab, z.B. mit exit oder return.

              Sind die Daten nicht vollständig oder gar nicht vorhanden, zeigst du dein Formular wieder an, und zwar dergestalt, dass die vorhandenen Formulardaten wieder eingetragen werden.

              Bis die Tage,
              Matti

  5. Hallo,

    es tut schon sehr weh diesen Thread zu lesen, besonders die affenartige Hilfe.

    Die 0815-Lösung würde z.B. http://php.net/manual/en/features.sessions.php verwenden. Das Internet ist für dieses Thema voll von schlechten (und 3 guten) Tutorials.

    • * Wenn in der Session noch keine Aufgabe für das Formular hinterlegt ist (vor dem ausgeben der seite prüfen):
        - erzeuge Aufgabe
        - speichere Aufgabe in der Session
        - gib Formular aus

    • Wenn Formular abgeschickt wird:
        - hole Aufgabe aus der Session
          - falls keine vorhanden, beginne bei *
        - vergleiche das übermittelte Ergebnis mit dem Ergebnis der in der Session
          gespeicherten Aufgabe
        - korrekt -> speichern -> aufgabe aus der session löschen
        - nicht korrekt -> generiere neue aufgabe (und speichere diese auch in der session) -> zeige fehlermeldung

    Hth