Leeren von _POST[]

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

  • Leeren von _POST[]

    Morgen.

    Ich habe das wohl schon oft erörterte Problem mit dem Nachladen von Fomularen die Daten in eine Datenbank schieben.

    Früher hab ich das ganze über Sessionvariablen abgesichtert und konnte so erkennen , ob einer Nachlädt oder ob da was neues gekommen ist .

    Seit PHP5 hat sich mein Stiel etwas geändert und das mit der Sessionvariable geht einfach nicht mehr .

    Kleines Beispiel : ich hab eine Stelle an der ein User gelöscht wird.

    Ich hab eine index.php die nach Pageids entsprechende funktionen aufruft uns so eine Seite aufbaut .

    Ich lösche also aus der Funktion show_all_users heraus einen User , das macht delete_user() , und wenn in delete_user() keine EXCEPTION ausgelöst wird dann ist alle gut gegangen und ich kann eine Erfolgsmeldung direkt zurück in die show_all_users() Funktion geben die dann eben wie der Name schon sagt wieder die verbliebenen USER Auflistet.

    Würde ich wie Früher eine Sessionvariable im Formular Setzen und die dann bei der Datenbankaktion löschen bringt mir das hier nichts mehr , da ich die sofort wieder aktiv habe und der User reloaden kann und dann eben ne Fehlermeldung bekommt .

    PHP-Code:
    case 'delete_user': {

            
    $userid $_POST['userid'] ;
            
    $username $_POST['username'];

            try{
                
    delete_user$userid );
                
    show_all_users("" "Benutzer $username wurde gelöscht!");
            }

            catch ( 
    Exception $exception ){
                
    $fehler $exception->getMessage();
                
    show_all_users("Benutzer $username konnte nicht gelöscht werden!" );
            }

        break; 
    Kann ich mit PHP die Daten in POST löschen , oder muss ich dass über Javascript machen ?

    Oder fällt jemand spontan eine Lösung ein wie ich es schaffe doch zu erkennen ob da jemand Nachlädt oder ein neues Formular abschickt ?


    Nachtrag :

    Ok ich hab das Problem fürst erste etwas "dreckig" gelöst .

    Da das Projekt so oder so nicht ohne Javascript funktioniert hab ich habe ich in jetzt im Formular einen type=hidden input der standartmäsig auf False steht .

    Wenn ich auf den submit Button klicke wir der hidden Input Value auf true gesetzt und dann gesendet.

    Wenn einer Nachläd steht das Teil noch auf False und nichts passiert.

    Falls jemand eine Lösung kenn wie ich das ohne JAvascript in PHP hinbekomme wäre ich dankbar, da bestimmte Formulare auch ohen JavaScript funktionieren müssen und die sollte man auch nicht unbendingt reloaden können .

    Tipps werden dankbar angenommen.

    Gruß Sono.
    Zuletzt geändert von sono; 07.01.2006, 01:55.

  • #2
    Wenn einer Nachläd steht das Teil noch auf False und nichts passiert.
    Definiere mal "Nachläd". Ich bin sicher, wenn ich F5 Drücke werden die Daten genauso gesendet, wie ich sie beim ersten mal auch gesendet habe.

    Alles andere wäre irgendwie...

    Raffe jetzt aber nicht so wirklich, was dein eigentliches Problem ist.

    Wenn ich Daten sende, dann werte ich sie aus und danach ein header(location...) und gut ist. Niemand kann die Seite neu laden. Und selbst wenn du den header weg lässt und die seite neu geladen wird, wo nichts zu löschen ist, kann auch nichts gelöscht werden. -> fehlermeldung.

    Kommentar


    • #3
      Ich lösche also aus der Funktion show_all_users heraus einen User , das macht delete_user() , und wenn in delete_user() keine EXCEPTION ausgelöst wird dann ist alle gut gegangen und ich kann eine Erfolgsmeldung direkt zurück in die show_all_users() Funktion geben die dann eben wie der Name schon sagt wieder die verbliebenen USER Auflistet.
      Also wenn der User die Seite erneut lädt (F5) wird die ID des zu löschenden User's übergeben.
      Da diese nicht mehr existiert, wird ein Fehler ausgegeben.
      Und das willst du umgehen, richtig verstanden?
      Dann bastel deine Funktion so um, dass sie einfach nix tut, wenn die User-ID leer ist?!
      mfg - sagg

      Kommentar


      • #4
        Raffe jetzt aber nicht so wirklich, was dein eigentliches Problem ist.

        Wenn ich Daten sende, dann werte ich sie aus und danach ein header(location...) und gut ist. Niemand kann die Seite neu laden. Und selbst wenn du den header weg lässt und die seite neu geladen wird, wo nichts zu löschen ist, kann auch nichts gelöscht werden. -> fehlermeldung.
        Jain , Das mit den Löschen ist klar , dass ich nicht 2mal Löschen kann. Das war nur das Beispiel an dem ich demonstrieren wollte warum ich sofort wieder im Fomular bin aus dem ich eine Aktion starten kann und warum ein Reload eben einen Fehler verursacht den ich momentan nicht abfangen kann.

        Es gibt ja auch Formulare die Daten an Tabellen übergeben deren PK ein Serial ist aber sonst identische Einträge zulassen müssen.

        Und da meine Seite genau aus einer index.php besteht die bei bedarf Module lädt und mit diesen Modulen dann die Daten verarbeitet hab ich bei einem Reload oder bei mehreren Reloads plötzlich in machen Tabellen plötzlich doppelte Einträge.

        Das konnte ich früher durch eine Sessionvariable unterbinden , aber da bei meiner Methode absichtlich keine header( location ) oder meta refreshs notwendig sind um wie zurück in das Fomular zum erneuten eingeben von Daten zu kommen hab ich das Problem , dass beim Reload eben noch alle Daten vorhanden sind die identisch übergeben werden .

        Ich bin sicher, wenn ich F5 Drücke werden die Daten genauso gesendet, wie ich sie beim ersten mal auch gesendet habe.
        Und das ist die Erklärung warum meine Javascriptfunktion nicht funktioniert hat.

        Ich schau mal ob ich mit header(location ) was machen kann , aber eigentlich war es ja schon Absicht das so zu machen , dass eben nicht nachgeladen/weitergeleitet werden muss.

        Nachtrag :

        Dann bastel deine Funktion so um, dass sie einfach nix tut, wenn die User-ID leer ist?!
        Habs grad erst gesehen, also wie schon beschrieben ist das Problem etwas allgemeiner als das.
        Beim einfachen Nachladen in dieser Funktion bekommt der User die Meldung vom System dass der zu löschende User nicht existiert .

        Das war nur einer der kürzeren Abschnitte um zu die Arbeitsweise und die daraus resultierende Problematik zu verdeutlichen.

        Gruß Sono
        Zuletzt geändert von sono; 07.01.2006, 14:38.

        Kommentar


        • #5
          Dann war dein Beispiel denkbar schlecht gewählt.

          Aber auch so. du erlaubst doppelte Einträge? Und warum nicht beim Refresh? Den Unterschied kannst du nicht erkennen.

          Ne möglichkeit wäre ne Sperre für 5-10 Sekunden. Was danach passiert ist ne andere sache. aber da hilft dann eben nur die Weiterleitung. Ist ne geläufige Methode so.

          Und mit sicherheit besser als deine Session-Sache. Da bin ich mir immer noch nicht sicher, wie das funktioniert hat.

          Kommentar


          • #6
            Oder du generierst einen Code, der von Seitenaufruf zu Seintenaufruf unterschiedlich ist.
            Dann kann er reloaden wie er will, es passiert nix, wenn der Code nicht der aktuelle ist.

            Wobei ich die Version mit der Weiterleitung für besser halte.
            mfg - sagg

            Kommentar


            • #7
              Aber auch so. du erlaubst doppelte Einträge?
              Nein , eigentlich nicht , aber es gibt eben Daten die ich nicht darauf prüfen kann ob sie in der Form schon vorhanden sein sind.

              Das ist so wie wenn ich hier nach dem Posten auf Reload klicke und die mein Post dann 2mal da ist.
              Theoretisch sollte es gehen ,dass ich 2mal hintereinander den selben Inhalt schreiben kann nur soll das eben nicht passieren wenn per F5 neu lädt sonder maximal wenn man denselben Eintrag nochmal in das Formular schreibt und abschickt .

              Ist jetzt klar was ich will ?

              Und warum nicht beim Refresh?
              Siehe oben .

              Den Unterschied kannst du nicht erkennen.
              Eben deshalb will ich zumindest erkenn ob jemand nachläd um an den Stellen an denen eben entsprechende doppelte Einträge möglich sein könnten einen doppelten Eintrag durch einen Relaod zu verhindern.

              Wenn ich einen Refresh einbauen würde , dann hätte ich das Problem nicht und bräuchte nicht zu Posten.

              Das mit der Session funktioniert so einfach wie gut,
              ( IM Fomular Sessiovariable auf TRUE , beim Nächsten Script auf False , eine Meldung ausgeben und dann per Refresh nach 5 Sekunden zurück zum Formular für den nächsten Eintrag. Wenn in der Zwischenzeitz jemand auf Refresh gedrückt hat ist dank dem Session Wert nichts passiert da der auf False stand. )

              Nur wenn man so Programmiert wie ich mittlerweile geht das eben nicht mehr.

              Kann ich mit PHP die Daten in POST löschen , oder muss ich dass über Javascript machen ?

              Oder fällt jemand spontan eine Lösung ein wie ich es schaffe doch zu erkennen ob da jemand Nachlädt oder ein neues Formular abschickt ?
              Ok das Beispiel war wohl etwas missverständlich , aber die Frage war eigentlich eindeutig oder nicht ?

              Kommentar


              • #8
                Ich hab jetzt eine Lösung gefunden.

                Ich lege einen Counter in die Session. Den Wert dieses Counter setze ich bei jeder Abfrage um 1 nach oben .

                Weiter übergebe ich den Wert des Counter jeder Abfrage ( wie gesagt regelt alles eine Klasse ) im Kopf.

                Wenn jetzt also eine Abfrage kommt und deren Wert kleiner ist als der Wert in der Session , dann muss jemand auf Reload geklickt haben.


                So kann mans machen , falls jemand mal dasselbe Problem hat .

                Nur als kleine Warnung vorweg , das ist eine sehr Fehleranfällige Methode und man muss ziemlich genau überlegen wann man wo wie eine Sequenznummer übergibt.

                Grerade wenn man mehrere Formulare auf einer Seite hat gestalltet sich das so leider sehr schwierig.

                Wenn also jemand eine bessere Lösung kennt . Bitte Posten.

                Gruß Sono
                Zuletzt geändert von sono; 12.01.2006, 09:38.

                Kommentar


                • #9
                  Glaub mir, header() ist genau das was du suchst. Hat ja nichts mit einer clientseitigen weiterleitung ala js oder meta refresh zu tun!


                  Was ich aber nicht verstehe:
                  PHP-Code:
                          try{
                              
                  delete_user$userid );
                              
                  show_all_users("" "Benutzer $username wurde gelöscht!");
                          }

                          catch ( 
                  Exception $exception ){
                              
                  $fehler $exception->getMessage();
                              
                  show_all_users("Benutzer $username konnte nicht gelöscht werden!" );
                          } 
                  Warum gibst du über die show_all_users funktion nen Fehler aus? Mach dir doch ne extra Funktion/Methode dafür?

                  Kommentar


                  • #10
                    @sono

                    anscheinend hat hier nur die Hälfte dein Problem verstanden.

                    Ich glaube nicht das es möglich ist die POST DAten zu löschen da sie ja vom Browser der clienten gesendet werden.

                    ---------

                    Ich hatte das selbe bei nem Login-script bei dem das aktualisieren auch nicht zum wieder einloggen führen sollte.

                    Ich habe nach dem Formular eine Variable eingeführt- der Login wird nur ausgeführt wenn die Variable den richtigen Wert hat. Im Login wird der wert wieder zurückgesetzt.

                    Zuletzt geändert von Pampeldibuh; 16.01.2006, 23:57.

                    Kommentar


                    • #11
                      So. Mir ist gerade die Lösung zugeflogen.

                      Das ist wohl ein der Kürzesten und Primitivsten Funktionen die ich je geschrieben habe, aber bis ich endlich mal drauf gekommen bin wie bescheiden einfach ich das lösen kann.

                      Die Lange Version mit kleiner Sessionvariablen ( Für Fileuploads zB. ) :

                      PHP-Code:
                      function    detect_reload(){
                          
                      $schtring NULL;
                          foreach( 
                      $_POST as $post ){
                              
                      $schtring .= $post;
                          }

                          
                      $test md5($schtring);

                          if ( 
                      $test == $_SESSION['OLDPOST'] ){
                              echo 
                      "RELOAD DETECKTED!";
                          }
                          else{
                              
                      $_SESSION['OLDPOST'] = $test;
                          }


                      Oder die Kurze Version für kleine Datenmengen:

                      PHP-Code:
                      function    detect_reload(){
                          
                      $schtring NULL;

                          if ( 
                      $_POST === $_SESSION['OLDPOST'] ){
                              echo 
                      "RELOAD DETECKTED!";
                          }
                          else{
                              
                      $_SESSION['OLDPOST'] = $_POST;
                          }

                      Problem gelöst .

                      Hoffe mal das hilft manchen weiter die genau dasselbe Problem haben und keine Seiten Refreshs machen wollen.

                      Gruß Sono

                      Kommentar


                      • #12
                        Ja mir hats sehr geholfen!!!!

                        Vielen Dank (Falls du dies überhaupt jemals lesen solltest)

                        Aber wieso $schtring=NULL schtring wird doch gar net mehr verwendet?
                        Gruß Sebi
                        Zuletzt geändert von php-sebi; 17.07.2006, 11:37.

                        Kommentar

                        Lädt...
                        X