Supprimer des fichiers avec correspondance dans la BD

Eléphant du PHP | 428 Messages

11 juin 2010, 15:38

Bonjour,

je suis entrain d'essayer de réaliser un buot de code qui permettrait de supprimer des images dans un dossier si elles ne sont pas utilisées dans la base de donnée.

Le problème est que je n'arrive à rien. Soit j'arrive à tout supprimer soit ça ne supprime rien !
Pouvez-vous franchement m'aider sur ce coup là ?

Je suis perdu dans ce que je dois faire.
Comment dire à PHP de supprimer des images qui ne se trouvent pas dans la base de donnée?

Mon principe est le suivant :
1. Connexion à la table photo pour choper différentes infos telles que :
- le nom du dossier utilisateur (ex.: VSKYSLV2QQH7Q5F)
- le chemin et le chemin relatif ...

2. Connexion à la table user pour vérifier si le user existe toujours dans la base. Si il existe plus, on supprime le dossier entier. Sinon, on scanne le répertoire et on vérifie si les images existent dans la table_photo et si elles n'existent pas, on les supprime (c'est ici que ça me pose problème).

Svp, aidez moi, ... :oops:
<?php

// Définition des variables globales
$reldir = '/home/a50/www/temp/nice';

	// Connection à la base de donnée photos Neptune
	$Neptdb = mysql_connect('localhost', 'USER', 'PASS');
	mysql_select_db('a50',$Neptdb); 
	
	$sql_photo = "SELECT photo_grande FROM tbl_photo";
	$req_photo = mysql_query($sql_photo) or die('Erreur SQL !<br>'.$sql_photo.'<br>'.mysql_error());


	while($data = mysql_fetch_assoc($req_photo)) {
	 $url_big = $data['photo_grande'];
	 $dirname=basename(dirname($data['photo_grande']));
	 $glob_path = pathinfo($data['photo_grande']);
	 $path = substr ($glob_path['dirname'], 28);
	 
	 //echo $path.'<br />';
	 
	 // Connexion à la table USER pour vérifier correspondance
	 $sql_Uref = "SELECT user_ref FROM tbl_user WHERE user_ref = '$dirname'";
	 $req_Uref = mysql_query($sql_Uref) or die('Erreur SQL !<br>'.$sql_Uref.'<br>'.mysql_error());
	
	 $nb = mysql_num_rows($req_Uref);
	
	
		if ($nb == 1) {
	   	
			if ($handle = opendir($reldir.'/'.$path)) {
			
				while (false !== ($file = readdir($handle))) {
					
					if ($file != "." && $file != "..") {
					 echo 'FICHIER: '.$file.'<br />';
					 
					 //$test='http://www.150.be/temp/nice/';
 
					 $sql_photo_test = "SELECT photo_grande FROM tbl_photo WHERE photo_grande = '$url_big'";
					 $req_photo_test = mysql_query($sql_photo_test) or die('Erreur SQL !<br>'.$sql_photo_test.'<br>'.mysql_error());
					 
					$nbresult = mysql_num_rows($req_photo_test);
					$datas = mysql_fetch_assoc($req_photo_test);
					$url_found = $datas['photo_grande'];
					
					echo 'URL: '.$url_found.'<br />';
					
					 
						if ($nbresult >= 1) {
						 $pos = strpos($url_found,$file);
							if ($pos === false) {
							 echo "L'image ne se trouve pas dans la liste <br /><br />";
							 unlink($reldir.'/'.$path.'/'.$file);
							} else {
							echo '<font color="red"><b>OK</b></font><br /><br />';
							}
						
						}
					 
					 
					}
					
				}
			 
			 closedir($handle);
			}
	
		}
	}
	
?>

Merci
Modifié en dernier par visualight le 11 juin 2010, 15:57, modifié 1 fois.

ViPHP
ViPHP | 5462 Messages

11 juin 2010, 15:42

utilise file_exists ca va etre plus simple que de parcourir ton dossier

Mammouth du PHP | 672 Messages

11 juin 2010, 16:12

utilise file_exists ca va etre plus simple que de parcourir ton dossier
:shock:
Là, je ne vois pas trop à quoi ça peut servir...

Là comme ça vite fait, j'aurais tendance à :

Code : Tout sélectionner

Lister les images de la table_photo dans un tableau $ImagesTable (avec un mysql_fetch_*) Lister les images du répertoire dans un tableau $ImagesRep (avec un glob par exemple) Supprimer les éléments de $ImagesRep qui se trouvent aussi dans $ImagesTable (avec array_diff) (on ne conserve donc que les images qui sont dans le répertoire mais pas dans la table) Pour chaque élément restant Supprimer le fichier (avec unlink)

