[php] Scan de dossiers, sous dossier, et récupération du chemin

Scan de dossiers, sous dossier, et récupération du chemin [php] - PHP - Programmation

Marsh Posté le 25-10-2008 à 19:18:32    

Bonjour a tous.
 
Je suis en train de créer un site, dont une des fonction consiste à offrir aux utilisateurs des résumés pour différents cours. J'ai actuellement un script qui marche bien, mais qui est lent à mettre a jour: je dois rentrer moi même les infos sur un fichier.
Ces infos sont:
- Année
- Section
- Dossier sur le serveur
- Nom du fichier sur le serveur (sans l'extension)
- Extension du fichier
- Date de mise à jour
- Description
- Id (pour trier dans la base de donnée)
- Id du parent dont il dépend (car un fichier dépend toujours d'un autre)
- Type (indique l'importance du fichier)
 
2 mots sur la fonction type, qui peut prendre comme valeurs:
- Section: ce n'est pas un fichier a télécharger, mais bien un titre (genre cours du 20 octobre 2008)
- Seul : C'est le fichier de base (genre les notes du cours)
- Associé: un fichier qui dépend d'un fichier de base (genre les transparents pour ce cours la...)
 
Voici ce que ça donne (j'ai utilisé une image car il faut s'enregistrer pour accéder à ces infos):
 
http://img136.imageshack.us/img136/5306/sanstitreeq8.jpg
http://img136.imageshack.us/img136/sanstitreeq8.jpg/1/w997.png
 
Enfin bref, ça marche très bien, mais c'est lent a mettre a jour.
Ce que j'aurais besoin, c'est d'une fonction qui scanne TOUT les dossiers et fichiers (y compris les sous dossier), et qui renvoi dans une variable le chemin complet de chaque fichier. Vu que chaque dossier est séparé par un slash, je n'aurai cas récupérer les dossiers (en ayant trier mes fichiers de façon judicieuse), les stocker dans des variables appropriées, et remplir ma base de donnée. Je mettrai donc a jour mon site d'un coup, et tout ce que j'ai a faire, c'est rentrer une description. Je pourrais également voir quels fichiers ont été modifiés depuis la dernière fois pour faire une liste des mises à jour....
 
Je précise que je débute en php, et ne m'y connais pas des masses. Je ne m'attend pas a ce que vous me fassier le script tout cru, mais je vous serai reconnaissant de ne pas juste balancer le nom de 2-3 fonction, mais bien d'expliquer un peu.
 
Je vous remercie énormément d'avance.

Reply

Marsh Posté le 25-10-2008 à 19:18:32   

Reply

Marsh Posté le 25-10-2008 à 19:56:54    

le plus propre serait de faire une fonction recursive,quelque chose du genre

Code :
  1. function parcours($chemin)
  2. {
  3.   $dossier= opendir($chemin);  // on ouvre le repertoire
  4.   if(!$dossier)
  5.       return ; //oups , impossible d'ouvrir le repertoire
  6.  
  7.   while($entree= readdir($dossier) )
  8.   {
  9.       if ($entree== "."  ||  $entree == ".." ) // on ne regarde pas . ( lien vers le dossiercourant ) et .. ( lien vers le dossier parent )
  10.            continue;
  11.       $cheminEntree = chemin.'/'.$entree;
  12.       if (is_dir($cheminEntree )) { // on est sur un repertoire
  13.         parcours(cheminEntree ); //on va voir ce que cache ce repertoire
  14.       }
  15.       else
  16.       {
  17.          // on a un fichier faire l'ajout en bdd
  18.       
  19.       }
  20.    }
  21. }
 

edit : nettoyage du code


Message édité par flo850 le 25-10-2008 à 20:02:18
Reply

Marsh Posté le 25-10-2008 à 21:15:24    

Je crois que je comprend ton code, et c'est effectivement exactement ce que je recherche :) Un énorme merci :)
 
Je vais tester cela demain :)

Reply

Marsh Posté le 26-10-2008 à 08:55:05    

de rien  
 
c'est tellement plus agréable de répondreà une question bien posée par qqun de poli  
:jap:

Reply

Marsh Posté le 26-10-2008 à 18:12:52    

Salut :)
 
C'est grandiose! C'est formidable! Ca marche :-) J'ai réussi a faire exactement ce que je voulais, et maintenant, il ne me faut qu'un clic de souris pour mettre a jour tout mon site!!
 
Un énorme merci :)
 
Toutefois, tu avais oublié un dollars à la ligne 11 devant chemin, ainsi qu'a la ligne 13 devant cheminEntree (je précise pour celui qui serait intéressé aussi par ce bout de code)

Reply

Marsh Posté le 26-10-2008 à 18:51:20    

Salut
 
J'ai en fait remarqué un petit bug. Pas trop dérangeant en soit, mais quand même. Quand je fais un listing des fichiers, voici ce que j'obtiens:
 
../../universite//2BAC/analyse/cours/Cours_du_07 octobre_2008/seul/repet071008.pdf
 
../../universite//2BAC/analyse/cours/Cours_du_16 septembre_2008/seul/cours160908.pdf
 
