tutorials.de Buch-Aktion 02/2012
ERLEDIGT
NEIN
ANTWORTEN
13
ZUGRIFFE
1359
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    ilmer ilmer ist offline Rookie
    Registriert seit
    Jan 2009
    Beiträge
    7
    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 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!!
     

  2. #2
    Fide Fide ist offline Mitglied Bronze
    Registriert seit
    Jan 2009
    Beiträge
    49
    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 '%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
     

  3. #3
    ilmer ilmer ist offline Rookie
    Registriert seit
    Jan 2009
    Beiträge
    7
    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!
     

  4. #4
    koctja koctja ist offline Rookie
    Registriert seit
    Dec 2008
    Beiträge
    7
    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
     

  5. #5
    Fide Fide ist offline Mitglied Bronze
    Registriert seit
    Jan 2009
    Beiträge
    49
    Also, wenn du das Bild direkt beim Löschen des Beitrages entfernen willst, dann weisst du ja in dem Moment noch den Link, also:
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    
    // 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.
    Geändert von Fide (04.01.09 um 14:59 Uhr)
     

  6. #6
    ilmer ilmer ist offline Rookie
    Registriert seit
    Jan 2009
    Beiträge
    7
    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?
     

  7. #7
    Fide Fide ist offline Mitglied Bronze
    Registriert seit
    Jan 2009
    Beiträge
    49
    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.
     

  8. #8
    ilmer ilmer ist offline Rookie
    Registriert seit
    Jan 2009
    Beiträge
    7
    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!
     

  9. #9
    Back2toxic Back2toxic ist offline Mitglied Gold
    Registriert seit
    Aug 2007
    Ort
    Pfalz
    Beiträge
    219
    Naja, wie schon gesagt wurde.

    Erst alle Bilder im Image-Ordner auslesen, dann eine kleine MySQL-Abfrage im Stil von
    Code :
    1
    
    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
     

  10. #10
    ilmer ilmer ist offline Rookie
    Registriert seit
    Jan 2009
    Beiträge
    7
    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.
     

  11. #11
    Avatar von pHyro
    pHyro pHyro ist offline bla
    Registriert seit
    Mar 2007
    Ort
    Wolfenbüttel
    Beiträge
    112
    Hiho,

    du könntest per readdir() die Datein aus deinem Bilderverzeichnis auslesen und in einer while-Schleife dann oben genannten SQL-Code benutzen. Dann prüfst du ob nach der Abfrage mysql_num_rows() 0 ergibt. Falls Ja, löschst du das Bild per unlink(), falls Nein, lässt du es einfach da

    PHP-Code:
    mysql_connect("localhost""name""passwort"); // MySQL-Verbindung herstellen
    mysql_select_db("datenbank");

    $pfad opendir("pics"); // Bild-Verzeichnis öffnen
    chdir("pics"); // ins Bild-Verzeichnis wechseln
    while($bild readdir($pfad)) { // Datein auslesen
        
    if(is_file($bild)) { // . und .. ausschließen
            
    $query mysql_query("SELECT * FROM tabelle WHERE text LIKE '%http://meineurl.de/pics/$bild%'"); // MySQL-Abfrage
            
    if(mysql_num_rows($query) == 0) { // Bild im Beitrag vorhanden?
                
    unlink($bild); // Wenn Nein, löschen
            
    }
        }
    }

    closedir($pfad);
    mysql_close(); 
    ACHTUNG: Wenn sich noch andere Dateien in dem Ordner befinden und nicht in einem Beitrag verlinkt sind würden die auch gelöscht werden! Das könnte man verhindern indem man anstatt is_file() den MIME-Typ prüft.


    Bei einigen Tausend Datein, wie du sagst, kann das schon ein Weilchen dauern

    Lg
    Geändert von pHyro (18.01.09 um 22:41 Uhr)
     

  12. #12
    ilmer ilmer ist offline Rookie
    Registriert seit
    Jan 2009
    Beiträge
    7
    Also das pass ich dann ein bisschen an, und leg die Datei in den Imageordner, und sobald ich die aufrufe sollten die Bilder die nicht mehr vorhanden sind vom server gelöscht werden? Leider ist da noch eine .htaccess Datei in dem Ordner! Wird diese auch gelöscht dadurch?
     

  13. #13
    Avatar von pHyro
    pHyro pHyro ist offline bla
    Registriert seit
    Mar 2007
    Ort
    Wolfenbüttel
    Beiträge
    112
    Hiho,

    PHP-Code:
    mysql_connect("localhost""name""passwort"); // MySQL-Verbindung herstellen DATEN ANPASSEN
    mysql_select_db("datenbank"); // Datenbank auswählen DATEN ANPASSEN

    $pfad "pics"// VERZEICHNIS ANPASSEN
    $dir opendir($pfad); // Bild-Verzeichnis öffnen
    chdir($pfad); // ins Bild-Verzeichnis wechseln
    while($bild readdir($dir)) { // Datein auslesen 
        
    if(is_file($bild) and $bild != ".htaccess") { // . und .. ausschließen 
            
    $query mysql_query("SELECT * FROM tabelle WHERE text LIKE '%http://meineurl.de/$pfad/$bild%'"); // MySQL-Abfrage DATEN + URL ANPASSEN
            
    if(mysql_num_rows($query) == 0) { // Bild im Beitrag vorhanden? 
                
    unlink($bild); // Wenn Nein, löschen 
            

        } 


    closedir($dir); 
    mysql_close(); 
    damit schließt du dann die .htaccess aus. Die Datei in der der Code steht würde im Verzeichnis über deinem Bilderverzeichnis sein. In meinem Beispiel heißt der Bilder-Ordner "pics", was du dann auch noch anpassen müsstest Hab mal dazugeschrieben was du alles anpassen müsstest und den Code etwas angeändert.

    Lg
    Geändert von pHyro (22.01.09 um 12:51 Uhr)
     

  14. #14
    ilmer ilmer ist offline Rookie
    Registriert seit
    Jan 2009
    Beiträge
    7
    Also erstmal danke für die ganze Hilfe! Sowas erlebt man echt selten in einem Forum, das einem so direkt geholfen wird! Einfach super Leute! Ich werde das ganze morgen mal testen, und sage euch dann bescheid!

    Ps: Die Datei wird schon beim Aufruf direkt ausgeführt, so wie ich das sehe. ich denke dann kann ich die ab und zu mit einem Cronjob automatisch aufrufen lassen, und dann brauch ich mich nicht mehr darum zu kümmern!

    Danke nochmal und weiter so, echt super Forum!!
     

Ähnliche Themen

  1. Ersatzbild wenn kein Bild vorhanden
    Von thommy1972 im Forum PHP
    Antworten: 3
    Letzter Beitrag: 10.10.10, 11:31
  2. Datensatz löschen, wenn in einer anderen Tabelle nicht vorhanden
    Von port29 im Forum Relationale Datenbanksysteme
    Antworten: 1
    Letzter Beitrag: 15.08.10, 03:16
  3. wenn bild nicht vorhanden, anderes anzeigen.
    Von ciberjoerg im Forum PHP
    Antworten: 3
    Letzter Beitrag: 11.12.08, 16:17
  4. Antworten: 4
    Letzter Beitrag: 12.12.04, 13:22
  5. Antworten: 4
    Letzter Beitrag: 05.02.04, 17:51