PHP Trouver les fichier non utiliser par ma base de donnee

WRInaute discret
Hello a tous,

J'essaye d'ecrire un petit script qui m'indiquerait le nom des fichiers image non utiliser par mon site.

J'ai donc une base ou se trouve les infos de mes 3000 items.

Les 2 images que chaque produits devrait avoir son appeler par le numero d'item suivi -01_S.gif et l'autre -01_L.gif

J'ai un dossier images qui lui contients les images. (WOW c'est logiques ca.. :wink: )

Voici donc ce que j'ai ecrit:
Code:
<?php 
$resource = mysql_connect(localhost, XXXXXXX, XXXXXXX);
$db = mysql_select_db(XXXXXXXX, $resource)
or die ("Couldn't select database.");
$db;
// open the current directory by opendir
$handle=opendir(".");

while (($file = readdir($handle))!==false) {
 $compteS = 0;
$compteL = 0;
$sqqql="SELECT * FROM products";  
$answer = mysql_query($sqqql);
while ($answer_data = mysql_fetch_array($answer) ) 
{ 

$model = $answer_data['products_model'];
$imageS = "$model-01_S.gif";
$imageL = "$model-01_L.gif";


if ($file!=$imageS)
echo"";
else
$compteS=$compteS+1; 

if ($file!=$imageL)
echo"";
else
$compteL=$compteL+1;

} 

if ($compteS==0)
echo"Le fichier $file devrait etre supprimer.<br>";
if ($compteL==0)
echo"Le fichier $file devrait etre supprimer.<br>"; 
}
closedir($handle);	
mysql_close($resource2); 
echo"fini";
?>

Mais bon ca maffiche pratiquement tout les fichiers et pourtant certains sont bien dans ma base de donnee.
J'ai surement fait une petite erreur, mais je ne suis pas cappable de la trouver.

Si vous pouvez aider...
Merci
 
WRInaute accro
Je n'ai pas regardé en détail ton code. Mais voici comment je procèderai :

Code:
$query = mysql_query('SELECT product_name FROM product');
$files = array();
$unavailable_files = array();
while ($fetch = mysql_fetch_array($query)) {
        $files[] = $fetch['product_name'];
}

