Moteur de recherche interne avec fichier pdf [résolu] - PHP - Programmation
Marsh Posté le 11-10-2007 à 10:56:44
Ici, on ne fait pas le boulot.
Qq indices pour débuter :
- il te faut une bd qui va stocker l'indexation de tes docs (1 ou plusieurs tables)
- un script php qui va parcourir les répertoires contenant tes docs à indexer (à toi de définir la manière dont tu veux indexer, par exemple, ne garder que les mots > x caractères)
- un script de recherche dans la bd qui, si possible, triera les résultats par pertinence.
Marsh Posté le 11-10-2007 à 11:56:15
Bonjour
est ce que tu veux aussi faire des recherches DANS les fichiers pdf? ou juste sur les noms?
Marsh Posté le 11-10-2007 à 12:11:46
JE veux jsute les noms...
Alors je viens de créer ma base de donnée avec 4 Champs.
id_fichier
repertoire
lien_internet
nom_fichier
Je veux juste uniquement faire des recherches sur les noms des fichiers pdf.
Existe il des script déjà fait sur l'indexation des documents?
EDIT :
Je fais aussi la commande :
find . -name '*.pdf' > listfile.txt
et apres il me manque un script php qui me consulte le fichier texte et qui me remplisse les champs de la BDD...
Mais est ce une bonne méthode?
Marsh Posté le 11-10-2007 à 12:17:47
Il te suffit juste maintenant de faire une requete contenant en clause WHERE l'attribut LIKE
- Tu insere tes fichiers pdf sur le ftp..
- Tu les enregistres dans la base en complétant les champs que tu viens de nous indiquer
- Lorsque tu valide ton formulaire de recherche , tu lance donc ta requete de selection dans la base avec ce que je viens de te dire (LIKE), ce qui te permettra de trouver tous les fichiers donc le nom contient ce qui ce trouvais dans le formulaire..
- Tu met tout ce tointoin dans un tableau, ou bien tu les affichent en live à chaque fois qu'il en trouve un, avec par exemple un petit système d'affichage répertoire - fichier
(a regarder ici http://forum.hardware.fr/hfr/Progr [...] 8626_1.htm )
et voila ta recherche est terminée
Marsh Posté le 11-10-2007 à 13:59:44
Merci pour la méthode...
"Tu les enregistres dans la base en complétant les champs que tu viens de nous indiquer"
dois je faire avec ma méthode ? find dans un fichier txt et lire ce fichier ?
dans ce cas, aurait tu une piste à suivre pour coder tout ca? je pense aller faire un tour sur code source php....
Ou alors tu pensais à une autre méthode?
Marsh Posté le 11-10-2007 à 14:04:31
bah :
- soit tu te créer une petite page dans ton espace d'admin qui te permet d'uploader des fichiers, et au moment de l'upload tu fait une requete INSERT INTO, ::: Avantage : si qu'un seul, ou peu de fichier à mettre, mise dans la bdd instantanée et pas besoin d'ouvrir le logiciel de transfert ftp ... (pas forcement installé sur toutes les machines)
- soit si tu préfère utiliser un logiciel ftp pour les mettre dessus, tu te créer un tit script, qui analyse tous les fichiers nouveaux par rapport à ceux enregistrés à la bdd, et dés qu'il en détecte un, il insere sa présence dans la bdd :::: Avantage : si pleins de fichier à mettre d'un seul coup, et donc pas trop le temps d'utiliser la page, tu lance le script et hop .. par contre obligé d'avoir un soft de ftp ..
- soit les deux si t'a le temps ^^
Marsh Posté le 11-10-2007 à 14:05:20
ps : je te conseil plus php.net que code source t'en apprendra 3 fois plus ..
Marsh Posté le 11-10-2007 à 14:52:59
php.net le site en anglais?
Pour résumer ce qui est fait :
J'ai un logiciel ftp à l'entreprise qui à 4H du matin balance les fichiers sur le serveur WEB.
Il travaille en mode différentielle, et la synchronisation ce fait que dans un sens !
La source met à jour la destination, c'est tout.
J'ai fais des htaccess, et une page de connexion.
micfont>> il me semble que ce que tu dit ne correspond pas à mon cas... ou alors j'ai pas tout compris....
Actuellement, je cherche la solution qui lit mon fichier txt et qui à chaque ligne me fasse un INSERT INTO dans la bdd.
2eme petit problème: Si le fichier a été supprimé ou que son nom a été modifié... il faut que je fasse un delete de l'ancien enregistrement non?
EDIT: Vous connaissez la commande pour lire le dernier "/" d'une ligne? car en fait j'arrive à avoir ma liste de fichier mais de la forme ./test.php ./test2.php. Si je veux récupérer le nom du fichier il faut que j'enleve tout ce qui est avant...
Marsh Posté le 11-10-2007 à 15:44:35
basename() ?
http://fr.php.net/manual/fr/function.basename.php
Marsh Posté le 11-10-2007 à 15:55:55
Rufo > nickel
Le problème vue que j'ai mis tout les fichiers dans un fichier txt... le basename($val,".php" ) ne fonctionne pas... mais c'est pas très grave... avoir le fichier qui reste dans la base de donnée sous forme de xxxx.pdf ne me gène pas...
par contre je suppose qu'il existe l'inverse genre un basedir() qui me donne l'inverse le chemin sans le fichier ?
Marsh Posté le 11-10-2007 à 16:20:51
dirname() ?
http://fr.php.net/manual/fr/function.dirname.php
Pour basename(), gros malin, faut remplacer '.php' par l'extension qui va bien. mais je pense que c'est mieux de garder l'extension, donc, tu mets pas de 2ième paramètre (cf l'exemple 753 sur php.net)
Marsh Posté le 11-10-2007 à 16:23:59
Code :
|
Bon voici ma premiere ébauche.... le problème c'est que cela n'écrit rien dans ma base de donnée....
Marsh Posté le 11-10-2007 à 16:44:40
Normal tu mets du texte dans $sql (la requette que t'auras à exécuter) mùais ensuite tu te contente d'oublier son existance.
Marsh Posté le 11-10-2007 à 16:50:16
faut te connecter à la base mysql et lancer la requête d'insertion (mysql_query http://fr.php.net/manual/fr/function.mysql-query.php )
Marsh Posté le 11-10-2007 à 17:18:52
omega2 a écrit : Normal tu mets du texte dans $sql (la requette que t'auras à exécuter) mùais ensuite tu te contente d'oublier son existance. |
en fait c'est bon
Code :
|
Petit probleme de comprehension des requetes SQL
Maintenant il me reste à cherche comment récuperer le chemin pour l'inserer dans une table (bon je post tout comme ça ca peut servir à d'autre ....
EDIT :
En fait mon php je l'aime pas... j'aime pas écrire dans un fichier texte la liste des fichiers .. mais est ce que j'ai que cette solution ou avéz vous une fonction qui traine derriere vos matieres grises ??
Marsh Posté le 12-10-2007 à 09:03:25
ben non. Tu listes les fichiers des répertoires avec glob() ou opendir()/readdir()/closedir()
cf ex http://fr.php.net/manual/fr/function.opendir.php
Marsh Posté le 12-10-2007 à 09:04:00
bah tu reprend le code que je t'ai donné au début et au lieu de mettre dans le fichier texte, tu insère directement dans la base ... non?
Marsh Posté le 12-10-2007 à 09:05:39
rufo a écrit : ben non. Tu listes les fichiers des répertoires avec glob() ou opendir()/readdir()/closedir() |
rahhh
Marsh Posté le 15-10-2007 à 08:43:48
j'ai bien vue l'option opendir....
Mais il y a quelque chose de pas très clair :
Si je met un code php qui liste tout les repertoires récursivement...
Cela veut dire que c'est un utilsiateur WEB qui va me déclencher ce listage... et donc c'est l'admin...
Ce n'est pas très terrible non?
EDIT: Remarque mon system avec le fichier texte c'est pareil....
Marsh Posté le 15-10-2007 à 09:10:09
PsYKrO_Fred a écrit : |
Ah pas compris ce que tu voulais dire la ...
ce qui ce passe coté utilisateur reste coté utilisateur, tu permet juste au visiteur de lister ce qui est présent sur le ftp.. après il n'a aucun accès de modification, de suppression, ou autre je sais pas si c'est le but de ta phrase, ou si j'ai mal compris
Marsh Posté le 15-10-2007 à 10:26:39
J'essaye de rexpliquer...
Le but final ce n'est pas que l'utilisateur puisse lister le contenu d'un repetoire... mais c'est de pouvoir faire une recherche.
J'ai des plans que je transfert par ftp sur le serveur web.
C'est des plan avec le nom de la forme (M126.pdf, M127.pdf...)
Tu as vite compris que c'est galère pour trouver le fichier dans tous les repertoires...
Alors je voulais lister tous les fichiers et les mettre dans une table...
Pour le moment, je lance un find que je met dans un fichier .txt.
Ensuite j'ai une page php qui va lire ce fichier et insérer dans la base de donnée le nom du fichier, son chemin et son extension...
Mon soucis c'est ici ... le find et le INSERT ne dois pas ce faire par l'utilisateur mais par l'admin ( dans le pire des cas) ou automatiquement.
Marsh Posté le 15-10-2007 à 10:47:09
ah bah dans tous les cas il va te falloir un espace d'administration, avec gestion des Sessions et tout.. on est d'accord jusqu'ici ..
Maintenant on reprend la méthode ...
- coté administrateur :
---- Uploader les fichiers soit par client FTP (filezilla), soit par l'espace d'administration (upload de fichier basic, PUIS INSERT INTO)
---- Dans le cas d'un upload par client FTP, alors créer une petite page qui quand elle est lancée, va permettre de lister tous les fichiers présents sur le ftp, et de vérifier s'ils sont présents dans la base de donnée, si non , alors INSERT INTO
---- Si tu veux créer une page pour supprimer des fichiers, en les supprimant de la base et dans le ftp, les renommer ou autre, ça tu gère tout seul
- coté client :
---- Proposer un formulaire de recherche
---- Une fois la recherche effectuée, alors faire un SELECT * FROM tatable WHERE nomfichier LIKE "%contenuformulaire%" histoire de voir quels sont les fichiers qui correspondent en regardant leur répertoires ou ils ce situent
---- Pour le listage des fichiers, soit tu lance le script de contenu récursif des répertoires, mais à chaque listage, tu verifie si le fichier correspond au résultat de la recherche, alors tu l'affiche, sinon tu passe. Comme ça tu n'a l'affichage que des fichiers correspondants à la recherche
Et voila un outil efficace, par contre peut etre perfectionné au niveau de la rapidité, parce que si l'on à une grande quantité de fichiers, alors ça mettra pi etre un peu de temps à faire le listage ... mais c'est une solution qui est assez simple, et rapide à mettre en place
voila dis nous la dedant ce que tu à déjà fait ou ne pas fait
Marsh Posté le 15-10-2007 à 10:58:52
Bon alors ce que j'ai fait....
pour le ftp, je prefere que ça soit l'entreprise qui se connecte sur le serveur WEB et qui upload que l'inverse. Bon ça de toute facon ça fonctionne.
Une page admin (pas fait)
Une page qui liste directement dans une BDD et si le fichier n'existe plus elle supprime de la BDD (pas fait)
Une page de connexion (fait)
htaccess (fait)
Une page d'insertion des fichiers dans une BDD après avoir lu un fichier txt (fait)
Formulaire de recherche (fait)
Resulat de la recherche (fait à moitie)
Il me manque à proposer le lien vers le pdf et j'ai une erreur de syntaxe
echo "<a href=\".$row[1],"/",.$row[3]">.$row[3]<\a>";
où .$rom[1] correspond au repertoire et $rom[3] au nom du fichier...
moi je veux mettre un "/" entre, comme ça j'ai mon lien internet.
Marsh Posté le 15-10-2007 à 11:25:08
oula un peu tout pourri ton écho la lol
tiens . :
Code :
|
petit indice = lorsque tu veux concatener, pense toujours que tu à forcement un . à gauche et à droite de ta concatenation
ensuite toujours fermer tes simples quotes ou double quotes lorsque tu met tes .
regarde mon echo j'ouvre avec un simple quote, mon a href comporte un double quote comme pour l'affichage html, je veux mettre ton $row[1] donc je ferme mon simple quote, je concatene, j'insere $row[1], je reconcatene, et je réouvre mon simple quote...
sinon plus simple, tu dis :
Code :
|
pas sur que ça fonctionne mais normalement si à moins que je dise un connerie ça m'arrive souvent lol
voila c'est tout
Marsh Posté le 15-10-2007 à 12:26:00
le coup du script php qui fait l'indexation en listant les fichiers des répertoires, c'était pour remplacer find . -name '*.pdf' > listfile.txt qui faisait que t'avais un fichier temporaire qui servait à rien pour ensuite remplir ta bd.
Pour info, on peut aussi utiliser php en ligne de commande. T'es donc pas obligé de donner accès à ce script par le web. Tu peux très bien juste l'utiliser périodiquement via la commande cron.
Marsh Posté le 15-10-2007 à 12:31:05
rufo a écrit : T'es donc pas obligé de donner accès à ce script par le web. Tu peux très bien juste l'utiliser périodiquement via la commande cron. |
+1 mais bon autant avoir les deux s'il veux mettre à jour pour un fichier important qu'il viens de mettre sur le ftp ..
donc oui , le cron et le script direct ça peut etre sympa
Marsh Posté le 15-10-2007 à 12:37:35
ben pour moi, quand il fait une upload, il indexe forcément le fichier dans sa bd.
Le script d'indexation, pour moi, c'était surtout en début de projet pour initialiser la bd et appelé de temps en temps si entre temps des fichiers ont été modifiés (renommés, supprimés...)
Marsh Posté le 15-10-2007 à 13:25:31
ouai je suis un peu con sur ce coup la mais bon j'avais en tete que c'était pas forcement lui qui uploadais et qu'un peu n'importe qui de sa société pouvais uploader des fichiers d'un peu n'importe ou, pas forcement de l'espace d'admin ... mais c'est vrai que lors de l'upload il l'indexe logiquement dans la bdd
Marsh Posté le 15-10-2007 à 14:02:01
micfont999 a écrit : ouai je suis un peu con sur ce coup la mais bon j'avais en tete que c'était pas forcement lui qui uploadais et qu'un peu n'importe qui de sa société pouvais uploader des fichiers d'un peu n'importe ou, pas forcement de l'espace d'admin ... mais c'est vrai que lors de l'upload il l'indexe logiquement dans la bdd |
Oui effectivement c'est le serveur tout seul qui upload...
Effectivement, la concatenation fonctionne.... tout content de mon début, je montre ça à mon supérieur qui est content aussi mais il me dit que souvent les gens voudrons rechercher les infos par repertoire... ... bon j'ai pas fait tout ça pour rien ...
Par contre j'ai repris tout ce qu'on à fait...
J'arrive à lister mes repertoires directement dans la BDD.
Code :
|
Il faut que j'étudie pourquoi dans ce code (que j'ai trouvé sur le net) sans le tableau j'ai que le premier sous repertoire et avec le tableau j'ai tout les sous repertoire... bref c'est pas sujet.
Par contre lorsque je fais ma recherche, je peux pas chercher mon repertoire que je veux car dans la BDD, le champ est inscrit de cette façon :
temp/L0001/
temp/L0002/
Si je fais une recherche de "L00", il me trouve rien... Si je fais une recherche de "t" il me trouve tout....
En fait, il faudrait que j'arrive à récupérer que le nom du repertoire dans la fonction plus haut...
Vous voyez ce que je veux dire?
EDIT : avec la fonction dirname() je devrai m'en sortir?
Marsh Posté le 15-10-2007 à 14:11:25
tien la dedant t'aura tout ^^
http://php.developpez.com/faq/?page=fichiers
ici
http://php.developpez.com/faq/?pag [...] ier_chemin
edit :
--> petite précision, tu regarde la position du dernier / et tu prend ce qu'il y à derrière ... comme ça hop tu à le nom du répertoire
mais sinon tu ne pourrais pas essayer de mettre le nom du repertoire dans la bdd ?? comme ça lors de la recherche tu fait une recherche avec dans le WHERE repertoire = machinchose
non?
edit bis : oui avec dirname et ce que j'ai mis en premier edit
Marsh Posté le 15-10-2007 à 14:30:54
pour une recherche partielle sur une chaîne de caractères faut faire
WHERE repertoire LIKE "%machinechose%" ou utiliser match against si t'es sous mysql et que tu utilises le fulltext
Marsh Posté le 15-10-2007 à 14:38:03
lol je me demande si vous travaillez pas à coté et c'est à celui qui me donne des réponses en premier...
Super rapide les gars...
Rufo > je débute aussi en mysql, je comrpend pas grand chose avec match etc... mais pas besoin que tu expliques tout... je sais faire des recherche sur google (remarque je sais faire que ça lol)
micfont>> pour le dirname ()
if(is_dir($obj)) {
$dir_list[] = $obj;
$dir_list = array_merge($dir_list, find_dirs($obj));
$chemin = pathinfo($obj);
$rep = $chemin['dirname'];
mysql_query("INSERT INTO idx_repertoire VALUES ('','$rep')" );
mais il me renvoie rien du tout dans la BDD
Et pour répondre à ta question : c'est ce que je fais, je vuex renseigne le champ repertoire par le reptoire... mais pas tout le chemin....
Allez je vais regarder les liens....
Marsh Posté le 15-10-2007 à 14:45:02
Bingo merci pour le deuxieme lien j'avais vu la fonction explode() mais je n'arrivai pas à l'utiliser
$rep = array_pop(explode('/', $obj));
Par contre, sans faire gaffe j'ai relancé 2 fois ma page PHP d'insertion... et il m'a mit des enregistrement en double...
Est ce que je peux y remedier ?
Marsh Posté le 15-10-2007 à 14:51:43
quand tu fait un echo de $rep ça t'affiche quoi?
tiens sinon une truc toute simple
Code :
|
en gros ça fait quoi, ça prend le dirname donc tout le chemin
dirname --> machin/truc/bidule (donc nous on veux que bidule)
strrchr --> prend tout ce qui ce trouve après le premier / en partant de la fin (http://fr.php.net/manual/fr/function.strrchr.php)
substr --> retourne seulement la chaine sortie de strrchr (http://fr.php.net/manual/fr/function.substr.php)
et voila on à juste le répertoire dans toute la vérole avant et après
et sinon si si je bosse hein, je viens de me pondre un editeur wysiwyg et tout un site en dynamique, de a à z, rien du tout en statique alors je me prend une tite pause forum lol ..
et ça nous apprend toujous des trucs de trainer sur ce site
Marsh Posté le 15-10-2007 à 15:03:45
Merci micfont 999
J'ai maintenant 2 tables...
une table qui index les fichiers avec 3 champs TYPE, REPERTOIRE, FICHIER
une table qui index les repertoires avec 2 champs NOMREPERTOIRE et CHEMIN
Ma recherche fonctionne....
J'ai juste le problème que si le repertoire existe plusieeurs fois ou alors si je lance la page php 2 fois, j'ai tout mes enregistrements en double...
Marsh Posté le 15-10-2007 à 15:10:30
j'allais te dire de regarder du coté de UNIQ mais non en fait, sinon tu pourra pas avoir de répertoires avec le même nom ...
euh, bah je vois une solution, c'est de faire une requete de selection pour voir si l'enregistrement est déjà présent ... tu selection, si le mysql_num_rows est = à 0 alors tu insert, sinon tu passe
voila mais ça fait pas mal de requetes ...
Marsh Posté le 15-10-2007 à 15:38:12
micfont999 a écrit : hey tu repete ce que je dis non mais |
pas tout à fait. Toi, tu lui proposais de faire WHERE champ="valeur" or lui, a besoin de pouvoir rechercher sur une partie du chemin => LIKE est différent de =
ps : si si, moi aussi je bosse. Je suis en train de finir la dernière évol d'un intranet. Et comme dit micfont999, trainer ici, c'est jamais perdu. On y apprend des trucs et astuces ou se faire aider (ben oui, nous aussi on sait pas tout).
Marsh Posté le 15-10-2007 à 15:42:59
rufo a écrit : |
et ça c'est quoi non mais
micfont999 a écrit : |
je t'apprendrais moi à répondre à des messages sans lire tout le topic non mais
lol ah mince je fais pareil .. zut alors
Marsh Posté le 11-10-2007 à 09:56:58
Bonjour,
J'ai un serveur Ubuntu.
Je souhaiterai avoir une page php où il y a un petit moteur de recherche pour faire des recherche sur des fichiers en .pdf.
J'ai un repertoire où va être stocker énormement de fichier pdf.
Comment indexer tous mes fichiers et comment programmer ou trouver un script déjà fait qui fasse la fonction "recherche" et qu'il parcours toute l'arborescence de mon site?
Merci
Message édité par PsYKrO_Fred le 16-10-2007 à 11:27:24