PHP Trouver les fichier non utiliser par ma base de donnee

willpower
WRInaute discret
WRInaute discret
 
Messages: 208
Inscription: 15 Mar 2007

PHP Trouver les fichier non utiliser par ma base de donnee

Message le Mar Juil 14, 2009 20:13

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: Tout sélectionner
<?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


5_legs
WRInaute passionné
WRInaute passionné
 
Messages: 2072
Inscription: 30 Avr 2006

Re: PHP Trouver les fichier non utiliser par ma base de donnee

Message le Mar Juil 14, 2009 20:31

Bonsoir,

Peut-être avec quelque chose du style 'NOT IN(SELECT...)'

dmathieu
Modérateur
Modérateur
 
Messages: 7244
Inscription: 9 Jan 2004

Re: PHP Trouver les fichier non utiliser par ma base de donnee

Message le Mar Juil 14, 2009 21:34

Je n'ai pas regardé en détail ton code. Mais voici comment je procèderai :

Code: Tout sélectionner
$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.


UsagiYojimbo
WRInaute accro
WRInaute accro
 
Messages: 8576
Inscription: 23 Nov 2005

Re: PHP Trouver les fichier non utiliser par ma base de donnee

Message le Mar Juil 14, 2009 21:55

Et on pourrait optimiser ça en utilisant glob pour le listage des fichiers contenus dans le répertoire.

willpower
WRInaute discret
WRInaute discret
 
Messages: 208
Inscription: 15 Mar 2007

Re: PHP Trouver les fichier non utiliser par ma base de donnee

Message le Mer Juil 15, 2009 2:00

kazhar a écrit:Je n'ai pas regardé en détail ton code. Mais voici comment je procèderai :

Code: Tout sélectionner
$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: Tout sélectionner
<?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: Tout sélectionner
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?


KOogar
WRInaute accro
WRInaute accro
 
Messages: 3974
Inscription: 16 Nov 2004

Re: PHP Trouver les fichier non utiliser par ma base de donnee

Message le Mer Juil 15, 2009 7:35

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...


ortolojf
WRInaute passionné
WRInaute passionné
 
Messages: 1674
Inscription: 14 Aoû 2002

Re: PHP Trouver les fichier non utiliser par ma base de donnee

Message le Mer Juil 15, 2009 10:17

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
Dernière édition par ortolojf le Mer Juil 15, 2009 10:45, édité 1 fois.


ortolojf
WRInaute passionné
WRInaute passionné
 
Messages: 1674
Inscription: 14 Aoû 2002

Re: PHP Trouver les fichier non utiliser par ma base de donnee

Message le Mer Juil 15, 2009 10:22

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


Si vous avez aimé cette discussion, partagez-la sur vos réseaux sociaux préférés :

Lectures recommandées sur ce thème :

Consultez la description détaillée des produits ou services de Google suivants : Google Base, Google Ride Finder

  • Suggestions de mots-clés
    Cet outil vous fournit une liste de mots sémantiquement proches du mot que vous fournissez en entrée. Il peut servir à vous donner des idées de mots à utiliser sur vos pages, voire de contenus à ajouter.
  • Test du code HTTP d'une page
    Cet outil vous permet de connaître le code HTTP renvoyé par le serveur pour une page donnée.
  • Suggestions Google Suggest
    Cet outil vous permet d'obtenir une liste de 10 mots ou expressions suggérés par Google sur la base d'un mot que vous fournissez.


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités