Upload und doppelte Datensätze verhindern.

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

  • Upload und doppelte Datensätze verhindern.

    Hallo,

    ich habe einen Problem den bisher immer unterschätzt hatte, langsam
    wird es aber lästig. Meine Suche ergab leider keine Ergebnisse.

    Und zwar es geht um Upload von Deteien auf dem Server mit einem Formular.
    Das Formuular (index.php) erfasst vielen persönlicher User-Daten und erlaubt bis 4 Anhängen auf dem server
    hochzuladen. Beim abschicken des Formulars, lädt sich die index.php selbst und die Felder werden auf
    vollständigkeit überprüft.
    Ist es alles ausgefüllt, werden die Anhänge auf dem server hochgeladen und die daten in eine DB gespeichert.
    Zum schluss wird anhand einen header(Location...) einen Status-seite angezeigt.
    Und hier fängt das Problem an, in der zwischenzeit wo der user warten muss, weil die Anhänge hochgeladen
    werden, (kann je nachdem bis 4 min. dauern), viele ungeduldige Users clicken nochmal auf abschicken weil
    der Buttton noch da ist, während die Seite die Anhänge hochlädt.
    Das script bricht ab und der upload fängt wieder von null an. Bisher wäre auch noch nicht so schlimm,
    schlimm wird dann aber, wenn zum schluss 4 oder 5 gleichen datensätze in der DB habe wo nur halb fertigen
    hochgeladenen Anhänge verlinkt sind.

    Hat jemand eine idee wie das Problem umgehen kann?

    Da die Daten durch

    <form enctype="multipart/form-data" action="<?= $_SERVER['PHP_SELF']"; ?>" method="post">

    hochgeladen werden, kann ich nach dem abschicken des Formulars nicht mehr reagieren,
    sofort werden, logischerweise, die Anhänge hochgeladen und die wartezeit beginnt, so dass ich kein
    einfluss auf meinem script mehr habe. Obwohl ich den INSERT INTO DB sogar nachem den header(Location...)
    positioniert habe, werden immer wieder doppel einträge gespeichert.
    Kann sein dass ich auf der Lösung schon sitze, ich sehe sie aber nicht :-(

    Vielen Dank schon mal.

    Gruß
    Pippo
    Zuletzt geändert von pippo; 02.09.2005, 12:39.
    In Flames - Pinbal Map
    Becoming the Archetype - No Fall Too Far
    Pantera

  • #2
    1. mit js den "abschicken"-button disable-n. hilf in den meisten fällen.

    2. erst hochladen, dann in die db eintragen - dann kann der uploadvorgang u.u. gefahrlos unterbrochen werden und eingetragen wird erst dann, wenn das hochladen geklappt hat. generell, wenn es sich vermeiden lässt - erst die registrierung, dann der upload (in separaten dateien).

    3. warum PHP_SELF im action-attribut und nicht der dateiname?

    Kommentar


    • #3
      Original geschrieben von penizillin
      1. mit js den "abschicken"-button disable-n. hilf in den meisten fällen.
      In diesen Fall nicht denn sobald auf abschicken drucke, geht mit den Upload sofort los
      und javascript wird erst nach dem reload aktiv: onClick='this.disabled=true;return true;'


      2. erst hochladen, dann in die db eintragen - dann kann der uploadvorgang u.u. gefahrlos
      unterbrochen werden und eingetragen wird erst dann, wenn das hochladen geklappt hat. generell,
      wenn es sich vermeiden lässt - erst die registrierung, dann der upload (in separaten dateien).
      Ja mit separaten Seite wollte ich vermeiden sonst denkt der User, im erster Moment, dass es
      gar nicht möglich sei Anhänge hochzuladen denn er würde das Upload-Formular erst auf der
      zweite Seite sehen. Sonst habe ich schon wie du gesagt hast, erst hochgeladen und wenn es geklappt
      hat eintrag in DB. Funktionert aber trotzdem nicht, während der wartezeit bleibt der button immer
      aktiv und beim drucken auf abschicken speichert er in der DB und fängt wieder von null an.
      Das phänomen taucht natürlich nur dann auf, wenn anhänge dabei sind, sonst geht es schnell
      mit den header weiter.


      3. warum PHP_SELF im action-attribut und nicht der dateiname?
      Gute Frage, ich mache immer so, der Dateiname wird somit nie direkt angesprochen, falls
      der Dateiname nachträglich sich ändern sollte, funktioniert das script trotzdem.
      Die drei forms sollten aber eigentlich gleich wirken oder übersehe ich was.

      <form enctype="multipart/form-data" action="<?= $_SERVER['PHP_SELF']"; ?>" method="post">
      <form enctype="multipart/form-data" action="#" target="_self" method="post">
      <form enctype="multipart/form-data" action="index.php" method="post">
      In Flames - Pinbal Map
      Becoming the Archetype - No Fall Too Far
      Pantera

      Kommentar


      • #4
        also je mehr ich darüber nachdenke desto mir schwieriger das Problem zu sein scheint.
        Gerade hatte ich überlegt, wenn mit eine einzige seite und mit einen einziges
        Formular der alles gleichzeitig macht, nicht funkioniert, dann doch die methode mit
        den Zeitstempel zu nutzen. Werden bei der abfrage identischen zeitstempel gefunden
        erfolgen keine weiteren einträge mehr, sondern wird dann nur der erste gespeichert.
        Aber dann ist mir aufgefallen dass wenn man z.B. 4 hochladeversuche stattfinden
        dass nur das letzte beinhaltet die fertigen hochgeladenen anhänge und nicht der erste
        Eintrag. Ich glaube das einzige was noch üblich bleibt, ist eine funktion zu bauen die
        die beim abruf der index.php-seite die DB nach doppelte identische Datensätze sucht (löscht)
        und immer das letzte version übrig lässt. Gibt so eine funktion in PHP die automatisch
        ohne den ID zu berücksichtigen, nach identischen Datensätze sucht?
        In Flames - Pinbal Map
        Becoming the Archetype - No Fall Too Far
        Pantera

        Kommentar


        • #5
          und javascript wird erst nach dem reload aktiv
          dann machst du aber etwas verkehrt, kann mir nicht vorstellen, dass js erst dann anfängt zu wirken. kenne selbst einige foren, bei denen der submit-button nach dem ersten klick deaktiviert wird, damit doppeltpostings vermieden werden.

          sonst denkt der User, im erster Moment
          das kannst du aber mit einer auffälligen <h1>-bemerkung strikt unterbinden (denkende user, gott-o-gott...)

          falls der Dateiname nachträglich sich ändern sollte, funktioniert das script trotzdem.
          das kann man auch anders erzielen. die benutzung von rohem PHP_SELF ist eine evtl. xss-gefahrstelle und sollte deswegen vermieden werden.

          Kommentar


          • #6
            Original geschrieben von penizillin
            dann machst du aber etwas verkehrt, kann mir nicht vorstellen, dass js erst dann anfängt zu wirken.
            Ja leider wird der form sofort aktiv und fängt an zu laden, das habe ich getestet. Erst nach
            dem upolad wird der button inaktiv, aber es ist schon zu spät. Am sonsten ohne die Upoload-funktion
            funktionert der button-disabled ganz gut. In meinem fall geht es aber trotzdem nicht, denn dazwischen
            schaltet sich einen prüfung auf vollständigkeit der felder, hier wird eine fehlermeldung angezeigt und der
            user muss weiter klicken können, bis alle felder ausgefüllt sind. Nervig ist es auch dass alle pfaden
            der dateien die hochgeladen werden müssen, von mal zu mal verloren gehen, also der user muss immer wieder
            auf durchsuchen klicken und die dateien neu ansprechen. Ich glaube dass leider nicht möglich ist die pfaden
            der anhänge global zu speichern oder zu merken, wie denn auch.

            das kannst du aber mit einer auffälligen <h1>-bemerkung strikt unterbinden (denkende user, gott-o-gott...)
            Ja mittlerweile bin auch überzeugt, wie du vorher schon sagtest, das ganze formular umzubauen und mit 3 separaten
            seite zu arbeiten, natürlich auch mit auffälligen <h1>-bemerkungen. Erst werden die persönlichen daten erfasst,
            danach auf seite 2, kann man die daten nochmal überprüfen und die anhänge hochladen. Erst beim erfolgreiche upload
            geht man auf seite 3 die einen status mitteilt und die daten in die DB speichert.

            das kann man auch anders erzielen. die benutzung von rohem PHP_SELF ist eine evtl. xss-gefahrstelle
            und sollte deswegen vermieden werden.
            gut zu wissen
            In Flames - Pinbal Map
            Becoming the Archetype - No Fall Too Far
            Pantera

            Kommentar

            Lädt...
            X