Recherche full text PHP/MySQL : problème avec implode

Eléphant du PHP | 95 Messages

27 mai 2005, 12:23

Je suis en train de réaliser un moteur de recherche full text en PHP. J'utilise l'indexation Full text de MySQL. Afin de bénéficier des options de recherche par troncature, j'utilise le BOOLEAN MODE. Je veux cependant que ce soit transparent pour l'utilisateur (qu'il n'ait pas à saisir l'asterisque ainsi que l'opérateur intermot ET). Il y a par ailleurs la possibilité de faire une recherche par type, fonctionnalité, région dans l'interface de recherche. Voici mon code :
// 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 avec troncature et opérateur inter-mot implicite "ET" pour le BOOLEAN MODE de la recherche full text
$recherche = $_POST['recherche']; // valeurs saisie par l'utilisateur dans le champ mots clés
$recherche = explode(" ",$recherche); // on mets les mots saisis dans un tableau
$recherche = "+" . $recherche . "*"; // ajout de l'opérateur intermot ET et de la troncature à droite pour chaque mot
$recherche = implode(" ", $recherche); // passage du tableau en chaine de caractères et ajout de l'espace entre chaque mot clé
Le problème c'est la fonction implode qui produit l'erreur suivante :
Warning: implode(): Bad arguments.

Quelqu'un pourrait-il me dire ce qui ne va pas. Je regarde la doc sur implode mais je ne vois pas ce qui cloche...

Merci par avance

Mammouth du PHP | 19672 Messages

27 mai 2005, 12:36

Ok, il y a des erreurs, on va y aller une ligne à la fois:
$recherche = explode(" ",$recherche);
En clair, $recherche devient un tableau, jusque là, ok;
$recherche = "+" . $recherche . "*";
Là ça pose un problème: $recherche est un tableau que tu veux concaténer avec les caractères + et * : ça buggue déjà là et la ligne suivante est forcément invalide:

Proposition de correction:
$liste_cles = explode(" ", $recherche);
foreach($liste_cle as $cle)
{
    $cle = "+". $cle ."*";
}
$liste_recherche = implode(" ", $liste_cle);
En utilisant des noms de variables différents, on peut arriver à les manipuler sans se mélanger les crayons sur les types de variables. À partir de ça, tu créeras ta requête à partir de $liste_recherche qui est une chaine de caractère et non de $recherche qui est un tableau.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 95 Messages

27 mai 2005, 13:36

Merci de cette réponse. Super !! Cependant je signale l'erreur sur la variable $liste_cle qui comporte un s en trop à la ligne
$liste_cles = explode(" ", $recherche);  
lire donc
$liste_cle = explode(" ", $recherche);  

Eléphant du PHP | 95 Messages

27 mai 2005, 13:53

A y regarder de plus près, il y a en fait un problème car le traitement des mots clés n'est pas pris en compte dans la requête ; il recherche les mots comme si on ne leur avait pas ajouté les opérateurs + et *...

en bas de page j'affiche la requete SQL et j'obtiens :

SELECT ID_OFFRE, DATE, INTITULEFROM offres WHERE MATCH(INTITULE, DESCRIPTIF) AGAINST ('recherche produit' IN BOOLEAN MODE)

au lieu de :

SELECT ID_OFFRE, DATE, INTITULEFROM offres WHERE MATCH(INTITULE, DESCRIPTIF) AGAINST ('+recherche* +produit*' IN BOOLEAN MODE)

La concaténation marche t-elle vraiment dans la boucle foreach ?

Mammouth du PHP | 19672 Messages

27 mai 2005, 14:40

Autant pour moi, je m'a gourru
<?php
$liste_cles = explode(" ", $recherche);
$liste = array();
foreach($liste_cle as $cle)
{
    $cle = "+". $cle ."*";
    array_push($liste, $cle);
}
$liste_recherche = implode(" ", $liste);
?>
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 95 Messages

27 mai 2005, 16:39

Ca marche parfaitement !!

Un grand merci à toi.

Mammouth du PHP | 19672 Messages

27 mai 2005, 16:59

[Résolu] :?:
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe: