Probleme avec like et recherche mot exact

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Probleme avec like et recherche mot exact

C'est fait et...

par desparlsp » 29 juil. 2009, 20:06

Bonjour,

C'est fait et cela me retour la valeur 0, toujours si je prend en compte que like '$valeur' sans les %

j'ai le message suivant

MySQL returned an empty result set (i.e. zero rows). ( Query took 0.1021 sec )

Voila, si il n'y a pas de % dans la valeur like, cela ne marche pas, il ne trouve rien....

Merci

David

par thehawk » 29 juil. 2009, 19:50

essaye d'exécuter ta syntaxe dans phpmyadmin directement (en mettant la valeur de la variable)

une fois la bonne synataxe trouvé , apres ton

mysql_query(ton sql)

rajoute ; or die(mysql_error());

ce qui donnera :
$sql = "SELECT * FROM ....";
mysql_query() or die('SQL '.$sql.'<br>mysql_error());

BOnne aprem Hawk

Merci

par desparlsp » 29 juil. 2009, 18:48

Salut,

Merci pour ton code.

J'ai deja cette option dans mon script. En effet, l'utilisateur peut choisir l'un des terme ou tous les termes des mots saisie.

Le probleme ne vient pas de cela, mais de la clause like '$valeur'. Celle-ci ne marche pas....
Seule fonctionne les clauses like '%$valeur%', like ' $valeur %', like '% $valeur' ou like '% $valeur %'.

J'ai fait un petit essais avec uniquement un mot et la condition like '$valeur' et il ne trouve rien. J'ai l'impression qu'il ne prend pas en compte cette condition. C'est etrange, car avant cela marchait...



Merci

David

par enneite » 29 juil. 2009, 15:05

//met en minuscules le ou les mots trouvés
$mot=strtolower($mot);

//converti les caracteres speciaux en html car ceux ci dans le sont en html
$mot = htmlentities($mot, ENT_QUOTES,'UTF-8');

//met en tableaux plusieur mot saisies
$description=split(" ",$mot);

// NOMBRE D'ELEMENTS DU TABLEAU $description
$nombre_mots=count($description);

//j'initialise la premiere condition si il n'y a qu'un mot recherche

$phrase="'$description[0]' or transcription like '% $description[0] %' or transcription like '% $description[0]' or transcription like '$description[0] %'";

//dans le cadre de plusiers mot je fais une boucle pour la recherche

$z=1;

while($z<$nombre_mots)
{

$phrase.=" or '$description[%z]' or transcription like '% $description[$z] %' or transcription like '% $description[$z]' or transcription like '$description[$z] %' ";

$z++;
}

}

//ensuite j'effectue ma requette

select * from $matable where (transcription like $phrase )
Tu veux donc rechercher l'un des termes et non tous les termes.
Tu peux essayer cquelquechose comme ceci :


function separe_mots_dans_chaine($chaine,$echappement)
{
$tableau_mot=array();
$debut_nouveau_mot=0;
$k=0;$i=0;$mot="";

while($i<=strlen($chaine))
{

$caractere=substr($chaine,$i,1);
if ( ($caractere!=$echappement)&& ($i!=strlen($chaine)))
{
$mot=$mot.$caractere;
$i=$i+1;
}
else
{

if($mot!="")
{
$tableau_mot[$k]=$mot;
$k=$k+1;
}

$i=$i+1;
$mot="";
}

}
return $tableau_mot;

}





$tab_mots=separe_mots_dans_chaine($mot," ");

if(count($tab_mots>0)
{
$requete="SELECT * FROM table where ";

for($i=0;$i<count($tab_mots);$i++)
{
$valeur=$tab_mots[$i];

$requete.="( transcription like '$valeur' or transcription like '% $valeur %'
or transcription like '$valeur %' or transcription like ' $valeur%' ) ";

if($i<count($tab_mots)-1) $requete.=" or ";
}



}
tu peux donc essayé cela.
Remarque dans ce cas il recherchera l'un des termes, il faut remplacer le or par un and pour qu'il recherche tous les termes.

