Problem beim löschen mehrere Dateien per Checkbox!
Gironymus
- php
Hi euch allen!
In den letzten Tagen hab ich ein Script geschrieben mit dem der User dann Smilies hochladen und auch wieder löschen kann.
Das ganze Script funktioniert soweit eigentlich ganz gut, bis auf die Lösch-Funktion.
Neben jedem Smilie erscheint bei der Ausgabe eine Checkbox und wenn man diese anklickt und auf Speichern klickt, wird dieser Smilie auch gelöscht. Das Problem tritt halt erst auf, wenn der User mehrere Smilies gleichzeitig löschen will. Dann wird nämlich, logischerweise bei dem Quelltext, dennoch nur ein Smilie gelöscht.
Hier der Abschnitt für das Löschen:
if(($action == "view") && (isset($delete)) && ($active == "1")) {
$resulttest = $db->query("SELECT smiliename FROM bb".$n."_smilies_own WHERE smilieid='$delete' AND userid='$wbbuserdata[userid]'");
while($row =$db->fetch_array($resulttest))
$smiliename = $row['smiliename'];
$db->query("DELETE FROM bb".$n."_smilies_own WHERE smilieid='$delete' AND userid='$wbbuserdata[userid]'");
$result4 = $db->query("SELECT * FROM bb".$n."_smilies_own WHERE userid='$wbbuserdata[userid]'");
while($row = mysql_fetch_row($result4)) {
$smilieid = $row['0'];
$name = $row['2'];
$kuerzelanzeige = $row['3'];
$anzeigesmilies .= "<img src="$imagedir$name"> $kuerzelanzeige<INPUT TYPE="checkbox" NAME="delete" VALUE="$smilieid"><smallfont>Häkchen setzen um Smilie zu löschen</font><br>";
}
@unlink("images/smilies/own/$smiliename");
--$anzahlsmilies;
++$nochfrei;
}
Die Zeilen für das Löschen einfach in die While einzubinden geht leider nicht, da dann die Anzeige nicht direkt aktualisiert wird.
Hat von euch jemand eine Idee wie man das sinnvoll lösen könnte?
Ach ja, nicht lachen wegen dem Stil. Bin erst seid knapp 2 Wochen PHP am lernen.
MfG
Giro
1. Smilies aus DB auslesen und folgende Syntax für das Input-Feld benutzen:
<INPUT TYPE="checkbox" NAME="delete[]" VALUE="".$smilieid."">
Entscheidend ist die eckige Klammer im Feldnamen. Dadurch erzeugt PHP ein Array auf das du mit $_POST[delete][<id>] zugreifen kannst.
2. Nach dem Absenden
2.1. Auf das Array $delete mittels for-Schleife oder foreach zugreifen
2.2. In jedem Durchlauf Bild löschen und
2.3. SQL-String zusammen bauen (Damit du nur eine Abfrage benötigst
3. Fertig
Tipp: Überprüfe beim Auslesen der Smilies aus der DB, ob das Bild noch existiert. Falls nicht, dann lösch den Eintrag aus der DB. Damit verhinderst du Dump in deiner Datenbank.
Hallo,
so in etwa hatte ich mir das auch gedacht, aber irgendwie nie hinbekommen.
Nach langem testen und ausprobieren hab ich es dann so gemacht wie oben zu sehen.
Das Problem ist jetzt, dass es so nur mit der Anzeige klappt, wenn ich die Datei nach der while lösche und den DB-Eintrag vor der while.
Würde ich jetzt eine for-Schleife nehmen, müsste ich mir wieder eine Lösung für das Anzeigen einfallen lassen.
Wenn ich meinem momentan Code einfach nur in eine for-Schleife einbaue, zeigt er mir nach dem abschicken ja die übrigen Smilies direkt mehrfach an, je nachdem wie oft die Schleift durchlaufen wurde.
Fazit: Würde ich das so machen, würde es bestimmt mit dem löschen funktionieren, aber dann stehe ich wieder vor dem Problem der Anzeige nach dem Löschen.
Könntest Du mir eventuell damit auf die Sprünge helfen, bin ja wie gesagt noch nicht lange dran an PHP und steck da irgendwie in einer Zwickmühle. :D
MfG
Giro
Ich verstehe dein Problem nicht ganz. Im einfachsten Fall hast du zwei Funktionen. Eine, die dir die Smilies und das Formular ausgibt und eine Funktion, mit der du die Formulardaten verarbeitest. Beide Funktionen haben ausser dem Formular nichts gemein. Um die verarbeitende Funktion auszuführen, überprüfst du ob das Formular überhaupt abgesendet wurde (beim ersten Aufrufen der Seite ja nicht der Fall). Erst wenn das Formular gesendet wurde, wird zuerst die verarbeitende Funktion ausgeführt, welche die Einträge löscht. Danach kommt die anzeigende Funktion, welche stur die Daten abruft - nur, dass eben die verarbeitende Funktion vorher Daten gelöscht hat.
Du solltest dir angewöhnen Funktionalitäten zu trennen. Und zwar so, dass sie weitgehend unabhängig sind. Diese Funktionen kannst du dann in einer Hierarchie anwenden, um die Aufgabe zu lösen.
Bei komplexeren Aufgaben geht man normalerweise zur objektorientieren Programmierung über, was sich in deinem Fall natürlich nicht lohnt. Aber du solltest dich zeitig mit Objektorientierung anfreunden, damit du nicht wie viele Skriptkiddies im sinnlosen I-Code-What-I´m-Currently-Thinking versumpfst. Im extremen Fall hast du in deiner angezeigten PHP-Datei nur noch zwei Zeilen stehen: Nämlich der include der Mutterklasse und das Erzeugen der Instanz der Mutterklasse.