Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2070 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1804543
Matth002
Posté le 25-10-2008 à 19:18:32  profilanswer
 

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.

mood
Publicité
Posté le 25-10-2008 à 19:18:32  profilanswer
 

n°1804554
flo850
moi je
Posté le 25-10-2008 à 19:56:54  profilanswer
 

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
n°1804573
Matth002
Posté le 25-10-2008 à 21:15:24  profilanswer
 

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

n°1804642
flo850
moi je
Posté le 26-10-2008 à 08:55:05  profilanswer
 

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

n°1804742
Matth002
Posté le 26-10-2008 à 18:12:52  profilanswer
 

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)

n°1804748
Matth002
Posté le 26-10-2008 à 18:51:20  profilanswer
 

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
n°1804750
flo850
moi je
Posté le 26-10-2008 à 19:05:25  profilanswer
 

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

n°1804784
Matth002
Posté le 26-10-2008 à 20:51:59  profilanswer
 

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
n°1804791
flo850
moi je
Posté le 26-10-2008 à 21:14:20  profilanswer
 

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
n°1804794
Matth002
Posté le 26-10-2008 à 21:16:39  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

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

 

Sujets relatifs
Chemin relatif dans accessVBS & ADSI Probléme de création de "dossier de base"
redirigevers une page ce trouvant dans un dossier protégé par .htaces[SQL] Lier la récupération d'infos de 2 tables
Scan de dossier d'imageVB noms des dossiers
Batcher/Recompresser toutes les images dossier + sous dossiersHtaccess - récupération des répertoires dans une url
Plus de sujets relatifs à : [php] Scan de dossiers, sous dossier, et récupération du chemin


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR