Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Seite aktualisieren

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Seite aktualisieren

    Hallo zusammen!

    Ich hab ein Script zum Bilder-hochladen.
    Das ganze funktioniert auch so wie es soll (hochladen, löschen, ...)

    Es gibt aber noch eine Situation, in der das Script noch nicht das tut was es soll: beim aktualisieren der Seite.

    Hintergrundinfo:
    Wenn man ein Bild hochlädt, und dann auf aktualisieren klickt, dann wird das Bild nochmal hochgeladen. Normal würde es einfach das vorherige ersetzen, da es ja den gleichen Namen hat, aber das hab ich verhindert, damit man nicht aus versehen ein Bild überschreibt.
    zB. das Bild heißt Katze, der Name ist nicht sehr aussagekräftig und kann oft vorkommen, deshalb heißt das erste Bild Katze, das zweite Katze_00, das dritte Katze_01 usw.

    Problem:
    Der User lädt ein Bild hoch (nennen wir es einfach wieder Katze). Dabei wird das Bild hochgeladen und in einen bestimmten Ordner gelegt. In einer MySQL-Datenbank gibt es dann ein Feld namends Bild in der der Pfad abgespeichert wird (Pfad/Katze.jpg).

    Der User klickt jetzt (aus welchem Grund auch immer) auf aktualisieren.
    Jetzt wird das Bild nochmal hochgeladen. Katze existiert bereits, also wird die Datei umbenannt (Katze_00) und in den Ordner für die Bilder gesteckt.
    Das Feld Bild in der MySQL-Datenbank wird aktualisiert und es steht nun der neue Pfad drin (Pfad/Katze_00.jpg).

    Nun wird zwar das korrekte Bild angezeigt, weil es ja identisch ist, aber es existiert jetzt ein nutzlosen Bild Katze.jpg das keiner mehr braucht.

    Wenn der User jetzt nochmal auf aktualisieren klicken würde, dann würde das ganze nochmal passieren und dabei die Zahl immer um eins erhöht (Katze_01, Katze_02, ... )

    Somit kann man durch diesen "Fehler" x Bilder hochladen, auch wenn man nur 1 davon auch wirklich nutzen kann. Es kann so also sehr viel Datenmüll entstehen.

    Ich bräuchte also etwas, das prüft, ob die Seite aktualisiert worden ist oder nicht, damit, wenn sie aktualisiert worden ist, das Bild NICHT MEHR hochgeladen wird.

    Frage: Gibt es sowas schon?
    Wenn nicht: Wie kann man sowas realisieren?

    Vielen Dank im Vorraus für jede Antwort!


  • #2
    du könntest eine variable vorher setzen: $check = 0
    beim abschicken (aktualisieren) des formulars fragst du die variable ab und erhöhst sie um 1. $check++
    dann musst du vor die aktion (in deinem fall bild uploaden) einfach die abfrage machen ob $check 0 oder 1 ist. wenn $check != 0 dann wird keine aktion gemacht.
    mfg Alex

    Kommentar


    • #3
      Die Frage die sich mir hier stellt ist wie die Seite aktualisiert wird!
      Ich vermute nämlich, das beim aktualisieren der Seite die Formulardaten neu versendet werden. Deshalb wird auch immer wieder ein neues Bild hochgeladen.
      Das könntest du unterbinden, indem du einfach, nachdem dein Script etwas hochgeladen etc. hat, in deinen Quelltext ein header("Location:upload.php\n\n"); machst. upload.php musst du natürlich durch deinen Dateinamen ersetzen.
      Oder du könntest deine Arrays ($_POST, $_FILES) löschen... Dann hätte dein Script keine Daten mehr zum versenden. Dies würde aber möglicherweise zu Fehlermeldungen führen... Wie gesagt. Probiers mal mit der header()-Funktion und poste mal ein bisschen Quellcode...

      Gruß,
      Andreas

      Kommentar


      • #4
        Ich würde ein md5_file() über hochgeladene Bilder jagen und vergleichen, ob ein Bild mit gleichem Hash in der letzten Zeit auch hochgeladen wurde (von der selben IP sogar noch).

        Edit: zum Posting vorher, das ist natürlich auch möglich. Du müsstest eben das Verarbeitungsskript (Bild checken, Datenbankeintrag vornehmen) verlassen, wenns geklappt hat, einfach per header("Location: weg.php"); Dann sind beim Reload auch keine POST-Variablen mehr vorhanden.

        Kommentar


        • #5
          Vielen Dank!

          Das funktioniert eigentlich sehr gut.
          Aber es gibt da noch ein kleines Problem...

          Man kann mit Hilfe des Scripts 3 Bilder hochladen...

          Wenn man also jetzt 1 hochlädt, dann setz ich $check auf 1, wenn man das 2. hochlädt, auf 2 und wenn man das 3. hochlädt auf 3.
          Wenn $check größer als 3 ist wird nichts gemacht.
          Tja, wenn das der User so macht, dann funktioniert das auch, aber das wird er wohl kaum tun...

          Wenn er nämlich jetzt nur 1 hochlädt und dann auf aktualisieren klickt, dann tritt das Problem vom Doppel-Upload wieder auf, es wird nur begrenzt auf max. 3mal...

          Gibt's dafür auch eine Lösung?

          Kommentar


          • #6
            Na dafür wirste ja wohl selbst ne Lösung finden Bissl selbst mitdenken!

            Kommentar


            • #7
              musst halt dem bild 1 $check 1 über hidden input mitliefern. bei 2 und 3 dasselbe mit $check 2 und $check 3.

              und dann für jede der drei variablen eine abfrage machen wie oben erklärt.
              mfg Alex

              Kommentar


              • #8
                Ich denke, das Hauptproblem wird sein, das viele Leute einfach den "reload button" im Browser clicken .... das lässt sich mit SESSIONS ganz gut abfangen:

                Dazu ein kleines Bsp:

                PHP-Code:
                <?php
                session_start
                ();
                srand((double)microtime()*10000);
                $myid md5(uniqid(rand()));

                if(!isset(
                $_SESSION['reload']))
                    
                $_SESSION['reload'] = array();

                if(
                in_array($_POST['id'],$_SESSION['reload']))
                    die(
                "bitte nur einmal schicken");


                echo 
                '<form action="'.$_SERVER['PHP_SELF'].'" method="POST">';
                    echo 
                '<input style="width:100px;" type="text" name="Test" value="Test">';
                    echo 
                '<input type="hidden" name="id" value="'.$myid.'">';
                    echo 
                '<input type="submit" name="" value="Test">';
                echo 
                "</form>";


                array_push($_SESSION['reload'],$_POST['id']);

                ?>
                Ansonsten kannst Du ja auch einfach vorher prüfen ob es schon ein Bild Katze für diesen Benutzer gibt, bzw. ob er schon 3 Bilder hochgeladen hat.

                Kommentar


                • #9
                  Genau das meine ich

                  Den "reload button" im Browser!

                  Eines passt aber noch nicht so ganz:
                  Wenn man auf den "reload button" klickt, BEVOR man etwas hochladen will dann wird das Hochladen total verweigert...

                  PHP-Code:
                  <?
                  session_start(); 
                  ...
                  if (!isset($_SESSION['reload']))
                      $_SESSION['reload'] = array();

                  if (!in_array($_POST['id'],$_SESSION['reload']))
                      // Funktion zum Hochladen
                  ...
                  // Formular
                  ...
                  array_push($_SESSION['reload'],$_POST['id']); 
                  ?>
                  Wie bzw wo leere ich die Session wieder korrekt, damit ein erneutes Hochladen nur dann verweigert wird, wenn man gerade was hochgeladen hat und DANN auf aktualisieren (im Browser) klickt?

                  Kommentar


                  • #10
                    Warum übernimmst du meine Lösung eigentlich nicht, muss man dir alle komplett vorkauen?

                    Kommentar


                    • #11
                      Wenn man auf den "reload button" klickt, BEVOR man etwas hochladen will dann wird das Hochladen total verweigert...

                      Einfach abfragen ob $_POST['id'] gesetzt ist.

                      Wie bzw wo leere ich die Session wieder korrekt, damit ein erneutes Hochladen nur dann verweigert wird, wenn man gerade was hochgeladen hat und DANN auf aktualisieren (im Browser) klickt?

                      Da brauchst Du nichts zu leeren. Wenn Du das Formular erneut abschickst, mittels "Submit-Button" wird es auch wieder geschickt. Nur nicht wenn Du den "Reload-Button" clickst.

                      Kommentar


                      • #12
                        Danke!

                        Ok, jetzt wird das Hochladen nicht verweigert, wenn man zuvor auf aktualisieren klickt --> gut

                        Wenn man aber was hochlädt, und dann noch was hochladen will (man darf ja 3 Bilder haben), dann wird das Hochladen wieder verweigert...

                        Ich glaub schon, dass ich die Session wieder leeren muss, wenn ich nämlich die Seite zum Bilder hochladen verlasse, und ein wenig durch das Programm gehe, und dann wieder zum Bilder hochladen gehe, wird das Hochladen immer noch verweigert, und zudem wird jedes reload aufgezeichnet, egal wo es im Programm stattfindet...

                        Wo leer ich die Session am besten?

                        Zusatzbemerkung:
                        Es soll ja nur direkt nach dem Hochladen ein erneutes Hochladen verweigert werden (weil das ja total sinnlos ist). Wenn man aber während man auf den Button klickt, ein anderes Bild haben will, dann soll man das auch können, von mir aus x mal (wenn der User soviel Zeit hat), da dann das Bild ja wieder gelöscht wird, nur halt beim Aktualisieren nicht...

                        Kommentar

                        Lädt...
                        X