[PHP] Teil einer MySQL-Datenbankspalte löschen

HardwarePope

Cadet 4th Year
Registriert
Feb. 2004
Beiträge
114
Hallo liebe Leute,

ich bin auf ein Problem gestoßen, wo ich bei meinem Skript per Checkboxen alle markierten Bilder löschen will. Die Bilder sind sowohl natürlich auf dem Webspace gespeichert aber die Namen der Bilder sind auch in einer einzigen Datenbankspalte in Form eines Arrays gepeichert das schematisch so aussieht:

Bildname1|Bildname2|Bildname3|Bildname4|Bildname5

Nun kann man in meinem Skript per Checkbox auswählen, welche der vorhandenen Bilder gelöscht werden sollen. Das Skript funktioniert wunderbar, wenn ich jeweils die Dateien auf dem FTP Server löschen will.
Doch nun ist das Problem, dass ich dann natürlich die entsprechenden Bildernamen aus dem Array in der Datenbank löschen möchte. Nehmen wir einmal an, Bild1 und Bild4 wurden markiert. Nun soll Bild1 und Bild4 per ftp_delete gelöscht werden, was wie gesagt auch gut geht. Doch danach soll er die Datenbankspalte so aktualisieren, dass in dem Array natürlich nicht mehr die gerade gelöschten Bildernamen auftauchen.
Also sollte jetzt nach obigen Beispiel die aktualisierte Datenbankspalte so aussehen:

Bildname2|Bildname3|Bildname5

Und dass am Ende dies so in die Datenbank übernommen wird, habe ich bisher immer noch nicht geschaftt.

Mein Skript für das FTP-löschen der Bilder sieht momentan so aus:
PHP:
// $abc ist das Array, wo die aktivierten Checkboxen die zu löschenden Bildernamen posten

$abc = $_POST["pic_delete"];
foreach($abc AS $cba)
  {
    $fp = ftp_connect("SERVER");
    ftp_login($fp, "USER", "PASSWORT");
    ftp_delete($fp, "/folder/$cba.jpg");
    ftp_delete($fp, "/folder/$cba$tb.jpg");
    ftp_close($fp);
  }

In der Hoffnung, dass ihr mir weiterhelfen könnt, bedanke ich mich schon einmal im Voraus für Bemühungen, viele Grüße,


HardwarePope
 
Dass du auf ein solches Problem stößt, liegt schlicht und ergreifend an einem Designfehler in der Datenbankstruktur. Solche Mehrfachbeziehungen müsstest du eigentlich durch eine weitere Datenbanktabelle auflösen. Angenommen dein Eintrag, welcher bisweilen diesen Bilderwert Bild1|Bild2... besitzt hätte den Primärschlüssel (ID) 5. In diesem Falle müsstest du in einer weiteren Tabelle "EintragsBilder" für jedes dem Eintrag zugeordnete Bild jeweils einen Eintrag erzeugen erzeugen:

5|Bild1
5|Bild2
...

Im Betrieb fragst du dann mit einer einfachen Select-Anweisung (SELECT * from EintragsBilder WHERE id = 5) alle Bilder ab, die zum aktuellen Eintrag (in diesem Falle dem mit ID 5) gehören. Und genau bei einem solchen Design hast du dann auch absolut kein Problem, Bildeinträge zu entfernen:

DELETE * FROM EintragsBilder WHERE (id = 5) AND (bild = bild2)

-------------------
Wenn du die Struktur nicht umwerfen willst, musst du halt den "BilderString" aus der Datenbank abfragen, dann per split-Funktion an den |-Zeichen splitten, und die einzelnen (nun-Array)werte durchgehen und die zu löschenden aus dem Array schmeissen. Danach setzt du das Array wieder zum BilderString zusammen und aktualisierst mit ihm die entsprechende Zelle in der DB-Tabelle.
 
Erst mal danke für deine schnelle Antwort. :)

Mir ist durchaus bewusst, dass ich mir das Leben leichter machen könnte, wenn ich einfach eine neue Tabelle für die Bilder erstellen würde. Doch darauf wollte ich - wenn überhaupt - nur im Notfall darauf zurückgreifen.
Denn dies ist Teil meines Skripts um einen Text schreiben zu können und ganz speziell für diesen Text Bilder hochladen zu können. Und sowohl Text als auch Bilder wie noch andere Elemente sollen zusammen in einem Datenbankeintrag enthalten sein.
Gibt es wirklich keine andere Lösung, das so zu machen, dass die Bilder in einem solchen Array in der selben Datenbankspalte gespeichert werden?
 
Schau dir einmal den Befehl str_replace bzw. preg_replace an; damit könntest du das realisieren...
Viel Erfolg! :)
 
Zurück
Oben