Avatar billede gr8m8 Novice
10. oktober 2012 - 11:52 Der er 20 kommentarer og
1 løsning

Slet alle billeder hvis navn IKKE er i tabellen.

Hej Eksperter.

Jeg har et par Prestashop webshops kørende og der ligger virkelig mange billeder som ikke længere er i brug.
Er der nogen der har et script eller kan være behjælpelig med et, som kan slette alle de billeder hvis navn IKKE er i en given tabel?

Sådan noget her, bare omsat til kode :-)

SLET alle .jpg FRA dir /img/p/ HVOR filnavn IKKE er i table ps_image_lang KOLONNE legend

Håber der er nogen der kan hjælpe eller henvise til nogen der kan noget lignende. Eks. noget software der kan slette alle billeder der ikke har et navn der matcher en liste.
Avatar billede majbom Novice
10. oktober 2012 - 12:11 #1
Kan du kode php og mysql-queries selv?
Avatar billede gr8m8 Novice
10. oktober 2012 - 13:13 #2
Desværre ikke fra bunden af :-/

Jeg kan dog ofte sætte noget sammen ved hjælp af brudstykker og google :-)
Avatar billede stalle Nybegynder
10. oktober 2012 - 13:14 #3
Jeg skal ærligt indrømme, at det er noget der er kastet meget hurtigt sammen, og det er ikke testet, men umiddelbart vil jeg mene du kan gøre noget i stil med det her:


<?php

mysql_connect("localhost", "mysql_user", "mysql_password") or
    die("Could not connect: " . mysql_error());
mysql_select_db("mydb");

$result = mysql_query("SELECT legend FROM ps_image_lang");

$files_db = mysql_fetch_assoc($result);


$files = readdir("/img/p/");


$diff_filer = array_diff($files,$files_db);

foreach ($$diff_filer as $fil_slettes) {
    unlink("/img/p/".$fil_slettes);
}


?>


Koden starter med at bygge et array med alle filer der er angivet i databasen, i den angivne tabel og kolonne.

Så laves der et array over filer der findes i den mappe du har angivet.

Forskellen på de to findes og kommes i et nyt array.

Dette array indeholder filer der findes på serveren men ikke i databasen.
Filerne bliver så slettet en efter en.

Det forventes med det jeg har lavet, at det der står i databaen er billedefilen og ikke hele stien til billedet.
Er dette tilfældet, vil alle filer blive slettet.
Avatar billede gr8m8 Novice
10. oktober 2012 - 13:27 #4
@stalle

Wow.. tusind tak det ser godt nok fint ud og det vil jeg lige prøve af. Kigger dette script i alle undermapper også? Hvis ikke kan jeg så allernådigst bede dig om at tilføje dette, da billede systemet er lidt specielt i Prestashop? :-)

De data der står i "legend" ser f.eks. sådan her ud: wintv-hvr-1100-1.jpg

Så det skulle være fint, ik?
Avatar billede stalle Nybegynder
10. oktober 2012 - 15:09 #5
Så skal jeg nok lige have lidt mere information omkring hvordan data er i databasen.
Altså hvordan den håndterer disse undermapper etc.

Det jeg har lavet, kigger ikke i undermapper.

Så lidt en idé om hvordan mappe strukturen er for billederne, samt hvordan systemet finder rundt i undermapperne.
Avatar billede gr8m8 Novice
10. oktober 2012 - 16:02 #6
Hmmm.... det lyder kompliceret.

Der skal søges efter billeder i denne mappe: img/p/ samt alle undermapper og så skal der slettes.

I databasen ligger alle navne på produktbilleder i den der hedder: legend i ps_image_lang

Se evt dette screenshot:
http://i49.tinypic.com/6zn23n.jpg

Mappestrukturen er lidt mærkelig og i min ene shop ligger der f.eks. billeder af 1 produkt sådan her:
/img/p/1/6/1/1/1/3/161113-home.jpg

Så som du kan se er der en del undermapper der ligeledes skal kigges igennem. Ved ikke om man kan kode at alle undermapper bare skal tjekkes?

På forhånd tak for dit bidrag.
Avatar billede stalle Nybegynder
10. oktober 2012 - 16:29 #7
Det er nemt nok og finde alle filerne i undermapperne og så slette dem der ikke forekommer i databasen.
"Problemet" er lidt, hvordan sikre vi os, at det er det helt rigtige billede vi sletter

Det jeg mener er:
Hvis vi leder efter billedet 161113-home.jpg der ligger i mappen /img/p/1/6/1/1/1/3/. Så ville vi umiddelbart blot søge efter 161113-home.jpg i databasen.

Findes der en billedefil i databasen der hedder sådan, men hvor filen rent faktisk ligger i en mappe der hedder /img/p/1/16/451/1/1/3/ vil vi ikke spotte dette. Vi får altså ikke slettet filen.

Det er selvfølgelig slet ikke sikkert, at der findes dubletter på den måde, men det er blot for at være sikker

Jeg håber det giver mening det jeg prøver at synliggøre :)
Avatar billede gr8m8 Novice
10. oktober 2012 - 23:45 #8
@stalle

Jeg er desværre ikke helt sikker på jeg er med :-/

Kunne man i stedet for at lede efter dem der er i tabellen, så som udgangspunkt sige at scriptet skal slette ALLE billeder i mappen /img/p/ + ALLE undermapper, MEDMINDRE de har et navn som findes i tabellen ps_image_lang KOLONNE legend ?

Eller er jeg helt ude i skoven? :-D
Avatar billede stalle Nybegynder
11. oktober 2012 - 07:43 #9
Det er netop det jeg ville gøre.

Essensen af #7 er blot, hvorvidt det kan forekomme, at to produkter kan have det samme billede, eller billede af samme navn tilknyttet.

