8791 sujets

Développement web côté serveur, CMS

Je lis sur la page :
J'ai un problème de pertinence sur les résultats donnés par la page :
http://www.ubaye-verdon.net/barcinonien/formthm.html
Ainsi, lorsque je tape par exemple "crête", j'obtiens des résultats correspondants aussi bien à "discrère" qu'à "secrète" ou "acreté", ou aussi "secrétement"...
On m'a dit qu'il fallait faire une modification de la table.
J'ai lu sur la page suivante de la doc.MySQL:
//dev.mysql.com/doc/refman/5.0/fr/fulltext-search.html[/url]" rel="nofollow noopener" >http: Smiley url //dev.mysql.com/doc/refman/5.0/fr/fulltext-search.html[/url]

<i>Les index FULLTEXT sont utilisés avec les tables MyISAM et peuvent être créés depuis des colonnes de types CHAR, VARCHAR, ou TEXT au moment de CREATE TABLE ou plus tard avec ALTER TABLE ou CREATE INDEX. </i>

Voici ma question :
Comment faire un ALTER TABLE...
Il faut rédiger une requête SQL, n'est-ce pas ?
C'est cette requête que je ne sais rédiger....
Je suppose qu'il faut mettre :
ALTER TABLE X (FULLTEXT(col1,col2,col3,etc...));
Est-ce exact ?
Merci pour vos conseils à venir.[b][/url][#][/i]
Salut lavercq et bienvenue Smiley cligne ,

le plus simple serait de passer par PhPMyAdmin et de créer une clef de type FULLTEXT sur ta table.

Au final il s'agira effectivement d'une requête SQL ressemblant à
 ALTER TABLE matable ADD FULLTEXT (
colonne1 ,
colonne2
) 

A+
Merci pour cette réponse rapide !
Je remarque qu'il faut mettre 'ADD' avant 'FULLTEXT'...

et pas simplement:
ALTER TABLE matable (FULLTEXT(col1,col2,col3,etc...));

mais, cela me confirme en outre,que l'on peut appliquer FULLTEXT à plusieurs colonnes en une seule requête

Je pense qu'il n'y a aucun risque d'altération de ma table...n'est-ce pas ?
Serait-il préférable d'en faire une sauvegarde préalable ?
lavercq a écrit :
Je pense qu'il n'y a aucun risque d'altération de ma table...n'est-ce pas ?
Serait-il préférable d'en faire une sauvegarde préalable ?
Ah si ! Il y aura forcément altération de ta table avec un ALTER TABLE Smiley lol !!!

Blague à part, c'est un index comme un autre et c'est dissocié des données et de la structure. Donc inutile de faire une sauvegarde (même si c'est une bonne idée d'en faire une de temps en temps !) Smiley cligne .

A+
Je vais peut-être abuser ...?
Mais, après avoir fait convenablement cette modification de ma table, il faut que je rédige ma requête PHP en conséquence...

La page 12.6. Recherche en texte intégral (Full-text) dans MySQL indique :
mysql> SELECT * FROM articles
-> WHERE MATCH (title,body) AGAINST ('database');
http://dev.mysql.com/doc/refman/5.0/fr/fulltext-search.html

Jusqu'ici j'utilisais LIKE %$searchtext%
Est-il possible d'écrire ceci en PHP:
SELECT * FROM articles
    ->          WHERE MATCH (title,body) AGAINST ($searchtext);
Cela ne marche pas ...!
en effet, je viens de lire dans la doc MySQL que :
L'argument de AGAINST() doit être une chaîne constante.
Or,j'utilise un formulaire qui envoie une variable : $searchtext...
<input type="text" name="searchtext" /><input type="submit" name="submit" value="Chercher" />

je ne vois pas comment éviter de passer une variable...?
Error retrieving mots from database!<br />Error: You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'AND MATCH (col1,col2,col3,col4,col5,col6,col7)AGAINST ($searchtext) order by ...
Smiley confus
Re',

un petit exemple dans ce post...

ce qui donnerait quelque chose comme :
$sql = "SELECT id, MATCH (titre,texte) AGAINST ('$searchtext') FROM tatable";
$result = mysql_query($sql) or die(mysql_error());

Modifié par Heyoan (22 Apr 2008 - 23:52)
Error retrieving mots from database!
Error: You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'AND MATCH (col1,....) AGAINST ('$searchtext') order by...

Je lis sur la page :http://dev.mysql.com/doc/refman/5.0/fr/fulltext-restrictions.html[/url=]
12.6.3. Restrictions avec la recherche en texte intégral

ceci qui me dérange : L'argument de AGAINST() doit être une chaîne constante.

Dans ces conditions comment peut-on passer une variable comme $searchtext...?

Je ne comprends pas pourquoi ça ne marche pas ! Smiley decu
lavercq a écrit :
ceci qui me dérange : L'argument de AGAINST() doit être une chaîne constante.
Oui, cela ne veut pas dire qu'il faut toujours faire la recherche sur le même mot Smiley biggol ! Je le comprends plutôt comme le fait qu'il ne faut pas utiliser la forme %searchtext%...

Moi ce qui me dérange c'est de voir :
...AGAINST ('$searchtext') [b]order by[/b]...
alors que ce devrait être un From matable order by... Smiley murf .

Le plus simple serait de montrer ton code.

A+
Voici le code (j'ai seulement remplacé les noms de colonnes par leur numéro)
$select='SELECT DISTINCT ID,col1,col2,col3,col4,col5,col6,col7,col8,col9,col10,col11';
$from   = 'FROM matable ';
$where  = ' WHERE 1=1';
if(!isset($_POST['searchtext'])){$searchtext = ""; 
} else { 
$searchtext = $_POST['searchtext'];}
if ($searchtext != '') { 
$where.=" AND MATCH (col1,col2,col3,col4,col5,col6,col7,col8,col9,col10,col11) AGAINST ('$searchtext') ";}


Et le retour après interrogation :
<p>Error retrieving mots from database!<br />Error: You have an error in your SQL syntax.
Check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE 1=1 AND MATCH (tradfr,autresens,remarque,locfr,etymologie</p>
Hem... il manque le code qui vient juste après Smiley murf !

Et surtout la requête exacte qui est effectuée.
Merci Heyoan pour ton aide, grâce à tes questions j'ai pu approfondir ma recherche et trouver dans le code ce qui n'allait pas.
Je peux si tu le souhaites t'envoyer le code après correction.
Maintenant, ça marche comme je le souhaitais, c'est-à-dire que la recherche se fait bien sur le mot exact et non plus en retournant des mots qui contenaient le mot demandé.
Merci infiniment.
Ouf ! me voici soulagé, je vais pouvoir continuer à recopier mon dictionnaire. (tout en cherchant à améliorer la présentation...)
Bonne continuation dans tes projets et Bonne journée. Smiley biggrin
You're welcome Smiley cligne !
lavercq a écrit :
Je peux si tu le souhaites t'envoyer le code après correction.
Et bien tu pourrais effectivement le poster ici : cela pourrait dépanner quelqu'un qui s'interroge sur le FULLTEXT Smiley langue ...
Voici la ligne la plus importante pour la recherche fulltext:
$select="select * from matable where MATCH (col0,col1,col2,col3,col4,col5,col6) AGAINST ('$searchtext')" ;

Cependant, il faut noter qu'en "fulltext", les mots recherchés doivent avoir plus de trois lettres, ce qui n'est pas le cas pour la recherche avec like (LIKE '%$item%')

Eventuellement, je me tiens à la disposition de qui souhaiterait un coup de main,ceci dans la mesure de mes petits moyens... Smiley rolleyes