../../universite//2BAC/analyse/cours/Cours_du_23 septembre_2008/seul/repet230908.pdf
 
../../universite//2BAC/analyse/cours/Cours_du_30 septembre_2008/seul/repet300908.pdf
 
../../universite//2BAC/analyse/cours/Répétitions/seul/repetitions.zip
 
../../universite//2BAC/analyse/cours/Résolution_des_répétitions/associe/resolution15.pdf../../universite//2BAC/analyse/cours/Résolution_des_répétitions/associe/resolution610.pdf
../../universite//2BAC/analyse/cours/Résolution_des_répétitions/seul/resolutions.zip
 
../../universite//2BAC/analyse/cours/Transparents_officiels/associe/transparents0.pdf../../universite//2BAC/analyse/cours/Transparents_officiels/associe/transparents1.pdf../../universite//2BAC/analyse/cours/Transparents_officiels/associe/transparents2.pdf../../universite//2BAC/analyse/cours/Transparents_officiels/associe/transparents3.pdf
../../universite//2BAC/analyse/cours/Transparents_officiels/seul/transparents.zip
 
 
../../universite//2BAC/analyse/divers/Errata_du_livre/seul/erreurs.pdf
 
../../universite//2BAC/analyse/divers/Suppléments_au_cours/seul/supplements.zip
 
 
../../universite//2BAC/analyse/examens/Examens_des_années_précédentes/seul/examens.zip
 
 
../../universite//2BAC/analyse/résumés/Chapitre 0/seul/resume0.pdf
 
../../universite//2BAC/analyse/résumés/Chapitre 1/seul/resume1.pdf
 
../../universite//2BAC/analyse/résumés/Formulaire/seul/formulaire.pdf
 
Et quand je vais dans la base de donnée, j'ai ces informations la:
 
id  id_parent  nom  type  type_element  section  annee  dossier  fichier  date  jour  mois  description
 
148       n       i   /   .   u/n/i       18:41:05   26   10/08    
 
Comme tu le constante, rien a voir avec ce que je devrais avoir. CE n'est pas trop dérangeant, car ils ne sont pas affichés, mais au fur et à mesure, ma base de donnée va être un véritable foutoir...
Une idée?


Message édité par Matth002 le 26-10-2008 à 18:51:40
Reply

Marsh Posté le 26-10-2008 à 19:05:25    

il va falloir détailler ce qui ne te vas pas dans les résultats , paerceque là, j'ai pas assez d'éléments ;)
 
tu peux , par exemple , filtrer certains fichiers sur l'extension

Reply

Marsh Posté le 26-10-2008 à 20:51:59    

le problème en fait, c'est ce résultat ci
 
148       n       i   /   .   u/n/i       18:41:05   26   10/08      
 
Bnn, 148, c'est l'id, ok. La date et l'heure, ok aussi. Par contre
n       i   /   .   u/n/i  
est censé correspondre au données tirées du chemin d'accès du fichier, et ça c'est pas bon du tout.
Il y a par ailleurs quelque chose de bizarre. Je fais un test pour compter si un élément est déjà dans la base de donnée. Si oui, il n'écrit rien. Donc, si le bug apparait une fois dans la base de donnée, il ne devrait plus apparaitre, puisque la condition n'est plus remplie. Or ce n'est pas le cas!
Ma condition marche pour tout sauf pour ce bug: quand j'exécute deux fois de suite le script, les données ne s'inscrivent pas deux fois...
 
Je vais mettre le script au complet

Code :
  1. $dossier = '../../universite/';
  2. function parcours($chemin)
  3.     {
  4.         $timestamp = time();
  5.         $date = date('H:i:s' , $timestamp);
  6.         $jour = date('d', $timestamp);
  7.         $mois = date('m/y', $timestamp);
  8.  
  9.         $dossier= opendir($chemin);  // on ouvre le repertoire
  10.         if(!$dossier)
  11.             return ; //oups , impossible d'ouvrir le repertoire
  12.         while($entree= readdir($dossier) )
  13.         {
  14.             if ($entree== "."  ||  $entree == ".." ) // on ne regarde pas . ( lien vers le dossiercourant ) et .. ( lien vers le dossier parent )
  15.                 continue;
  16.                 $cheminEntree = $chemin.'/'.$entree;
  17.             if (is_dir($cheminEntree ))
  18.             { // on est sur un repertoire
  19.                 parcours($cheminEntree ); //on va voir ce que cache ce repertoire
  20.             }
  21.             else
  22.             {
  23.             // Traitement du chemin d'accès
  24.             echo $cheminEntree;
  25.                 $cheminEntree = explode('/', $cheminEntree);
  26.                 $nomFichier = explode('.', $cheminEntree[9]);
  27.                 
  28.                 mysql_connect ("localhost", "root", "" );
  29.                 mysql_select_db ('paralax_uni');
  30.                 $affichage_5 = mysql_query ("SELECT COUNT(*) FROM fichier WHERE fichier='" . $nomFichier[0] . "'" ); //Vérification si le fichier existe
  31.                 $count = mysql_fetch_row($affichage_5);
  32.                 $affichage_6 = mysql_query("SELECT id FROM fichier WHERE nom='" . $cheminEntree[6] . "' AND annee='" . $cheminEntree[4] . "' AND section='" . $cheminEntree[5] . "'" ); //Utilisé pour déterminé l'id de la section dont dépend le fichier
  33.                 $id = mysql_fetch_row($affichage_6);
  34.                 }
  35.                 if ($count[0] < 1) //Si l'élément n'est pas en base de donnée, on écrit
  36.                 {
  37.                     //Ecriture dans la base de données
  38.                     mysql_query("INSERT INTO fichier VALUES('','" . $id[0] . "', '" . $cheminEntree[7] . "', '" . $nomFichier[1] . "', '" . $cheminEntree[8] . "', '" . $cheminEntree[5] . "', '" . $cheminEntree[4] . "', '" . $cheminEntree[6] . "/" . $cheminEntree[7] . "/" . $cheminEntree[8] . "', '" . $nomFichier[0] . "', '" . $date . "',  '" . $jour . "',  '" . $mois . "', '" . addslashes($_POST['description']) . "')" );
  39.                     mysql_close();
  40.                     echo $count[0] .  '<br />';
  41.                 }
  42.                 
  43.         }
  44.     }
  45.  
  46. parcours($dossier);


