Andavos: Ok wenn Button gedrückt wurde (reloadsperre)

Hallo,
Ich habe ein Gästebuch.
Dort gibt der Besucher in ein Formular die Typischen Daten ein und drückt dan nauf ein Submit Button.
Die Daten werden dann an eine extra Seite per POST gesendet.

Wenn der Besucher jetzt auf der Seite ist, der die Daten in die MySQL Datenbank einträgt, und dort F5 (Aktualisieren) drückt, dann werden seine Daten immer wieder neu eingetragen.
So kann man ganz einfach mein Gästebuch zuspammen.
Kann man was dagegen machen?

Ich habe gelesen das es eine if(buttongedrück)... Funktion gibt, leider weiß ich nicht wie die geht und im Archiv und im Manual habe ich auch nichts gefunden.

Also wenn ihr jemand ein Codesnipsel hinposten könnte wäre ich dankbar.

MFG
Andavos

--
http://www.rpgcommunity.de/clanwissen/index.php Webdesign, PHP, Clan-Aufbau und mehr
  1. Hallo,
    du musst darauf achten dass der submit-button mit zwische <form> und </form> steht. Also:
    <form action="add.php" method="post">
    [hier kommen jetzt die ganzen Textfelder und son zeug]
    .
    .
    .
    <input type="Submit" name="sub" value="Eintragen" class="button">
    </form>

    Dadurch das der Button einen Namen hat und auch einen Wert (value) kannst du jetzt auf der nächsten seite überprüfen ob der Button gedrück wurde. Das geht so:
    if(isset($sub))
    isset() überprüft ob der Variablen die in den Klammern steht ein Wert zugewiesen wurde oder nicht und gibt dann true oder false zurück.

    Hoffe das ist das was du gesucht hast.

    Tschau

    Tobias

    --
    http://www.tobiasklare.de
    fo:) ch:? rl:( br:^ n4:° ie:{ mo:) va:| fl:) ss:| ls:<
    Die Erklärung zum Selfcode findest du hier: http://emmanuel.dammerer.at/selfcode.html
    Einen Decoder für den Selfcode findest du hier: http://peter.in-berlin.de/projekte/selfcode
    1. Hallo,
      erstmal danke für den Tipp, aber leider geht es immer noch nicht.

      Der Script:

      Formular:
      ...
      <input type="submit" name="sub" value="Absenden">
      </form>....

      Script:
      ...
      $sub = $_POST["sub"];
      if(isset($sub))
       {
      //Eintragen
      }
      else
      {
      //Fehler
      }
      ?>

      Füllt man jetzt das Formular aus und drückt dann auf Absenden, dann wird es gespeichert. Dort steht dann: Eintrag gespeichert.
      Dürckt man dann F5 (Aktualisiern) wird es wieder gespeichert, also ist der eintrag doppelt drin.

      MFG
      Andavos

      --
      http://www.rpgcommunity.de/clanwissen/index.php Webdesign, PHP, Clan-Aufbau und mehr
      1. Hallo,
        dann sorg doch dafür das $sub nicht mehr gesetzt ist, also so:

        ...
        $sub = $_POST["sub"];
        if(isset($sub))
        { $_POST["sub"]="";
        //Eintragen
        }
        else
        {
        //Fehler
        }
        ?>

        Ich hab das jetzt nicht ausprobiert, aber von der Theorie her müste es funzen.

        Tschau

        Tobias

        --
        http://www.tobiasklare.de
        fo:) ch:? rl:( br:^ n4:° ie:{ mo:) va:| fl:) ss:| ls:<
        Die Erklärung zum Selfcode findest du hier: http://emmanuel.dammerer.at/selfcode.html
        Einen Decoder für den Selfcode findest du hier: http://peter.in-berlin.de/projekte/selfcode
        1. Hallo,
          jo müsste gehn.
          Danke dir.

          Hab aber was besseres gefunden.

          Er fragt den letzten Eintrag aus der DB ab.
          Wenn sein geschriebener Text der gleiche ist wie der letzte Text in der Datenbank, dann wird er nicht mehr gespeichert. Mit IP wäre das noch viel sicherer.

          Aber so gehts am Anfang auch.

          MFG
          Andavos

          --
          http://www.rpgcommunity.de/clanwissen/index.php Webdesign, PHP, Clan-Aufbau und mehr
        2. Hallo Tobias!

          Eigentlich wollte ich Dein Posting ja einfach so stehen lassen, aber weil Andavos es wohl probiert hat kurz ne Ergänzung:
          Wenn ich Dich richtig verstanden habe, dann ist das ,was Du vorschlägst irgendwas, aber nicht das, was Andavos suchte.
          Mit Deiner Methode prüfst du ganz allgemein, ob das Formular abgesendet wurde, ist ja auch oft ganz sinnvoll, aber damit kannst du nicht prüfen, ob es bereits einen identischen Datensatz in der DB gibt, weil Du eh einfach wieder in die DB reinschreibst, wenn das Formular abgeschickt wurde - folglich bringt Dein Vorschlag Andavos überhaupt rein gar nix.

          dann sorg doch dafür das $sub nicht mehr gesetzt ist, also so:

          Wenn es im Formular ein Feld gibt, das sub heißt, dann wird dies beim Absenden jedesmal wieder gesetzt.
          (da bringt es nichts, wenn du es im verarbeitenden Script dann auf "" setzt, wenn dann sollte man dafür imho eh unset() verwenden - aber wenn man das Formular neu abschickt ist sie ja eh wieder gesetzt ...)

          Ich hab das jetzt nicht ausprobiert, aber von der Theorie her müste es funzen.

          Nein, müßte es imho nicht.

          MfG
          Götz

          --
          Losung und Lehrtext für Freitag, 19. September 2003
          Du, Herr, sei nicht ferne; meine Stärke, eile, mir zu helfen! (Psalm 22,20)
          Paulus sagte: Gottes Hilfe habe ich erfahren bis zum heutigen Tag und stehe nun hier und bin sein Zeuge bei Groß und Klein. (Apostelgeschichte 26,22)
          (http://www.losungen.de/heute.php3)
  2. Hallo Andavos!

    Ich habe ein Gästebuch.

    Achso. Ja. Stimmt.
    (gibt ja genug Threads dazu ...)

    Wenn der Besucher jetzt auf der Seite ist, der die Daten in die MySQL Datenbank einträgt, und dort F5 (Aktualisieren) drückt, dann werden seine Daten immer wieder neu eingetragen.
    So kann man ganz einfach mein Gästebuch zuspammen.
    Kann man was dagegen machen?

    Du kannst erstmal die Datenbank befragen, ob sie schon so einen eintrag hat.
    Müßtest also vor jedem INSERT mal noch nen SELECT machen, und dann die Eintragungen mit denen, die gesendet werden vergleichen.

    Ich habe gelesen das es eine if(buttongedrück)... Funktion gibt, leider weiß ich nicht wie die geht und im Archiv und im Manual habe ich auch nichts gefunden.

    Sowas wird es in PHP bestimmt nicht geben, weil: Buttondrücken passiert beim Client, und PHP läuft auf dem Server.
    Mit JavaScript könntest du doppeltes Absenden vielleicht abfangen.

    MfG
    Götz

    --
    Losung und Lehrtext für Donnerstag, 18. September 2003
    Weh dem, der mit seinem Schöpfer hadert, eine Scherbe unter irdenen Scherben! Spricht denn der Ton zu seinem Töpfer: Was machst du? (Jesaja 45,9)
    Gott lässt sich nicht von Menschenhänden dienen wie einer, der etwas nötig hätte, da er doch selber jedermann Leben und Odem und alles gibt. (Apostelgeschichte 17,25)
    (http://www.losungen.de/heute.php3)
    1. Hallo,
      ok danke dir, aber wie kann ich den aller letzten Eintrag aus meiner DB abfregen?

      Außerdem sind das nur hiermit 2 Threads ;).

      Und kennst du den Javascript Code dafür?

      MFG
      Andavos

      --
      http://www.rpgcommunity.de/clanwissen/index.php Webdesign, PHP, Clan-Aufbau und mehr
      1. Hallo Andavos!

        ok danke dir, aber wie kann ich den aller letzten Eintrag aus meiner DB abfregen?

        Du hast ein Feld mit einer id, die mit auto-increment immer erhöht wird, in deiner Tabelle?
        Falls ja, laß dir einfach nur einen Datensatz (Stichwort LIMIT) ausgeben, und zwar nach id, absteigend geordnet.
        Dann solltest du eigentlich den letzten bekommen.

        Außerdem kannst Du dir mal http://de.php.net/manual/en/function.mysql-insert-id.php anschauen.

        Außerdem sind das nur hiermit 2 Threads ;).

        Die dafür kurz untereinander ;)

        Und kennst du den Javascript Code dafür?

        Nein, kenne ich nicht.
        Weil ich mich kaum mit JavaScript auskenne.
        Aber bestimmt weiß das jemand anders hier viel besser als ich (ich denk da schon an jemand bestimmtes ;), ob das überhaupt wirklich so geht.

        Aber im Zweifel würde ich mich gegen die JS Variante entscheiden, oder nru zusätzlich zur serverseitigen Prüfung.

        MfG
        Götz

        --
        Losung und Lehrtext für Donnerstag, 18. September 2003
        Weh dem, der mit seinem Schöpfer hadert, eine Scherbe unter irdenen Scherben! Spricht denn der Ton zu seinem Töpfer: Was machst du? (Jesaja 45,9)
        Gott lässt sich nicht von Menschenhänden dienen wie einer, der etwas nötig hätte, da er doch selber jedermann Leben und Odem und alles gibt. (Apostelgeschichte 17,25)
        (http://www.losungen.de/heute.php3)
        1. Hallo,
          danke.

          Ich habs so gemacht:

          Er fragt den letzten Eintrag aus der DB ab.
          Wenn sein geschriebener Text der gleiche ist wie der letzte Text in der Datenbank, dann wird er nicht mehr gespeichert. Mit IP wäre das noch viel sicherer.

          Aber das reicht für den Anfang

          MFG
          Andavos

          --
          http://www.rpgcommunity.de/clanwissen/index.php Webdesign, PHP, Clan-Aufbau und mehr
  3. Hallo Andavos,

    So kann man ganz einfach mein Gästebuch zuspammen.
    Kann man was dagegen machen?

    http://www.php-faq.de/q/q-phplib-reloads.html

    Viele Grüße,
    Christian

  4. Also wenn ihr jemand ein Codesnipsel hinposten könnte wäre ich dankbar.

    da gibts was ganz einfaches:

    $insert = mysql_query("INSERT INTO tabelle (feld1,feld2,feld3) VALUES ('feld1','feld2','feld3')",$connection);

    if ($insert == 1) {
      header("thankyou.php");
    }
    else {
      header("error.php");
    }

    Quasi, dass die Seite, die die Daten in die Datenbank einträgt, nie im Browser angezeigt wird, sondern gleich auf eine nächste Seite weitergeleitet wird (thankyou.php bei erfolgreichem Eintragen, error.php bei erfolglosem Eintragen). Und wenn der Benutzer dann diese Seite aktualisiert, und sei es tausend Mal, kann es dir herzlichst egal sein ;-)

    MFG
    Andavos

    Gruß, Thomas

    1. if ($insert == 1) {
        header("thankyou.php");
      }
      else {
        header("error.php");
      }

      Meine Güte, ich muss wohl schon sehr müde sein. Setze in die header-Funktion bitte statt "thankyou.php" eher "Location: thankyou.php" ein, sonst funktionierts wohl nicht. Selbiges gilt für error.php.

      Und nun ab ins Bett ;-)

      Korrigierende Grüße,
      Tom

      1. hi,

        Meine Güte, ich muss wohl schon sehr müde sein. Setze in die header-Funktion bitte statt "thankyou.php" eher "Location: thankyou.php" ein, sonst funktionierts wohl nicht.

        und wenn du dann wieder ganz wach bist, liest du bitte mal im php-manual bei der funktion header() nach.

        für einen location-header ist ein _kompletter_ URL (inkl. http://) erforderlich.

        gruss,
        wahsaga

        1. Meine Güte, ich muss wohl schon sehr müde sein. Setze in die header-Funktion bitte statt "thankyou.php" eher "Location: thankyou.php" ein, sonst funktionierts wohl nicht.
          und wenn du dann wieder ganz wach bist, liest du bitte mal im php-manual bei der funktion header() nach.

          Stimmt. Da ich mich aber normalerweise auf mein Buch verlasse (zugegeben, schon etwas älter), konnte ich das nicht wissen, da dies dort nicht explizit geschrieben steht.
          Was ich aber immer wieder verwunderlich finde, ist, wie manche hier meinen, andere mit einer überheblichen Schreibweise auf Fehler hinzuweisen. Das ist keine Art; es geht schließlich auch anders. Oder denkst du, dass ich es nur beherzige, wenn man es mir auf diese Art sagt?
          Vielleicht wars nicht so gemeint, kommt aber zumindest so rüber.

          für einen location-header ist ein _kompletter_ URL (inkl. http://) erforderlich.

          Mittlerweile weiß ich es, danke. Werde es mir merken. Denn es ist sehr unangenehm hier, einen Fehler zu machen.

          gruss,
          wahsaga

          Nix für ungut,
          Liebe Grüße trotzdem,
          Thomas

          1. hi,

            Was ich aber immer wieder verwunderlich finde, ist, wie manche hier meinen, andere mit einer überheblichen Schreibweise auf Fehler hinzuweisen. Das ist keine Art; es geht schließlich auch anders.

            die formulierung "und wenn du wieder ganz wach bist" war eigentlich eher scherzhaft gemeint in bezug auf deine andeutung, dass du wohl zu müde bist.
            "von oben herab" war es nicht gemeint.

            Vielleicht wars nicht so gemeint, kommt aber zumindest so rüber.

            die ständige krux im www: ascii-zeichen sind eine recht emotonslose ausdrucksweise und lassen daher oft zu viel interpretationsspielraum.

            gruss,
            wahsaga

            1. die formulierung "und wenn du wieder ganz wach bist" war eigentlich eher scherzhaft gemeint in bezug auf deine andeutung, dass du wohl zu müde bist.
              "von oben herab" war es nicht gemeint.

              OK, dann 'sorry' von mir, dass ich so in die Defensive gegangen bin. Als Leser dieses Forums bekommt man nun mal mit, wie hier manchmal miteinander umgesprungen wird, und wenn dann in einem Posting der Verdacht ankommt, ballt man natürlich gleich die Fäuste.
              Ich denke, Stefans Posting liegt da genau richtig. Er spricht mir aus der Seele.

              Vielleicht wars nicht so gemeint, kommt aber zumindest so rüber.
              die ständige krux im www: ascii-zeichen sind eine recht emotonslose ausdrucksweise und lassen daher oft zu viel interpretationsspielraum.

              Stimmt natürlich; damit kann man niemals die Emotionen rüberbringen, die man ansonsten mit Mimik, Gestik, Ton und Sprache vermitteln kann.
              Meine Reaktion war aber auch dadurch bedingt, dass ich es gewohnt bin, dass Scherze mit Emoticons o.ä. "markiert" werden. Dass das nicht jedermann verwendet, sollte auch ich berücksichtigen. Ich fasse mich mal selbst an der Nase. ;-)

              Liebe Grüße,
              Thomas

        2. für einen location-header ist ein _kompletter_ URL (inkl. http://) erforderlich.

          Noch etwas: in meinem Buch steht sogar folgendes Beispiel zu header():

          header("Location: www.redirect.com");

          Ohne http://
          Seltsam, war das 1999 noch anders oder war der Autor da einfach unachtsam? Vielleicht sollt ich mich aber auch mal nach einem neueren Buch umsehen...

          Liebe Grüße,
          Thomas

          1. Hallo Thomas,

            Seltsam, war das 1999 noch anders oder war der Autor da einfach unachtsam?

            Weder noch. Die wenigsten "PHP-Profis" kennen anscheinend den HTTP-Standard.

            Vielleicht sollt ich mich aber auch mal nach einem neueren Buch umsehen...

            Die Qualität eines Buches würde ich nicht unbedingt daran festnageln, ob ein Location-Header korrekt gesendet wird. Es trägt zum insgesamten Bild bei, allerdings wäre das für mich garantiert nicht ausschlaggebend, das Buch als schlecht zu bezeichnen.

            Viele Grüße,
            Christian

            1. Vielleicht sollt ich mich aber auch mal nach einem neueren Buch umsehen...
              Die Qualität eines Buches würde ich nicht unbedingt daran festnageln, ob ein Location-Header korrekt gesendet wird. Es trägt zum insgesamten Bild bei, allerdings wäre das für mich garantiert nicht ausschlaggebend, das Buch als schlecht zu bezeichnen.

              Missverständnis hier. Dass ich mich nach einem neueren Buch umsehen sollte, habe ich auf Grund der Tatsache geschrieben, dass es von 1999 ist und eigentlich noch PHP3 behandelt (was ich vergessen habe zu erwähnen); zwar werden auch PHP4 Funktionen erklärt, aber die Basis des Buches ist PHP3.
              Jedenfalls war hab ich die Aussage bestimmt nicht getätigt, weil da der Location Header nicht standardkonform beschrieben wurde ;-)

              Liebe Grüße,
              Thomas