Aller au contenu

Chercher le mot exact dans un texte


Sujets conseillés

Posté

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:

Posté

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:

Posté

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.

Posté

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?

Posté

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

Posté

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

Posté

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:

Posté

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

Posté

Merci Dan, ça fonctionne super ! :thumbsup:

J'avais seulement oublié les guillemets et le petit point. :blush:

Bon... on m'a jamais appris à coder moi :P

  • 2 years later...
Posté

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>';
}

}

Posté

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')

Posté

merci.

mais le pb persiste encore il m'affiche une ligne et saute une et ainsi de suite

merci :):flower::smartass::thumbsup: .

mais le pb persiste encore il m'affiche une ligne et saute une et ainsi de suite

Veuillez vous connecter pour commenter

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



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