if ($handle = opendir('/path/to/files')) {
    while (false !== ($file = readdir($handle))) {
        if (!in_array($file, $files) $unavailable_files[] = $file;
    }

print_r($unavailable_files);
La variable unavailable files devrait contenir tous tes fichiers.

Que fait-on ?
On crée un premier tableau contenant tous les tableaux (pour n'avoir besoin de faire qu'un seul accès à la bdd).
Puis on parcours tous les fichiers qui existent et si le fichier n'est pas présent dans le premier tableau, on le place dans le tableau unavailable_files, qui contient alors tous les fichiers non représentés dans la base.

Un NOT IN ne fonctionnera pas car si l'élément n'existe pas en bas, il n'y a de toute façon rien à afficher.
 
WRInaute discret
kazhar a dit:
Je n'ai pas regardé en détail ton code. Mais voici comment je procèderai :

Code:
$query = mysql_query('SELECT product_name FROM product');
$files = array();
$unavailable_files = array();
while ($fetch = mysql_fetch_array($query)) {
        $files[] = $fetch['product_name'];
}

if ($handle = opendir('/path/to/files')) {
    while (false !== ($file = readdir($handle))) {
        if (!in_array($file, $files) $unavailable_files[] = $file;
    }

print_r($unavailable_files);
La variable unavailable files devrait contenir tous tes fichiers.

Que fait-on ?
On crée un premier tableau contenant tous les tableaux (pour n'avoir besoin de faire qu'un seul accès à la bdd).
Puis on parcours tous les fichiers qui existent et si le fichier n'est pas présent dans le premier tableau, on le place dans le tableau unavailable_files, qui contient alors tous les fichiers non représentés dans la base.

Un NOT IN ne fonctionnera pas car si l'élément n'existe pas en bas, il n'y a de toute façon rien à afficher.

Merci...mais...ca ne fonctionne pas..et je ne sais trop pourquoi...
Voici donc le code:
Code:
<?php 
$resource2 = mysql_connect(localhost, xxxxx, xxxx);
$db = mysql_select_db(kvd, $resource2)
or die ("Couldn't select database2.");
$db;

$query = mysql_query('SELECT products_model FROM kvd.products');
$files = array();
$unavailable_files = array();
while ($fetch = mysql_fetch_array($query)) {
        $files[] = $fetch['products_model'];
}

if ($handle = opendir('.')) {
    while (false !== ($file = readdir($handle))) {
        if (!in_array($file, $files)) $unavailable_files[] = $file;
    }}

print_r($unavailable_files);
echo "fini";
?>

Ca me liste tout les fichier(meme ceux qui existe dans la bd) en voici une partie:
Code:
Array ( [0] => . [1] => .. [2] => 49SP2.txt [3] => acu.ini [4] => ApolloSQL6.cnt [5] => bbl_upc.dbf [6] => black.gif [7] => bout2.gif [8] => bout3.gif [9] => bout4.gif [10] => boutAER.gif [11] => boutajout.bmp [12] => boutajout.gif [13] => boutCATA.GIF [14] => boutcom.bmp [15] => boutCOM.GIF [16] => boutINFO.GIF [17] => boutleft.bmp [18] => boutleft.gif [19] => boutLOG.GIF [20] => boutmain.bmp [21] => bouton.bmp [22] => boutop.gif [23] => boutop2.gif [24] => bouTPOL.gif [25] => boutPP.gif [26] => bouTRAN.gif [27] => boutSOU.gif [28] => bouTTEK.gif [29] => CD-ROM.txt [30] => ClosedFolder.gif [31] => C_Readme.txt [32] => d13c12.gif [33] => email9c.gif [34] => garan.gif [35] => garant.gif [36] => hiero1.gif [37] => hiero2.gif [38] => hiero3.gif [39] => INST_LOG.TXT [40] => left.gif [41] => License.txt [42] => logo.jpg [43] => mail.gif [44] => mainback.gif [45] => MATUPC.DBF [46] => menularg.bmp [47] => menumed.bmp [48] => menutop.GIF [49] => menutopl.GIF [50] => menutopr.GIF [51] => Minus.gif [52] => OEMSort.txt [53] => OpenFolder.gif [54] => p12c05.gif [55] => p12c13.gif [56] => Page.gif [57] => pageprbu.bmp [58] => pilier.gif [59] => Plus.gif [60] => Sample.jpg [61] => smart.gif [62] => sql.txt [63] => tekbar.gif [64] => TGIFImgB.gif [65] => top.gif [66] => TreeBlank.gif [67] => untitled.bmp [68] => 0101110-01_L.gif [69] => 8725113-01_S.gif [70] => 8725113-01_L.gif [71] => 8720129-01_S.gif [72] => 8720129-01_L.gif [73] => 8709129-01_S.gif [74] => 8709129-01_L.gif [75] => 8709114-01_S.gif [76] => 8709114-01_L.gif [77] => 8707114-01_S.gif [78] => 8707114-01_L.gif [79] => 8702128-01_S.gif [80] => 8702128-01_L.gif [81] => 870060-01_S.gif [82] => 870060-01_L.gif [83] => 72302-01_S.gif [84] => 72302-01_L.gif [85] => 5120129-01_S.gif [86] => 5120129-01_L.gif [87] => 51160-01_S.gif [88] => 51160-01_L.gif [89] => 51150-01_S.gif [90] => 51150-01_L.gif [91] => 0103110-01_L.gif [92] => 0103110-01_S.gif [93] => 0103204-01_L.gif [94] => 0103204-01_S.gif [95] => 0103205-01_L.gif [96] => 0103205-01_S.gif [97] => 0103309-01_L.gif [98] => 0103309-01_S.gif [99] => 0103317-01_L.gif [100] => 0103317-01_S.gif [101] => 0103320-01_L.gif [102] => 0103320-01_S.gif [103] => 0103382-01_L.gif [104] => 0103382-01_S.gif [105] => 0104205-01_L.gif [106] => 0104206-01_L.gif [107] => 0104212-01_L.gif [108] => 0104318-01_L.gif [109] => 0104321-01_L.gif [110] => 0104322-01_L.gif [111] => 0105110-01_L.gif [112] => 0105217-01_L.gif [113] =>

Autre suggestions?
 
WRInaute accro
donne une limite pour voir ce qui se passe sur quelques elements
$query = mysql_query('SELECT products_model FROM kvd.products LIMIT 50');

ensuite fait un print de tes 2 tableaux et compare les
print_r($unavailable_files);
print_r($files);

ca peut venir d'une probleme de majuscule, ou tu as peut-etre oublié un caractere, un espace en trop...
 
WRInaute accro
Bonjour

Je pense... que manifestement le point faible du code, est le procédé utilisé pour identifier les fichiers, en comparant leur noms les uns aux autres.

En d'autres termes, il semblerait que l'instruction if(!in_array($files, $file)) rende toujours true, ce qui indique que les éléments comparés ( == les noms des deux fichiers comparés ) ne sont jamais égaux.

Je serais toi, je ferais une trace du code, en affichant chacuns des noms des deux fichiers comparés en réel, histoire de savoir exactement quels sont les éléments comparés, et où cloche la comparaison.

Problème classique en matière de débuggage de programme...

Peut-être, que le problème serait résolu, en passant chacun des deux noms des fichiers comparés, par la fonction basename() qui rend le nom du fichier sans son chemin, et puis aussi, pour les éléments rendus par la base de données, de bonnes fonctions stripslashes(), car le passage dans la base de données rajoute peut-être des caractère backslash ( \ ) sans que tu le sache.

Evidemment, celà donnerait un problème de ce type:

Au moment de l'affectation de l'array $files :

$files[] = basename(stripslashes($fetch['products_mode']));

Au moment de la lecture du répertoire :

while (false !== ($file = basename(readdir($handle)))) {

}

Il n'y a pas besoin de stripslashes pour la lecture du répertoire, ce n'est pas une bdd.

Bien à vous.

Amicalement.

Jean-François Ortolo
 
WRInaute accro
J'ajoute...

que le code initial est meilleur que celui suggéré après, qui implique une mémorisation dans deux arrays au lieu d'une, donc deux fois plus d'occupation mémoire ( à peu près ).

Le code initial est aussi plus simple, ce qui a ma préférence, heu heu... :oops:
Bien à vous.

Amicalement.

Jean-François Ortolo
 
Discussions similaires
Haut