Desole mais toujours pas ca

par desparlsp » 28 juil. 2009, 23:29

Salut,

Je suis desole mais cela ne marche pas. J'ai toujours un message d'erreur malgre tout ce qui a ete dit et ce dont j'ai fait. Quand aux exemples concrets sur le net ils sont un peu complexes, flous ou alors pour les pros, ce que je ne suis pas....

Je vais me contenter du like '% $var%', c'est deja mieux que rien.


Merci encore

David

par Victor BRITO » 28 juil. 2009, 20:41

D'abord, c'est

Code : Tout sélectionner

MATCH (transcription) AGAINST ('$description[0]')
sans les %.

Ensuite, avec une telle requête, il faut que la colonne sur laquelle la recherche en texte intégral est effectuée comporte un index FULLTEXT, qui doit reprendre le nom des colonnes évoquées dans MATCH (). Pour ajouter un tel index :

Code : Tout sélectionner

ALTER TABLE nom_de_la_table_concernée ADD FULLTEXT (transcription);
Cela dit, tu peux effectuer ce type de recherche sur une colonne dépourvue d'index FULLTEXT, auquel cas la recherche en texte intégral doit être effectuée en mode booléen, la requête ressemblant à ça, pour la partie MATCH () AGAINST () :

Code : Tout sélectionner

MATCH (transcription) AGAINST ('$description[0]' IN BOOLEAN MODE)

Et pourtant....

par desparlsp » 28 juil. 2009, 19:52

Salut,

C'est exactement ce que j'ai fait. Pour moi colonne voulait dire champ. Ainsi dans ma table X il y a une colonne appele transcription qui contient le texte dont je veux effectuer la recherche d'un mot.

Dans mon cas j'ai fait :

Code : Tout sélectionner

MATCH (transcription) AGAINST ('%$description[0]%')
description venant de :

Code : Tout sélectionner

$description=split(" ",$mot);
au cas sou il y aurait plusieurs mots.


J'ai essaye avec la fonction Match que tu m'a decrite. Le script ne plante pas et donc semble marcher, mais il ne trouve aucun mot..., exactement comme pour le

like 'mot a chercher' sans les %....

J'ai cherche sur le net et il semblerait que le probleme soit courant et pas resolu.... :?

David

Re: Marche toujours pas

par Victor BRITO » 28 juil. 2009, 19:18

Par contre dans la fonction MATCH, il s'agit de colonnes, non? Moi il s'agirais plutot de recherche un mot exact dans un texte qui se trouve dans un champ....je ne vois pas ce que ce colonne veut dire...colonne est-ce bien le nom de mon champ????

Excusez mon ignorance....
Dans une base de données, tu as des tables qui comportent des colonnes. Autrement dit, quand tu effectues un

Code : Tout sélectionner

SELECT id, nom, prenom FROM personnes
tu sélectionnes les colonnes id, nom et prenom de la table personnes.

Un peu de lecture. ;)

Marche toujours pas

par desparlsp » 28 juil. 2009, 18:26

Salut,

Desole mais ca ne marche toujours pas. J'ai toujours les meme resultats, pourtant j'ai bien respecte les espaces entre les quotes.

Voila mon morceau de code, peut etre pour mieux comprendre .

Il s'agit d'un petit moteur de recherche.

Code : Tout sélectionner

//met en minuscules le ou les mots trouvés $mot=strtolower($mot); //converti les caracteres speciaux en html car ceux ci dans le sont en html $mot = htmlentities($mot, ENT_QUOTES,'UTF-8'); //met en tableaux plusieur mot saisies $description=split(" ",$mot); // NOMBRE D'ELEMENTS DU TABLEAU $description $nombre_mots=count($description); //j'initialise la premiere condition si il n'y a qu'un mot recherche $phrase="'$description[0]' or transcription like '% $description[0] %' or transcription like '% $description[0]' or transcription like '$description[0] %'"; //dans le cadre de plusiers mot je fais une boucle pour la recherche $z=1; while($z<$nombre_mots) { $phrase.=" or '$description[%z]' or transcription like '% $description[$z] %' or transcription like '% $description[$z]' or transcription like '$description[$z] %' "; $z++; } } //ensuite j'effectue ma requette select * from $matable where (transcription like $phrase )
Et la le resultat est le meme. dans mon exemple si je tape ana j'obtien

"ana"
"tatiana" etc...

:?


Par contre dans la fonction MATCH, il s'agit de colonnes, non? Moi il s'agirais plutot de recherche un mot exact dans un texte qui se trouve dans un champ....je ne vois pas ce que ce colonne veut dire...colonne est-ce bien le nom de mon champ????

Excusez mon ignorance....

Merci

David

Re: Toujours pas

par Victor BRITO » 28 juil. 2009, 18:15

Par contre a propos de la fonction Match, je ne sais pas comment la mettre en oeuvre. J'ai lu l'article mais je ne saisi pas bien ce que peu signifier AGAINST..... :?

Code : Tout sélectionner

MATCH (colonne1, colonne2...) AGAINST ('expression à rechercher')
Autrement dit, il s'agit de chercher dans la(les) colonne(s) spécifiée(s) dans MATCH () l'expression indiquée dans AGAINST (). Est-ce plus clair ainsi ? ;)

Re: Je n'y arrive pas

par enneite » 28 juil. 2009, 17:48

Salut,

Je ne comprend pas tres bien la fonction SOUND et elle semble un peu sujette a caution et n'etant pas pros je n'arrive pas a la mettre en place...malgre mes recherche sur google en anglais et francais....

Par contre j'ai bien modifie le code en rajoutant le code indiquee ci-dessus et le resultat est le meme.

Si je cherche "ana" j'obtien encore une fois l'exemple suivant :

"ana"
"anaconda" etc..

or je voudrais uniquement chercher et afficher le terme exact, soit ana

merci a vous tous

David

David
Avec le code que je t'ai fourni, on ne peut pas trouver "anaconda" si on respecte les espaces dans les simples quotes,
select * from $matable where
champ like 'ana'
or champ like '% ana %'
or champ like '% ana'
or champ like 'ana %'
on peut trouver 'ana'
' jhuu ana lijj '
'ana hyuuu'
'rgvfhgyuggh ana'


on ne peut pas trouver 'anaconda' 'anarchiste' 'panama' ...

Toujours pas

par desparlsp » 28 juil. 2009, 17:34

Salut a nouveau,

decidement ca ne marche pas...

Si je retire les %, c'est simple cela ne me donne aucun resultat. Je ne sais pas pourquoi. Peut etre a cause de la variable $description[$z]???, $z correspondant au nombre de mots si il y en a plusieurs...

En effet, le resultat est toujours 0 donnees trouvees.

Par contre a propos de la fonction Match, je ne sais pas comment la mettre en oeuvre. J'ai lu l'article mais je ne saisi pas bien ce que peu signifier AGAINST..... :?

Merci

David

Re: Probleme avec like et recherche mot exact

par Victor BRITO » 28 juil. 2009, 17:24

Il y auraitune fonction MATCH je crois non?
Si, MATCH () AGAINST (), avec MySQL, pour la recherche en texte intégral. ;)

par agité » 28 juil. 2009, 17:24

Si tu veux une recherche exact alors pourquoi ne pas simplement supprimer les joker % ?

Je n'y arrive pas

par desparlsp » 28 juil. 2009, 17:17

Salut,

Je ne comprend pas tres bien la fonction SOUND et elle semble un peu sujette a caution et n'etant pas pros je n'arrive pas a la mettre en place...malgre mes recherche sur google en anglais et francais....

Par contre j'ai bien modifie le code en rajoutant le code indiquee ci-dessus et le resultat est le meme.

Si je cherche "ana" j'obtien encore une fois l'exemple suivant :

"ana"
"anaconda" etc..

or je voudrais uniquement chercher et afficher le terme exact, soit ana

merci a vous tous

David

David