ViPHP
ViPHP | 5462 Messages

11 juin 2010, 16:22

ta ton fichier (truc.txt)

toi tu va dans ton repertoire /dossier tu va chercher tout les fichier et le premier qui correspond a truc.txt tu le supprime

avec file_existe tu sais si il existe pour pas
if(file_exists('truc.txt'))
{
    unlink('truc.txt');
}

Mammouth du PHP | 672 Messages

11 juin 2010, 18:00

ta ton fichier (truc.txt)

toi tu va dans ton repertoire /dossier tu va chercher tout les fichier et le premier qui correspond a truc.txt tu le supprime

avec file_existe tu sais si il existe pour pas
if(file_exists('truc.txt'))
{
    unlink('truc.txt');
}
Et comment tu sais qu'il faut aller chercher truc.txt ?
L'objectif, c'est de supprimer les fichier qui ne sont pas dans la BDD. On ne connaît pas a priori les noms...

ViPHP
ViPHP | 5462 Messages

11 juin 2010, 18:09

pourquoi tu les supprimais pas au moment de faire le DELETE ?

sinon suffis de faire une liste de tout tes fichiers sur ton disk, une liste de tout les fichier dans ta base, une nouvelle liste qui compare les 2, et supprimer ceux qui resortent. Ca evitera de faire un requête pour chaque fichier :wink:

Eléphant du PHP | 428 Messages

11 juin 2010, 19:35

Merci pour vos réponses,

J'ai suivi les conseils de macgawel.
Lister les images de la table_photo dans un tableau $ImagesTable (avec un mysql_fetch_*)
Lister les images du répertoire dans un tableau $ImagesRep (avec un glob par exemple)
Supprimer les éléments de $ImagesRep qui se trouvent aussi dans $ImagesTable (avec array_diff)
(on ne conserve donc que les images qui sont dans le répertoire mais pas dans la table)
J'ai fait un truc mais ça ne fonctionne pas ... en effet, tout mes fichiers se suppriment du répertoire lors de l'unlink.
Tous sauf 1 : (test-du-fichier-photo-mademoiselle-liege-maastricht-20081203133641.jpg)

Le contenu de ma table_photo est :

exemple champ : photo_grande (2enregistrements)

Code : Tout sélectionner

http://www.monsite.com/temp/nice/V/V_S/V_S_K/VSKYSLV2QQH7Q5F/test-du-fichier-photo-mademoiselle-liege-maastricht-20081203133641.jpg

Code : Tout sélectionner

http://www.monsite.com/temp/nice/V/V_S/V_S_K/VSKYSLV2QQH7Q5F/test-du-fichier-photo-mademoiselle-liege-maastricht-20081203133632.jpg

Voici le code incriminé :
    // -------------- Variables à modifier
    $reldir = '/home/a50/www/temp/nice';
    

    // -------------- Paramètres globaux
    
    $pictures_table = array();
    $pictures_dir = array();


	// Connection à la base de donnée photos Neptune
	$Neptune_db = mysql_connect('localhost', 'USER', 'PASS');
	mysql_select_db('a50',$Neptune_db); 
	
    // On se connete à la table photo de Nice
	$sql_photo = "SELECT photo_grande, photo_moyenne, photo_petite, photo_viral FROM tbl_photo";
	$req_photo = mysql_query($sql_photo) or die('Erreur SQL !<br>'.$sql_photo.'<br>'.mysql_error());

    // On Boucle sur la Db pour et on stock les images dans un array()
	while($data = mysql_fetch_assoc($req_photo)) {
        //$url_big = $data['photo_grande'];
        //$dirname=basename(dirname($data['photo_grande']));
        $info_grande_pics = pathinfo($data['photo_grande']);
        $info_moyenne_pics = pathinfo($data['photo_moyenne']);
        $info_petite_pics = pathinfo($data['photo_petites']);
        $info_viral_pics = pathinfo($data['photo_viral']);  
        $relpath = substr ($info_grande_pics['dirname'], 28);
        
        array_push($pictures_table, $info_grande_pics['basename'], $info_moyenne_pics['basename'], $info_petite_pics['basename'], $info_viral_pics['basename']);
      
 
            // On scanne le répertoire, on évite les dossier système et on place les fichiers dans un array()
            if ($handle = opendir($reldir.'/'.$relpath)) {
                while (false !== ($file = readdir($handle))) {
                    if ($file != "." && $file != "..") {
                        array_push($pictures_dir, $file);
                    }
                }
            }
            
            closedir($handle);
            
// On supprime les doublons dans l'array
            $Upictures_dir = array_unique($pictures_dir);
// On supprime les fichiers que l'on suohaite au final garder (paradoxe :) )
            $pictures_diff = array_diff($Upictures_dir, $pictures_table);

// Pour chaque fichier restant, on le supprime
                foreach ($pictures_diff as $picture) {
                    unlink($reldir.'/'.$relpath.'/'.$picture);
                }
    }

Si quelqu'un peut vérifier et me dire ce qui cloche, ça serait SUUUPPERRR sympa !
J'ai vraiment besoin d'un coup de main.

Merci,
raph

Mammouth du PHP | 672 Messages

14 juin 2010, 15:48

Avant de faire $pictures_diff = array_diff($Upictures_dir, $pictures_table); tu peux afficher le contenu des deux tables ?
echo "<pre>"; // Pour avoir une belle mise en forme
print_r($Upictures_dir);
print_r($pictures_table);
echo "</pre>";
Pour pouvoir appliquer le array_diff(), il faut que les deux tables aient exactement la même structure...

Eléphant du PHP | 428 Messages

14 juin 2010, 17:52

Problème résolu ...
Voici le code :
<?php
session_start();

   
    /* -------------- Variables à modifier - IMPORTANT
    
    $debug_mode         Activer ou désactiver l'output de débuggage (true / false)
    
    $substr_url         On supprime l'url pour obtenir le chemin
                        Exemple: http://www.monsite.eu/mondossier/V/V_S/V_S_K/...  =  33
                        On supprime donc: http://www.monsite.eu/mondossier/ qui correspond à 33 caractères
                    
    $reldir             Chemin absolu vers le dossier où se situent les dossiers des photos
                        Exemple: si /v/v_k/v_k_s/  est dans /home/monsite/www/ le chemin absolu est : /home/monsite/www
                    
    $db_host            Nom ou ip du serveur de la base de donnée
    $db_DB              Nom de la base de donnée
    $db_user            Nom d'utilisateur pour la base de donnée
    $db_pass            Mot de passe
    $db_table_photo     Nom de la table ou sont contenues les photos
    $db_table_user      Nom de la table utilisateurs                    
    
    */
    
    $debug_mode = 'false';
    $substr_url = 28;
    $reldir = '/home/a50/www/temp/nice';
    $db_host = 'localhost';
    $db_DB = 'DATABASE';
    $db_user = 'LOGIN';
    $db_pass = 'PASSWORD';
    $db_table_photo = 'tbl_photo';
    $db_table_user = 'tbl_user';
    

    
    
    
    
    echo '
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
    <title>Pictures Eraser Tool</title>
    </head>

    <body>';
    
    // Si le champ de limitation SQl est soumis et qu'il n'est pas vide on exécute le code
    if (isset($_GET['limit']) AND !empty($_GET['limit'])) {
        
    
        // -------------- Paramètres globaux
    
        $_SESSION['db_limit'] = $_GET['limit'];
        $pictures_table = array();
        $pictures_dir = array();
  
    
        // -------------- Code
        
	   // Connection à la base de donnée photos Neptune
	   $Neptune_conn = mysql_connect($db_host, $db_user, $db_pass);
	   mysql_select_db($db_DB,$Neptune_conn) or die ('Erreur Connexion DB !<br />'.mysql_error());
       
       $sql_ref_user = "SELECT user_ref FROM $db_table_user LIMIT $_SESSION[db_limit]";
       $req_ref_user = mysql_query($sql_ref_user) or die('Erreur SQL !<br />'.$sql_ref_user.'<br /><br />'.mysql_error());
       
       
       echo '<h1 style="line-height:0px;">Suppression des fichiers en cours ...</h1>
       <span style="font-size:10px;"><a href="'.$_SERVER['PHP_SELF'].'">[RETOUR AU LIMITEUR DE REQUETE SQL]</a></span><br /><br />';
       
       while($userdata = mysql_fetch_assoc($req_ref_user)) {
        
       $ref_user = $userdata['user_ref'];
   

        // On se connecte à la table photo de Nice
	   $sql_photo = "SELECT photo_grande, photo_moyenne, photo_petite, photo_viral FROM $db_table_photo WHERE photo_grande LIKE '%$ref_user%'";
	   $req_photo = mysql_query($sql_photo) or die('Erreur SQL !<br />'.$sql_photo.'<br /><br />'.mysql_error());
       

        // On Boucle sur la Db
	   while($data = mysql_fetch_assoc($req_photo)) {

            // On définis le nom des images par rapport à leur url
            $info_grande_pics = pathinfo($data['photo_grande']);
            $info_moyenne_pics = pathinfo($data['photo_moyenne']);
            $info_petite_pics = pathinfo($data['photo_petite']);
            $info_viral_pics = pathinfo($data['photo_viral']);
            $relpath = substr($info_grande_pics['dirname'], $substr_url);
            
            array_push($pictures_table, $info_grande_pics['basename'], $info_moyenne_pics['basename'], $info_petite_pics['basename'], $info_viral_pics['basename']);
            
            }
            
            echo ' 
            <hr style="color: blue; background-color: blue; height: 1px;"/>
            <h2 style="line-height:0px;"><span style="color:#666666;">REPERTOIRE:</span> '.$relpath.'</h2>';
            
            
                if ($handle = @opendir($reldir.'/'.$relpath)) {
                while (false !== ($file = readdir($handle))) {
                    if ($file != "." && $file != "..") {
                        array_push($pictures_dir, $file);
                    }
                }
            } else {
                echo '<span style="color:red; font-weight:bold;">ERREUR : Le répertoire utilisateur n\'existe pas</span><br />';
            }
            
            @closedir($handle);
            
            $pictures_diff = array_diff($pictures_dir, $pictures_table);
            
            if (!empty($pictures_diff)) {
                foreach ($pictures_diff as $picture) {
                    if (@unlink($reldir.'/'.$relpath.'/'.$picture)) {
                        echo '<p style="color:green; font-weight:bold;">Suppression du fichier: '.$relpath.'/'.$picture.' -- Effectuée</p>';
                    } else {
                        echo '<p style="color:red; font-weight:bold;">Suppression du fichier: '.$relpath.'/'.$picture.' -- ERREUR !</p>';
                    }
                }
                echo '<br />';
                
            } else {
                echo '<span style="color:green; font-weight:bold;">Rien à supprimer</span><br />';
            }
            
                    if ($debug_mode == 'true') {
                    
                        echo '<br /><hr style="color: #CCCCCC; background-color: #CCCCCC; height: 2px;"/>';
                        echo '<h3>MODE DEBBUGAGE - DEBUG OUTPUT ...</h3>';    
                        echo '<span style="font-weight:bold; text-decoration:underline; font-size:14px;">Tableau des images de la table :</span><br />';
                        print_r ($pictures_table);
                        echo '<br /><br />';
     
                        echo '<span style="font-weight:bold; text-decoration:underline; font-size:14px;">Tableau des images du répertoire :</span><br />';
                        print_r ($pictures_dir);
                        echo '<br /><br />';
     
                        echo '<span style="font-weight:bold; text-decoration:underline; font-size:14px;">Différence entre les tableaux précédents :</span><br />';
                        print_r ($pictures_diff);
                        echo '<br /><br />';
                    
                        echo '<span style="font-weight:bold; font-size:18px; color:blue;">Les tableaux ont été vidés !</span>';
                        echo '<br /><br />';
                    }   
            
            
            $pictures_table = array();
            $pictures_dir = array();
        }
        
     } elseif (isset($_GET['action']) AND !empty($_GET['action']) AND $_GET['action'] == 'zero') {
        
        session_unset();
        session_destroy();
        echo '<script type="text/javascript">window.location= "'.$_SERVER['PHP_SELF'].'"</script>';
        
     } else {
                              
        if (!isset($_SESSION['db_limit']) OR empty($_SESSION['db_limit'])) {
            $_SESSION['db_limit'] = '0,0';
        }
            
        echo '
        <div style="width:600px; margin:0px auto; text-align:center;">
        <h1>Pictures Eraser Tool</h1>
        <form id="form1" name="form1" method="get" action="'.$_SERVER['PHP_SELF'].'">
        <label>Entrez une valeur pour la limitation d\'exécution MYSQL<br />
        Exemple : 0,100 - traite les 100 premiers | 100,1 traite le premier à partir du 100ème</label> <br /><br />
        <span style="font-weight:bold; color:green;">VALEUR DE LIMITATION PRECEDENTE: </span><span style="font-weight:bold; font-size:18px; color:red;">'.$_SESSION['db_limit'].'</span> <span style="font-size:10px;margin-left:20px;"><a href="'.$_SERVER['PHP_SELF'].'?action=zero">[Remettre à  Zero]</a></span>
        <br /><br />
        <div style="width:600px; padding:10px; background-color:#FDD;">Avez-vous pensé à configurer ce document avant d\'essayer de supprimer ?</div>
        <br /><br />
        <input type="text" name="limit" id="limit" /><br /><br />
        <input type="submit" value="Lancer la procédure de suppression" />
        </form>
        </div>';
    }