Produkt 1 - coolstuff.jpg ( I mappen: /1/34/2/3/ )
Produkt 2 - coolstuff.jpg ( I mappen: /3/45/7/87/ )

Hvis det kan forekomme, må der være en måde hvorpå systemet holder styr på hvilken undermappe billedet ligger i.

Det er så det jeg eftersøger information omkring.

Enten lader vi begge billeder ligge i det tilfælde, eller også skal vi slette det rigtige :)

Hvis IKKE det forekommer, at flere produkter kan have et billede af samme navn, så er det ikke noget problem.
Avatar billede gr8m8 Novice
11. oktober 2012 - 08:11 #10
Hmmm.... ja det kan jeg selvfølgelig godt se.

Kan det laves sådan at til at starte med lader den dubletter være, men den del kan udkommenteres senere hvis det bliver nødvendigt?

Så kan jeg jo afprøve begge muligheder og se om der er nogen forskel :-)
Avatar billede stalle Nybegynder
11. oktober 2012 - 08:32 #11
Vi kan prøve med det her.
Der er en sektion i midten, hvor vi lige starter med at lave en liste over det, den forventer at slette.
Det må du nok hellere lige tjekke om nu også stemmer overens med det du forventer at slette.


<?php

mysql_connect("localhost", "mysql_user", "mysql_password") or
    die("Could not connect: " . mysql_error());
mysql_select_db("mydb");

$result = mysql_query("SELECT legend FROM ps_image_lang");

$ignore_files_db = mysql_fetch_assoc($result);

DeleteFiles("/img/p/");


function DeleteFiles( $path = '.', $level = 0 ){

    array_push($ignore_files_db, 'cgi-bin', '.', '..')

    $dh = @opendir( $path );
   
    while( false !== ( $file = readdir( $dh ) ) ){
   
        if( !in_array( $file, $ignore_files_db ) ){
         
            if( is_dir( "$path/$file" ) ){
           
              getDirectory( "$path/$file", ($level+1) );
           
            } else {
              //Vi starter lige med at skrive en liste over filer der bliver slettet.
                //Bagefter er det blot at fjerne kommentaren fra unlink($file)
             
              echo "Slettes: $path/$file <br />";

              //unlink("$path/$file");
            }
        }
    }
    closedir( $dh );
}

?>
Avatar billede gr8m8 Novice
11. oktober 2012 - 09:35 #12
@stalle

Jeg får følgende fejl når jeg prøver at køre scriptet:

Parse error: syntax error, unexpected T_VARIABLE in C:\wamp\www\shop\imagedelete.php on line 18
Avatar billede stalle Nybegynder
11. oktober 2012 - 09:48 #13
Ahh, min fejl.
Vi skal lige have adgang til SQL resultatet :)


<?php

mysql_connect("localhost", "mysql_user", "mysql_password") or
    die("Could not connect: " . mysql_error());
mysql_select_db("mydb");

$result = mysql_query("SELECT legend FROM ps_image_lang");

$ignore_files_db = mysql_fetch_assoc($result);

DeleteFiles("/img/p/");


function DeleteFiles( $path = '.', $level = 0 ){

        global $ignore_files_db;
    array_push($ignore_files_db, 'cgi-bin', '.', '..')

    $dh = @opendir( $path );
   
    while( false !== ( $file = readdir( $dh ) ) ){
   
        if( !in_array( $file, $ignore_files_db ) ){
         
            if( is_dir( "$path/$file" ) ){
           
              getDirectory( "$path/$file", ($level+1) );
           
            } else {
              //Vi starter lige med at skrive en liste over filer der bliver slettet.
                //Bagefter er det blot at fjerne kommentaren fra unlink($file)
             
              echo "Slettes: $path/$file <br />";

              //unlink("$path/$file");
            }
        }
    }
    closedir( $dh );
}

?>
Avatar billede gr8m8 Novice
11. oktober 2012 - 09:57 #14
Desværre samme resultat bare på linie 19 i stedet :-)

Parse error: syntax error, unexpected T_VARIABLE in C:\wamp\www\shop\imagedelete.php on line 19
Avatar billede stalle Nybegynder
11. oktober 2012 - 09:59 #15
Ulempen ved ikke testet kode.

Linien med array_push mangler et ; i enden
Avatar billede gr8m8 Novice
11. oktober 2012 - 10:10 #16
Hehe det hjalp :-)

Serveren arbejdede i ca. 45 sec, men der kom ikke noget output. Vil det så sige at den ikke ville have slettet noget?

Jeg vil lige benytte lejligheden til at takke dig tusind gange, det er så stort af dig du vil hjælpe :-)
Avatar billede gr8m8 Novice
16. oktober 2012 - 21:21 #17
Er du helt forsvindet Stalle? :-)
Avatar billede stalle Nybegynder
17. oktober 2012 - 05:02 #18
Hej scum,

Ja, lidt forsvundet var jeg lige. Sidder i Kina i forbindelse med arbejde, så der er lige perioder en gang imellem hvor jeg forsvinder fra jordens overflade :)

Men jeg har prøvet og teste koden jeg har lavet, og kan godt se der er et eller andet galt.
Jeg vil prøve og skrue noget nyt sammen, og så i det mindste få det testet denne gang :)

Jeg vender tilbage.
Avatar billede gr8m8 Novice
17. oktober 2012 - 09:15 #19
@stalle

Det lyder bare helt fantastisk, tusind tak :-)

Rigtig god tur til Kina, fedt at komme sådan et sted hen. Bliver jo helt misundelig ;-)
Avatar billede gr8m8 Novice
04. marts 2016 - 08:54 #20
Lukket
Avatar billede stalle Nybegynder
04. marts 2016 - 10:36 #21
Alright :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester