Prüfen ob Link-Bild vorhanden ist, wenn nicht Bild auf Server löschen?

ilmer

Grünschnabel
Hallo!

Ich arbeite gerade an einem Imagehosting Script für mein Forum. Damit können User Bilder uploaden und ins Forum stellen. Jetzt möchte ich das wenn der Forum Beitrag in dem ein Bild zum Imagehoster vorhanden ist, gelöscht wird, das auch das Bild auf dem Server gelöscht wird.

Ich dachte jetzt daran das wie folgt zu machen. Ich bastle mir eine PHP Datei, die die Tabelle posts_message mit den vorhandenen Bildern auf dem Server, in der Tabelle abgleicht oder so. Ich bin nicht gerda der Php/MSQL Freak, deswegen weis ich auch garnicht ob das überhaupt geht.

Der Link sieht immer so aus http://www.meineurl.de/img/lalala.gif

Kann man das dann so machen das er prüft in der Tabelle ob dieser Link vorhanden ist, und wenn er das nicht ist, dann das Bild lalala.gif auf dem server löscht! Wahrscheinlich müsste ich dann für jedes Bild erst eine TXT Liste erstellen lassen oder so. Wie gesagt ich habe nicht viel Ahnung davon. Ich hoffe ihr könnt mir hier helfen, denn der Speicher wird immer größer.......

DANKEEEEEEEE!!
 
Hi,
bei SQL kannst du ja auch gucken ob ein Feld z.B. die Zeichenkette "www.meineurl.de/img/lalala.gif" enthält:
"SELECT * FROM tabelle WHERE feld LIKE '%http://www.meineurl.de/img/lalala.gif%'; "
(die "%" stehen dabei dafür, dass da noch was vor oder hinter stehen kann)

Dann würdest du in PHP nachdem du den Befehl abgesetzt hast einfach abfragen ob die Anfrage dir "0" Datensätze geliefert hat (der Link kommt also nicht mehr vor).
Und dann könntest du mit "unlink ( string $filename )" das Bild zu dem Link löschen lassen.

Ich hoffe das hilft dir weiter.

mfg.Fide
 
Hmm, ich blick da leider nich ganz durch! :( In der Tabelle suchen ob ein Link vorhanden ist oder nicht, das versteh ich ja eher noch. Aber, ich kann ja nicht jedes Bild das auf dem Server liegt einzeln nehmen, dann die Datenbank abfragen ob es noch vorhanden ist.

Ich muss das ja so machen das von den paar 1000 Bildern die auf dem Server liegen automatisch das richtige rausgesucht, und gelöscht wird. Eben genau das, das in der Datenbank nicht mehr vorhanden ist.

Aber wie soll ich das anstellen? Mal ein Beispiel:

1) User schreibt einen Thread im Forum, mit einem Bild das er auf den Imagehoster gehostet hat.
2) Irgendwann löscht ein Moderator dann diesen Thread, somit wird das Bild auf dem Server nicht mehr gebraucht, und kann also gelöscht werden.

