Aller au contenu

Chercher le mot exact dans un texte


Americas

Sujets conseillés

J'ai une table avec un champ "nom" et un champ "description"

Pour faire une recherche sur le champ "nom" pas de problèmes vu le nombre réduit de mots.

Par contre le champ "description" est plus étendu et comporte souvent plus de 500 caractères... et je n'arrive pas à isoler un mot précis dans cette description lors de mes requêtes.

Exemple :

$sql = "SELECT * FROM table WHERE (nom = '$motsclef' or description LIKE '%$motsclef%') GROUP BY description";

En faisant une recherche avec le mot "italie"... pas de soucis.

Mais si je fais une recherche avec le mot "rome"... il va me ressortir toutes les occurences contenant la chaîne "rome" tels que aérodrome ou romeo et m'afficher des résultats qui ne seront pas en rapport avec la requête souhaitée.

j'ai essayé de retirer les % ... mais aucun résultat probant :unsure:

Lien vers le commentaire
Partager sur d’autres sites

Si tu veux un mot d'une description, essaye en partant du principe qu'il y a un espace avant.

$sql = "SELECT * FROM table WHERE (nom = '$motsclef' or description LIKE '% $motsclef%') GROUP BY description";

Mais a quoi sert donc le group by sur le champs description? bizarre comme pratique :unsure:

Lien vers le commentaire
Partager sur d’autres sites

Le Group By description me sert à éliminer les produits identiques car seuls les tarifs sont différents pour une description commune.

Bon... pour l'espace après le % c'est bon... on élimine aérodrome... reste le problème de romeo... sachant qu'avec un espace avant le deuxieme % on ignore rome, rome; ou rome.

Lien vers le commentaire
Partager sur d’autres sites

Salut,

et un truc du genre :

$sql = 'SELECT * FROM table WHERE (nom = \''.$motsclef.'\' or description REGEXP \''.$motsclef.'[^a-zA-Z]\') GROUP BY description';

Ca ne te conviendrait pas par hasard?

Lien vers le commentaire
Partager sur d’autres sites

Salut... c'est curieux comme résultat...

Qu'est ce que tu écris dans la suite de ton code pour obtenir l'affichage des résultats?

Sinon, la requête me semblera plus correcte avec :

$sql = 'SELECT * 
FROM table
WHERE nom = \''.$motsclef.'\'
OR description REGEXP \''.$motsclef.'[^a-zA-Z]+\'
GROUP BY description';

Si dans PhpMyAdmin, tu fais la requête suivante, qu'obtiens tu?

SELECT * 
FROM table WHERE nom = 'rome' OR description REGEXP 'rome[^a-zA-Z]+'
GROUP BY description

Lien vers le commentaire
Partager sur d’autres sites

Pour déterminer les limites d'un mot, il faut utiliser [[:<:]] et [[:>:]] avec REGEXP, comme ceci:

SELECT *
FROM table WHERE nom = 'rome' OR description '[[:<:]]rome[[:>:]]'
GROUP BY description

Lien vers le commentaire
Partager sur d’autres sites

SELECT *
FROM table WHERE nom = 'rome' OR description REGEXP '[[:<:]]rome[[:>:]]'
GROUP BY description

Ok... pour un mot précis comme rome ça fonctionne... mais le mot est une variable du type $marecherche

et si je remplace '[[:<:]]rome[[:>:]]' par '[[:<:]]$marecherche[[:>:]]' le script ne fonctionne plus... j'ai une page blanche :nonono:

Lien vers le commentaire
Partager sur d’autres sites

Il faut vraiment te mâcher le boulot :lol:

$query="SELECT * FROM table WHERE nom = '".$marecherche."' OR description REGEXP '[[:<:]]".$marecherche."[[:>:]]' GROUP BY description";

suivi de

mysql_query($query[, $link]); bien sûr :!:

Dan

Lien vers le commentaire
Partager sur d’autres sites

  • 2 years later...

Merci dan pour la solution.

Mais j'ai un autre pb.

les informations ne s'affichent pas tous

le programme affiche une ligne et saute une

voici mon code


$id = $_GET['id'];

if ($id = 'm')
{
$mal = $_POST['nom'];
$req = $query="SELECT * FROM mutation where mal_nom_fr REGEXP '[[:<:]]".$mal."[[:>:]]' OR mal_nom_eng REGEXP '[[:<:]]".$mal."[[:>:]]'"; ;
$res = executeRequete($req);
$num = mysql_num_rows($res);
if ($num = 0)
{
header("Location:mutation.php");
echo "alert('Disease not exist')";
}
else{
echo $mal.'<br><div><table border="1">';
while($resultat = mysql_fetch_array($res))
{
echo "
<tr>
<td>".$resultat['gene']."</td>
<td onClick='document.location.href=".$res['lien'].">".$resultat['omim']."</td>
</tr>
";
}
echo '</table></div>';
}

}

Lien vers le commentaire
Partager sur d’autres sites

Il va falloir commencer par doubler tes signe égal dans tes conditions.

N'oublie pas qu'un seul signe égal signifie "affecter une valeur".

Quand tu fais : if ($id = 'm'), tu affectes la valeur 'm' à ta variable $id (et ta condition est toujours vraie, quelle que soit la valeur qu'aurait pu avoir $id avant).

Il faut que tu fasses if($id == 'm')

Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...