Ankündigung

Einklappen
Keine Ankündigung bisher.

Bildauswahl mit Checkboxen

Einklappen

Neue Werbung 2019

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

  • Bildauswahl mit Checkboxen

    Hallo liebe Forengemeinde,

    habe ein kleines Problem, welches ich durch mehrstündiges googlen bisher nicht lösen konnte.

    Folgender Anwendungsfall: Mit einer foreach Schleife werden innerhalb einer Post-Form Bilder, die in einem FTP Verzeichnis liegen, eingelesen und als background image eines spans innerhalb eines divs auf einer Seite ausgegeben. Das Div enthält weiterhin ein span mit einer checkbox um das entsprechende Bild auszuwählen.

    Soweit so gut. Die checkboxen sind standardmäßig alle auf checked und die Bilder müssen somit deselektiert werden. Das ganze soll dann per Submit, irgendwie/-wo gespeichert werden, damit alle Nutzer auf der Website sehen, welche Bilder noch gecheckt sind.

    Ich habe mich durch zig Foren gegooglet aber bin nicht wirklich schlau draus geworden. Datenbank oder .txt File nehmen? Mein Problem ist, dass ich ja nicht weiß, wie viele Bilder am Ende ausgegeben werden, also wie viele inputs von der Schleife erzeugt werden.


    Hat jemand eine Idee wie man das lösen kann? Anbei noch etwas Code:

    PHP-Code:
    <form action="<? echo $_SERVER['PHP_SELF']; ?>" name="imageform" method="post" enctype="multipart/form-data">
            <div id="ImgArea">
            <?
                $files        = array_diff(scandir('.'),array('.','..'));
                $allowed    = array('jpg','jpeg','png','gif','bmp');
                sort($files);
                
                foreach($files as $id => $file) {
                    if(in_array(substr(strrchr($file,'.'),1),$allowed)) {
                        ?>
                        <div id="<? echo 'ib_'.$id ?>">
                            <span class="s1"><p style="background-image:url(imgViewer/resizer_wm.php?imgfile=../<? echo $file; ?>&max_width=500&max_height=375)" onClick="changeCheckbox('<? echo 'ib_'.$id ?>')" title="<? echo $file; ?>"></p></span>
                            <span class="s2"><input name="<? echo 'ib_'.$id.'_cb' ?>" type="checkbox" checked onChange="setCheckboxStat()"/></span>
                            
                        </div>
                        <?
                        
                    }
                }
            ?>
            </div>
        </form>

  • #2
    Sobald etwas gespeichert werden soll, trifft man mit einer Datenbank eigentlich nie eine schlechte Entscheidung.

    Wenn du deine Datenbank richtig aufbaust und normalisierst ist es egal wie viele Bilder vom Benutzer ausgewählt werden. Dafür solltest du dich aber erst einmal besser mit dem Thema Datenbanken vertraut machen. Hier eine gute Seite.
    - Laravel

    Kommentar


    • #3
      Weiterhin würde ich dazu raten den name der checkbox so aufzubauen: name="bild[id]"
      Hat später den vortei, solltest du noch weitere Daten mitsenden das du alle gewählten bilder in einem subarray von _POST hast.

      Was tera3yte schon schrieb ist nichts hinzuzufügen, außer vllt dieser kleine hinweis: id;user_id;bild

      Kommentar


      • #4
        Danke schon mal für eure Hinweise.
        Ganz kurz - bevor ich mich im Thema Datenbanken noch mehr vertiefe.

        Dieses Script wird für viele verschiedene Projekte (und auch gleichzeitig) eingesetzt, die Daten müssten also alle in eine selbe zentrale Datenbank, weil keine Zeit ist, jedes mal eine neue anzulegen.
        Was wenn sich dann mal Bildnamen wiederholen, was durchaus der Fall sein kann?

        EDIT: müsste möglich sein, wenn ich noch eine Spalte mit Ordnernamen habe oder?

        Kommentar


        • #5
          Du meinst zwei verschiedene Bilder allerdings mit dem selben Namen? Dann solltest du eventuell den Bildern beim Upload eine einmalige ID zuweisen z.B. x1_KatzenBild.jpeg, und dem nächsten Bild ein x2_KatzenBild.jpeg

          Dann kann dir nicht passieren das du vorhandene Bilder überschreibst. Und auch in der Datenbank kann es dann nicht passieren das mehrere (verschiedene) Bilder den selben Namen haben.
          - Laravel

          Kommentar


          • #6
            Du könntest auch für jedes "Projekt" eine eigene "Tabelle" innerhalb der Datenbank verwenden.

            Gefühlt würde ich das "Formular" auch aus den Informationen in der Datenbank erstellen und nicht aus dem Dateisystem.

            Also nach dem Schema:

            Datei Upload per FTP -> automatische Erstellung der Datenbankeinträge auf Basis des Dateisystems -> Ausgabe des Datenbankinhaltes beim Aufruf durch den Nutzer -> Veränderung durch Nutzer beim Absenden des Formulars -> Änderung in der Datenbank Speichern -> ggf. Änderung z.B. löschen der Daten im Dateisystem

            Die "Tabellen" würde ich mir dabei nach Schema F aus der Ordnerstruktur des Parent Directory automatisch erstellen lassen. Ein Ordner entspricht also einem Projekt. Die Einträge z.B. Namen der Bilder entsprechend aus dem Dateinamen. Hierdurch wäre eine automatische Zuordnung zu dem jeweiligen Projekt m.E. simpler als durch einen projektspezifischen Schlüssel in einer einzigen Tabelle, da ja jede Tabelle nur Einträge zu einem spezifischen Projekt enthält.

            Dann legst du dir eine Primärtabelle an aus der dein Script bei der Ausgabe die Projektarchitektur mittels Sekundärschlüssel nachvollziehen kann. Das ganze müsste dann eigentlich ohne personellen Eingriff in die MySQL Datenbank dynamisch erweiterbar bzw. verkleinerbar sein.

            Kommentar


            • #7
              Zitat von TessaKavanagh Beitrag anzeigen
              [...]
              Gefühlt würde ich das "Formular" auch aus den Informationen in der Datenbank erstellen und nicht aus dem Dateisystem.
              [...]
              Riskante Sache meiner Meinung nach. Wenn Dateien auf dem Server gelöscht werden (manuell zum Beispiel) darf man auf keinen Fall vergessen diese auch aus der Datenbank zu löschen. Und das kann in so einem Fall sehr schnell passieren. Das kann (wird) sehr schnell zu Fehlern führen, weil Bilder die die Datenbank "anzeigt" dann nicht mehr erreichbar sind.
              - Laravel

              Kommentar


              • #8
                Wie gesagt du musst natürlich ein Script haben was die Datenbank auf dem Stand des Dateisystems hält. Also alle Aktionen auf dem Dateisystem in die Datenbank spiegelt. Das müsste dann auch zwingend vor der Ausgabe durchlaufen.
                Die Frage ist natürlich wie performant die ganz Sache tatsächlich sein muss bzw. von wie vielen Datensätzen wir insgesamt spreche.

                Kommentar


                • #9
                  Naja nochmal einen extra Script der theoretisch sekündlich die Datenbank mit den Bildern abgleichen muss, ist, wie soll ich sagen, mehr schlecht als Recht. Für Anfängerniveau vielleicht noch akzeptabel im Gewissen Maße, aber für ein größeres Projekt bestimmt nicht brauchbar.
                  - Laravel

                  Kommentar


                  • #10
                    Natürlich nicht weil es nicht performant ist das Script jedes mal laufen zu lassen. Allerdings muss das Script nicht sekündlich laufen, es wird ja nicht sekündlich auf die Daten zugegriffen.

                    Ich würde vermutlich einfach alle Dateinamen im Verzeichnis zu einem String verknüpfen und als sha1 hash in die Datenbank speichern. Vor jeder Ausgabe würde ich den aktuellen sha1 String hash mit dem gespeicherten vergleichen hat sich also etwas auf dem Dateisystem geändert, hat sich auch der Hash geändert und das Updatescript wird vor der Ausgabe ausgeführt.

                    Eigentlich dürfte es dann zu keiner Inkonsistenz kommen.

                    Kommentar


                    • #11
                      Zitat von TessaKavanagh Beitrag anzeigen
                      Datei Upload per FTP -> automatische Erstellung der Datenbankeinträge auf Basis des Dateisystems -> Ausgabe des Datenbankinhaltes beim Aufruf durch den Nutzer -> Veränderung durch Nutzer beim Absenden des Formulars -> Änderung in der Datenbank Speichern -> ggf. Änderung z.B. löschen der Daten im Dateisystem

                      Die "Tabellen" würde ich mir dabei nach Schema F aus der Ordnerstruktur des Parent Directory automatisch erstellen lassen. Ein Ordner entspricht also einem Projekt. Die Einträge z.B. Namen der Bilder entsprechend aus dem Dateinamen. Hierdurch wäre eine automatische Zuordnung zu dem jeweiligen Projekt m.E. simpler als durch einen projektspezifischen Schlüssel in einer einzigen Tabelle, da ja jede Tabelle nur Einträge zu einem spezifischen Projekt enthält.

                      Dann legst du dir eine Primärtabelle an aus der dein Script bei der Ausgabe die Projektarchitektur mittels Sekundärschlüssel nachvollziehen kann. Das ganze müsste dann eigentlich ohne personellen Eingriff in die MySQL Datenbank dynamisch erweiterbar bzw. verkleinerbar sein.
                      Ganz genauso hab ich das auch geplant.
                      Mir kommt dabei zu gute, dass es kein riesen Projekt ist, von daher ist das der beste Weg.

                      Mittlerweile habe ich eine Datenbank erstellt, mit den Spalten Bildname|Checkbox|Anmerkungen|Zeitstempel

                      Der Bildname wird aus dem Dateisystem in ein Array gepackt und so für den Eintrag in die Datenbank und zur Ausgabe des background-images genutzt.
                      Das funktioniert soweit auch super.
                      Jetzt sitze ich daran den Checkboxstatus zu hinterlegen. Danach bekommt jedes "Bild" noch ein Textfeld mit Anmerkungen die auch in der db gespeichert werden und einen Zeitstempel und dann sind die Anforderungen erfüllt.
                      EDIT: das ganze läuft ja zB auch ohne Upload Script, wird alles manuell über den FTP laufen. Und wenn man da ein Bild überschreibt hat man das entweder gewollt oder pech gehabt.

                      Kommentar


                      • #12
                        Zitat von TessaKavanagh Beitrag anzeigen
                        Natürlich nicht weil es nicht performant ist das Script jedes mal laufen zu lassen. Allerdings muss das Script nicht sekündlich laufen, es wird ja nicht sekündlich auf die Daten zugegriffen.

                        Ich würde vermutlich einfach alle Dateinamen im Verzeichnis zu einem String verknüpfen und als sha1 hash in die Datenbank speichern. Vor jeder Ausgabe würde ich den aktuellen sha1 String hash mit dem gespeicherten vergleichen hat sich also etwas auf dem Dateisystem geändert, hat sich auch der Hash geändert und das Updatescript wird vor der Ausgabe ausgeführt.

                        Eigentlich dürfte es dann zu keiner Inkonsistenz kommen.
                        So klingt das schon wesentlich besser als zuvor, mit so einer Lösung bin ich Einverstanden :P
                        - Laravel

                        Kommentar


                        • #13
                          Dann bin ich glücklich

                          Kommentar

                          Lädt...
                          X