Theoretisch ganz einfach, aber fürs praktische bin ich leider noch zu dumm. Ich wäre dir oder jeamand anderen SEHR dankbar für ein kleines Beispiel! :-(
 
Hallo,

erstmal eine Frage: Willst du die Bilder beim Löschen eines Beitrags entfernen oder willst du die bereits vorhandenen Bilder zu den bereits gelöschten Beiträgen löschen?

MfG koctja
 
Also, wenn du das Bild direkt beim Löschen des Beitrages entfernen willst, dann weisst du ja in dem Moment noch den Link, also:
http://www.meineurl.de/img/lalala.gif

Auf diese Url kannst du dann einfach eine Funktion anwenden um die Zeichenkette zu zerlegen, so dass du nur noch "lalala.gif" hast.
Dieser Name sollte ja bei dir auf dem Server auch nur einmal für ein Bild verwendet worden sein und somit kannst du dann genau das Bild löschen.

Code:
// hier sollte natürlich später der Beitrag der gelöscht werden soll stehen
$beitrag = "Dies ist ein Test Beitrag in dem ein Bild-Link vorkommt der zu einem Bild auf dem Server gehört: [ IMG]www.meineurl.de/img/lalala.gif[ /IMG] und ein Bild-Link der nicht zu mir gehört: [ IMG]www.fremdeurl.de/img/test.jpg[ /IMG]";

// es wurde auf löschen geklickt
if ( $_REQUEST['del'] )
{
    // bei dem Filter ist auch mit drin, dass der User mal den IMG-Tag groß oder klein schreibt, also [ ImG] würde auch erkannt
    $filter = "/\[[Ii]{1}[Mm]{1}[Gg]{1}\]www.meineurl.de\/img\/(.*?)\[\/[Ii]{1}[Mm]{1}[Gg]{1}\]/";
    preg_match_all( $filter, $beitrag, $bilder );
    
    // nun sind in $bilder[1][0], $bilder[1][1] und so weiter die ganzen Bildernamen drin die auf dem eigenen Server liegen
    foreach( $bilder[1] AS $bildername )
    {
        // hier wird nun überprüft ob $bildernamen noch in irgendeinem anderem Post vorkommt
        $sql = "SELECT * FROM tabellenname WHERE feldname LIKE '%$bildername%'; ";
        
        // ich gehe davon aus, dass die Datenbankverbindung schon offen ist und unter $con erreichbar ist
        mysql_query( $sql, $con );
        $anzahl = mysql_affected_rows();
        
        // Bilder werden gelöscht, wenn sie nirgendwo mehr vorkommen (der Beitrag muss hier vor schon gelöscht sein, sonst muss $anzahl == 1 damit man löscht)
        if( $anzahl == 0 )
        {
            unlink( $bildername ); // hier muss auch noch der Pfad mit rein
        }
    } // foreach( ... )
} // if( $_REQUEST['del'] )

-----------------------------------------------------------------------------------------------------

Andere Sache wenn du Bilder löschen willst wo der Beitrag schon vor langer Zeit zu gelöscht wurde. Dann musst du erstmal von einem Skript einlesen lassen welche Namen es so für die Bilder gibt und dann suchen ob es einen dieser Namen nicht mehr in der Datenbank gibt.
 
Zuletzt bearbeitet:
Also erstmal rießen Dank für deine Hilfe Fide! Soll ich dieses Script (ich weis das ich es noch anpassen muss, z.b $_REQUEST['del'], $beitrag us.w...) dann einfach in die Forum .PHP Datei einbauen, da wo ich die Beiträge der User lösche?
 
Ja das ist dann praktisch ein Teil deines Löschprozesses. Kurz nachdem du den Beitrag den du löschen willst dann in $beitrag geladen hast würde ich den Beitrag dann aus der DB löschen und mit meinem Skript da weiter machen.
Weil es bei "if( $anzahl == 0 )" einfach logischer ist wenn man auf keine vorhandenen abfragt. Wenn man den Beitrag erst nach dem Skript löschen würde müsste da ja eine Abfrage auf "1" kommen und das ist schon wieder nicht so sprechend.
 
Hallo, ich habe leider was dummes vergessen zu sagen. Sehr sehr viele Threads wurden bereits gelöscht, also funktioniert das somit leider nicht! Man müsste also irgendwie prüfen können ob die Bilder die auf dem Server liegen, noch in der MYSQL Datenbank/Tabelle vorhanden sind.

Und zwar dachte ich daran das über ein eigenes PHP Script zu machen ala:

Bilder prüfen:

Hier haben Sie die Möglichkeit nicht mehr existierende Bilder automatisch vom Server zu löschen!

Klicken Sie [HIER] um alle Bilder vom Server zu löschen, die in der Tabelle post_messages nicht mehr vorhanden sind.

Theroetisch ganz einfach, aber wie setz ich das ins praktische um? Ich wär euch sehr dankbar, wenn ihr mir da ein weiteres mal helfen könntet!

Auf jedenfall die Lösung von Fide ist schon mal sehr gut, wenn man z.b mit seinem Forum neu anfängt, und noch keine Threads hat, dann würde das super funktionieren! Nur leider für mich so nicht ganz sinnvoll!
 
Naja, wie schon gesagt wurde.

Erst alle Bilder im Image-Ordner auslesen, dann eine kleine MySQL-Abfrage im Stil von
Code:
SELECT * FROM table WHERE post-text LIKE %bildname%
und die Bildnamen, die nicht gefunden wurden speicherst du in ein Array.
Nachdem die ganzen DB-Abfragen dann fertig sind löschst du einfach die Dateien im Array, Fertig.

Nicht performant, aber funktionstüchtig.

Sobald das erledigt ist kannst du die Bilder ja denn auch immer direkt beim Löschen des Posts mitlöschen.

Nicht vergessen: vor so Aktionen immer Backups ziehen, sowohl von Datenbank als auch von betroffenen Verzeichnissen.

Grüßle
 
Danke für die Hilfe! Leider habe ich aber große Probleme sowas umzusetzen wenn es um MYSQL u.s.w geht. Davon hab ich leider nicht so viel Ahnung. Mein Imagehosting Script basiert nur auf PHP, damit komm ich halwegs zurecht.

Um nicht den Eindruck zu erwecken, das ich zu faul wäre, oder sowas, ich habe jetzt schon ein paar Stunden damit verbracht, ohne Ergebniss.
 
Zurück