Message édité par Matth002 le 26-10-2008 à 20:52:50
Reply

Marsh Posté le 26-10-2008 à 21:14:20    

erreur 1: pour avoir le nom du fichier, pas besoin de jouer avec les explode, tu l'as deja dans $entree
 
erreur 2 : pour avoir l'extension d'un fichier , on cherche un point , en partant de la fin ( imagine un nom.de.fichier.qui.contient.plusieurs.points.pdf ), avec  

Code :
  1. $pos = strrpos($entree, '.');


 
erreur 3 : un fichier n'a pas forcement d'extension, dans ce cas , vérifier si $pos ==0 , et deceider d'une action ( on ignore ? on continue ? )  
 
erreur 4 : on ne se connecte qu'une fois à la base de données, au début du script, pas  à chaque fois  
 
erreur 5 : qu'est ce qu'il se passe si un fichier contient un apostrophe . Tu dois toujours faire un nettoyage  avant d'utiliser une variable dnas une requete  

Code :
  1. $entreePropre = mysql_real_escape_string($entree );  //vive les noms de fonctions en php


sinon, utilise des requetes préparées
 
erreur 6 : on utilise pas des noms de variables avec des numeros, ca ne veut rien dire . Si c'est une requete, tu l'appelle $requete, si c'est un resultaSet, tu l'appelle ***** , tu peux le réutiliser par la suite
 
erreur 7 : mysql_fetch_row($affichage_5); retourne un tableau, pas un entier ou un comptage ( pareil pour affiche6 )  
 
erreur 8 : tu fais la requete pour obtenir l'id , meme si le chemin n'existe pas , c'est mal . Au passage ,  le mysql_fetch_row retourne un tableau , pourquoi tu l'appelle id ?  
tu peux , pour te simplifier la vie faire list($id) = mysql_fetch_riw($resultSet) ; et paf, id contient ton id  
 
erreur 9 : je pense que tu fais un gros caca avec cheminEntree[5] 6 et 7 , je suis pas sur que ça marche bien


Message édité par flo850 le 26-10-2008 à 21:19:37
Reply

Marsh Posté le 26-10-2008 à 21:16:39    

Tant que j'y suis, une autre question. Il est vraiment temps, avant de sortir la version finale du site, que je soit sur qu'il soit bien sécurisé.
Que dois-je faire?
 
J'ai lu qu'il fallait mettre sur les requetes sql un truc du genre (j'ai oublié la commande exacte) mysql_real_string_escape. Or, cela faisait planté mes scripts sur le serveur (pas en local), j'en ai déduit que c'était implémenté.
 
Merci d'avance
 
EDIT: j'avais pas vu que tu avais répondu ^^ Je vais tester dès que j'aurai le temps tes idées (peut-être pas avant la semaine prochaine hélas). Toutefois, je doute que ça solve le soucis parce que c'est moi qui donne les noms de fichiers, et ils n'ont pas de soucis. Mais je vais intégrer tes idées, je ne savais pas que ça existait, et ça me semble très pratique
Pour l'erreur 7, je suis d'accord, mais je ne prend qu'un seul élément du tableau, et ça marche? C'est pas bon?
Pour l'erreur 9, effectivement ça à l'air le souc comme ça, mais en réalité, ça marche au poil :)
Erreur8: A ça explique pourquoi parfois il ne m'affichait rien... C'est surement de la que vient le soucis donc. Par contre, je ne comprend pas très bien comment adapter le script pour qu'il ne cherche les id que dans le cas de fichiers, et pas de dossiers.
 
Je suis désolé de toutes mes questions, mais j'ai encore bcp de chemin a faire pour apprendre le php, et étant à l'univ, j'ai vmt pas bcp de temps à consacrer dessus :s


Message édité par Matth002 le 26-10-2008 à 22:13:53
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed