Moteur de recherche full text PHP/MySQL

Eléphant du PHP | 95 Messages

25 mai 2005, 11:46

Bonjour,

Je cherche à faire via Dreamweaver un moteur de recherche pour mon site en utilisant PHP/MySQL. Je souhaite utiliser la méthode proposée dans ce tutorial moteur de recherche pour Dreamweaver/ASP/Access.

Mon problème est que ne sais pas faire dans MySQL l'équivalent d'une "table" de requête ACCESS. Je souhaite en fait concatener divers champs de diverses tables pour permettre la recherche...

Merci à tous ceux qui pourrait me donner une info la dessus.

ViPHP
pjl
ViPHP | 2119 Messages

25 mai 2005, 15:47

La doc officielle de MySQL pour la recherche full-text.
Tout y est expliqué : conception de la table et requête à construire.

http://dev.mysql.com/doc/mysql/fr/fulltext-search.html

PS : je te déconseille d'utiliser Dreamweaver pour ce genre de boulot.

Eléphant du PHP | 95 Messages

25 mai 2005, 16:37

Merci de cette réponse. En fait je code "à la main" pour les interfaces de recherche...
Je suis allé voir. Cela correspond à ce que je souhaite faire mais là où ça se complique un peu c'est que je veux une recherche multicritères dans différents champs. Je dois donc concatener plusieurs champs. Puis mettre les différents mots dans un tableau via explode(). Voici mon code de la page de résultats pour tester la concatenation (Interface page précédente avec liste déroulantes non liées) :
// Pour rechercher sur l'option "tous"
$VARfonction = $_POST['VARfonction'];
$VARregion = $_POST['VARregion'];
$VARtype_offre = $_POST['VARtype_offre'];
 if ($VARfonction == "fczz") $VARfonction="fc%";
 if ($VARregion == "rezz") $VARregion="re%";
 if ($VARtype_offre == "tyzz")  $VARtype_offre="ty%";
$recherche = $_POST['recherche'];

mysql_select_db($database_mabase, $mabase);
$query_Recordset1 = "SELECT * FROM annonces WHERE CONCAT(INTITULE, DESCRIPTIF, NOM) LIKE '$recherche' AND (offres.CODE_FONC LIKE '$VARfonction') AND (offres.CODE_REG LIKE '$VARregion') AND (offres.CODE_TYP LIKE '$VARtype_offre')";
$Recordset1 = mysql_query($query_Recordset1, $emploi) or die(mysql_error());
$row_Recordset1 = mysql_fetch_assoc($Recordset1);
$totalRows_Recordset1 = mysql_num_rows($Recordset1);
Sur la page de recherche, le formulaire comporte 4 éléments de formulaire :

Code : Tout sélectionner

<fieldset> <br> <label>Mots cl&eacute;s :</label> <input name="recherche" type="text" class="input" id="recherche" size="30"><br><br> <label>Fonctionnalités :</label> <select name="VARfonction" class="select" id="VARfonction"> <option value="fc" selected>Toutes les Fonctionnalités</option> <?php //code de la liste ?> </select><br><br> <label>Région : </label> <select name="VARregion" class="select" id="VARregion"> <option value="re" selected>Toutes les régions</option> <?php //code de la liste ?> </select><br><br> <label>Type :</label> <select name="VARtype_offre" class="select" id="VARtype_offre"> <option value="ty" selected>Tous</option> <option value="ty01">Offres</option> <option value="ty02">Demandes</option> </select>
Le problème c'est que, bien que je n'ai pas d'erreur sur la page, aucune recherche ne fonctionne.

Mammouth du PHP | 19672 Messages

25 mai 2005, 16:54

C'est surprenant: le seul point que je pourrais reprocher au code, c'est une concaténation mal faite pour la requête qui devrait être:
$query_Recordset1 = "SELECT * FROM annonces WHERE CONCAT(INTITULE, DESCRIPTIF, NOM) LIKE '". $recherche ."' AND offres.CODE_FONC LIKE '". $VARfonction ."' AND offres.CODE_REG LIKE '". $VARregion ."' AND offres.CODE_TYP LIKE '". $VARtype_offre ."'";
J'ai également enlevé des parenthèses qui n'ont pas lieu d'être à priori.

Question: si tu mes précisément les caractéristiques d'un article qui est dans la base, il ne sort pas du tout ?
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

ViPHP
pjl
ViPHP | 2119 Messages

25 mai 2005, 18:18

je ne vois pas pourquoi tu dois concaténer pour faire une recherche sur plusieurs champs.

de mon coté, ca marche très bien avec MATCH sur 4 champs en même temps.

Mammouth du PHP | 19672 Messages

25 mai 2005, 18:52

Je vais me coucher plus savant ce soir, je ne connaissais pas la technique MATCH / AGAINST :oops:
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

ViPHP
pjl
ViPHP | 2119 Messages

25 mai 2005, 19:25

Ou commet faire un méga moteur de recherche en 2s. 8)

Eléphant du PHP | 95 Messages

26 mai 2005, 14:12

Merci à tous de vos réponse. La solution MATCH ... AGAINST est tout à fait ça... Il me reste cependant un petit problème à gérer :

Code : Tout sélectionner

SELECT DATE, INTITULE, CODE_REG FROM offres WHERE MATCH(INTITULE, DESCRIPTIF, NOM) AGAINST ('voiture') AND (CODE_FONC LIKE 'fc12') AND (CODE_REG LIKE 're01') AND (CODE_TYP LIKE 'ty01');
fonctionne parfaitement lors du test dans Mysql.

Mais dans la page PHP :

Code : Tout sélectionner

SELECT DATE, INTITULE, CODE_REG FROM offres WHERE MATCH(INTITULE, DESCRIPTIF, NOM) AGAINST ('$recherche') AND (offres.CODE_FONC LIKE '$VARfonction') AND (offres.CODE_REG LIKE '$VARregion') AND (offres.CODE_TYP LIKE '$VARtype_offre');
ne fonctionne pas : aucun résultat à la requete quelque soit la recherche...

Invité
Invité n'ayant pas de compte PHPfrance

26 mai 2005, 17:04

La solution a été trouvée : problème lors de la valeur par défaut "Tous" dans la page de recherche : fc par ex. au mieu de fczz !

Je continue cependant sur mon pb : il me faut maintenant gérer le problème des accents...

Eléphant du PHP | 95 Messages

27 mai 2005, 12:15

Je donne rendez-vous à ceux qui sont interessé par ce problème et la recherche full text dans le forum "débuter en PHP" avec mon code final et la solution encore partielle de ce moteur de recherche