Formular doppeltes Absenden

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Formular doppeltes Absenden

    Hallo zusammen,

    ich brauche mal bitte Eure Hilfe.
    Ich habe ein Formular welches ich beim Abschicken per Post ($_SERVER['PHP_SELF']) an sich selbst sende und dann die Werte in eine Textdatei eintrage:

    <?php

    // Wenn das Formular abgeschickt wurde, füre den Inhalt der Klammern aus aus.

    if(isset($_POST['stati_change']))
    {
    echo $_POST['send'];

    $stati= $_POST['stati'];
    //$stati= $_POST['stati'];
    //echo $stati."<br>x";
    if ($estati <> 1 and $stati<>"")
    {

    //echo $stati."xx<br>";
    $eintrag = explode(";", trim($edit) ) ;

    $alter_inhalt = file("data_waesche.txt");
    $output = fopen("data_waesche.txt", "w");

    if ($output)
    {
    flock($output,2);
    $nl = chr(13) . chr(10);
    foreach($alter_inhalt as $zzeile)
    {
    //echo $zzeile."<br>";
    $neuedaten = $zzeile;
    if ($stati<>$zzeile)
    {
    fputs($output, $neuedaten);
    }
    }
    // Änderungen eintragen
    $astati= 2;
    $text = explode(";", $stati);

    fputs ($output,"$text[0];$text[1];$text[2];$text[3];$text[4];$text[5];$text[6];$text[7];$text[8];$text[9];$astati;$nl");
    flock($output,3);
    fclose($output);
    }
    else
    {
    echo "Datei konnte nicht zum";
    echo " Schreiben geöffnet werden";
    }
    }
    }
    ?>

    Klickt der Benutzer nun auf aktualisieren werden die Daten aber nochmals in die Textdatei eingetragen.

    Wie kann ich dies verhinden. Da ich recht neu in PHP bin brech ich mir schon fats die Finger.
    In den Foren habe ich auch schon gesucht aber nicht wirklich was gefunden.

    Vielleicht könnt ihr mir ja helfen?

    Danke schonmal

    VG

    Steffen Schmerler

  • #2
    Leite den User nach dem Eintrag der Daten mittels eines
    PHP-Code:
    header('Location: http://deineDomain.de/index.php');
    exit; 
    auf z.B. index.php weiter. Ein Refresh im Browser wird dann nur die index.php refreshen und nicht die Daten nochmals senden, die in form.php waren...

    Gruss

    tobi
    Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

    [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
    Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

    Kommentar


    • #3
      Ich halte nicht viel von Weiterleitungen, auf die eigene Domain..
      1. Benutzerführung verbessern(damit der Besucher gar nicht auf die F5 Idee kommt)
      2. frisst es Ressourcen
      3. hilft ein Formwächter genauso gut(und verhindert einfache Spamattacken)
      Wir werden alle sterben

      Kommentar


      • #4
        Benutzerführung verbessern(damit der Besucher gar nicht auf die F5 Idee kommt)
        Schön und gut nur was machst du wenn es der User boshaft absichtlich macht ?
        Btw was ist ein Formwächter

        Gruss

        tobi
        Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

        [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
        Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

        Kommentar


        • #5
          Wenn die Eintragung eh nur einmalig sein soll, könntest du einfach die IP des Users in ner DB oder Textfile speichern und/oder Cookie setzen und darauf immer bei der Speicherung prüfen. Kannst die Möglichkeiten natürlich auch verbinden und die IP in nem Cookie speichern, was aber nur wenig sinnvoll ist, da es nur ein sehr geringen Schutz darstellt.
          video2mp3.de - Kostenlos Videos von verschiedenen Videoportalen in MP3 umwandeln

          Kommentar


          • #6
            Btw was ist ein Formwächter
            Aus meiner Wühlkiste...
            evtl. etwas oversized


            Die Cache Sachen dienen dazu, um unliebsamme Browsermeldungen beim ZurückButton zu verhindern
            und die Zeitsperre habe ich auch mal dringelassen..
            PHP-Code:
            <?php
            error_reporting
            (E_ALL);
            session_cache_limiter('none'); // none/nocache/private/private_no_expire/public
            session_start();
            header('Cache-Control: no-store');
            header('Pragma: no-cache');

            $meldungen = array();

            $name  = isset($_POST['name']) ?$_POST['name'] :'';
            $input = isset($_POST['input'])?$_POST['input']:'';


            if (!empty(
            $_POST['name']))
            {
              if(
                  isset(
            $_SESSION['formwaechter']) &&
                  
            $_SESSION['formwaechter'] === $_POST['formwaechter']
                )
              {
                if
                    ( isset(
            $_SESSION['timestamp']) &&
                      
            $_SESSION['timestamp'] > (time()- 5*60// 5 minuten
                    
            )
                {
                  
            $meldungen[] = 'Sorry, aber nur 1 mal pro 5 Minuten!';
                }else
                {
                    
            // Hier werden die Daten verarbeitet
                    
            $_SESSION['name']   = $_POST['name'];
                    
            $_SESSION['datum']  = date("D M j G:i:s T Y");
                    
            $_SESSION['input']  = $_POST['input'];
                    
            $_SESSION['timestamp']  = time();
                    
            $name  $input ''// Felder wieder leer machen
                    
            $meldungen[] = 'Formulardaten verarbeitet!';
                }
              } else 
            $meldungen[] = 'Der formw&auml;chter hat zugeschlagen!';
            } else 
            $meldungen[] = 'Keine Formulardaten!';

            // neue Formwächter setzen
            $_SESSION['formwaechter'] = md5('Salz und '.rand());


            //*************
            // Ab hier, nur noch Ausgaben......


            ?>

            <html>
              <body>
                <form name="testform" action="<?php echo $_SERVER['PHP_SELF']?>" method="post">
                  <input  type="hidden"
                          name="formwaechter"
                          value="<?php echo $_SESSION['formwaechter']?>"
                  >
                  Name:<input type="text" name="name" value="<?php echo $name?>" >
                  Pflichtfeld<br>
                  Input:<input type="text" name="input" value="<?php echo $input?>" >
                  Darf leer bleiben<br>
                  <input type="submit" name="send" value="abschicken">
                </form>
                <h3>Meldungen:</h3>
                <?php echo implode('<br>',$meldungen?>
                <h3>Sessiondaten:</h3>
                 <pre>$_SESSION = <?php var_export($_SESSION?>;</pre>
              </body>
            </html>
            Nicht besonders schön, aber damit sind auch die meisten DummbeutelSpamBots aussenvor...
            Zuletzt geändert von combie; 03.04.2007, 14:19.
            Wir werden alle sterben

            Kommentar


            • #7
              Ja das wäre eine Möglichkeit. Kannst es dir ja noch so anpassen wie du es genau brauchst. Aber so solltest du vermeiden, dass Doppelsendungen gemacht werden.
              video2mp3.de - Kostenlos Videos von verschiedenen Videoportalen in MP3 umwandeln

              Kommentar


              • #8
                weiterleitung nach formularprüfung

                Hallo Zusammen,

                ich habe ein Formular bei dem ich nach dem Versand die Eingabe prüfe. Ist
                die Eingabe OK so soll eine Zielseite aufgerufen werden.

                Bisher habe ich es mit include gelöst, was mir aber nicht gefällt.
                Wir kann ich eine andere Seite anzeigen wenn die Eingaben OK sind?

                Mein Code bisher:

                // Wenn das Formular abgeschickt wurde, füre den Inhalt der Klammern aus aus.
                if(isset($_POST['ueberpruefung']))
                {
                // allesok wird auf 1 gesetzt, bekommt also einen Wert. Später wird damit abgefragt, ob Name und Email ausgefüllt wurden.
                $allesok = 1;

                // Hier wird geprüft ob Name leer ist. Ist dies der Fall, wird allesok auf 0 gesetzt (Kein Wert mehr) und ein Fehlertext erstellt, der im Formular ausgegeben wird.

                $heute = time();
                $datm= $_POST['datum'];
                //$datm = $lv->f($_POST['datum']);
                $vergleich = $datm;

                //Fahrzeugnummer
                if(empty($_POST['fzg_nummer'])){
                $allesok = 0;
                $error[fzg_nummer] = "<tr><td colspan=2 ><font color=red size =2 face=Verdana>Bitte geben Sie eine Fahrzeugnummer ein.</font></td></tr>";}

                }
                if($allesok){
                include('eintragen.php3');
                }

                ?>

                Danke im Voraus

                Steffen Schmerler

                Kommentar


                • #9
                  PHP-Code:
                  if($allesok){
                    
                  header('Location: http://deineDomain.de/seite.php');
                    exit;

                  z.B. so

                  Gruss

                  tobi

                  p.s. nächstes mal für PHP Code bitte die entsprechenden Tags verwenden
                  Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

                  [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
                  Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

                  Kommentar


                  • #10
                    geht nicht--&gt; bitte nochmal helfen

                    Das mit:

                    if($allesok){
                    header('Location: http://deineDomain.de/seite.php');
                    exit;
                    }

                    funktioniert nicht, da der Header doch dacht ich als erstes stehen muss und das würde in dem Code ja nicht gehen.

                    Bitte nochmal um Hilfe


                    Danke im Voraus

                    Steffen Schmerler

                    Kommentar


                    • #11
                      funktioniert nicht, da der Header doch dacht ich als erstes stehen muss und das würde in dem Code ja nicht gehen.
                      Und das weisst du bevor du es ausprobiet hast Es darf vor dem Senden eines header() keine Ausgabe an den Browser erfolgen. Wenn der Code zuvor kein echo oder dergleichen verwendet, dann geht das easy. Also zurück ans Zeichenbrett !
                      Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

                      [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
                      Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

                      Kommentar


                      • #12
                        Bisher habe ich es mit include gelöst, was mir aber nicht gefällt.
                        Darf ich mal fragen, was dir daran nicht gefällt?
                        Wir werden alle sterben

                        Kommentar

                        Lädt...
                        X