8797 sujets

Développement web côté serveur, CMS

Bonjour à tous,

J'ai développé un petit moteur de recherche sur un site et je me demandais si la lettre "x" avait une signification particulière en SQL car quand je fais une recherche sur cette lettre, mon moteur m'affiche des articles qui ne contient pas de "x" ...

Voici une partie de la requete :


WHERE
spo_articles.art_designation LIKE '%".$val."%' OR  
spo_articles.art_description LIKE '%".$val."%' OR 
spo_marques.mar_nom LIKE '%".$val."%' OR 
spo_categories.cat_nom LIKE '%".$val."%'";


$val = x
Modifié par sharky (29 Apr 2009 - 17:37)
De toute façon pour avoir des résultats exploitables il vaut mieux limiter les recherches aux expressions de plus de 2 caractères. Smiley smile

a écrit :
$val = x

Ah bon, pas $val = 'x'?
a écrit :
De toute façon pour avoir des résultats exploitables il vaut mieux limiter les recherches aux expressions de plus de 2 caractères.


Si je tape, par exemple "xt", j'ai le même problème Smiley smile

a écrit :
Ah bon, pas $val = 'x'?


Je vérifie cela demain Smiley cligne
Salut,

Florent V. a écrit :
Ah bon, pas $val = 'x'?

Techniquement, ça revient au même. Sans les quotes (ou doubles quotes), PHP va interpréter ça comme une constante, ne va pas la trouver définie et du coup va utiliser la lettre telle quelle (non sans ressortir une belle notice si elles sont affichées, du genre : Notice: Use of undefined constant x - assumed 'x').

Exemple :

echo x; // Affiche x


@sharky : Sans plus d'informations, on aura du mal à te répondre. Un exemple précis de ta requête exécutée (sans les variables PHP donc) et les résultats ressortis par cette requête nous seraient utiles.
Bonjour,

Je viens de comprendre ...
J'utilise un éditeur wysiwyg dans mon panneau d'administration qui me génère du css.
Donc, si je souligne quelque chose dans cet éditeur > "text-decoration:underline;"

Arf ... Comment faire pour que mon moteur ne prenne pas en compte les éventuelles balises html rencontrées sur son chemin Smiley smile

J'y réfléchi ...
Salut,

sharky a écrit :
Arf ... Comment faire pour que mon moteur ne prenne pas en compte les éventuelles balises html rencontrées sur son chemin Smiley smile
Une solution simple serait d'ajouter un champ dans ta table qui serait l'équivalent du champ formaté mais après un strip_tags. Et c'est donc sur ce champ que s'effectuerait la recherche.
Si j'avais pensé à ce problème en début de projet, cette solution aurait pu être envisageable.
Mais maintenant, j'ai déjà une volée d'enregistrement dans ma DB ...
sharky a écrit :
Si j'avais pensé à ce problème en début de projet, cette solution aurait pu être envisageable.
Mais maintenant, j'ai déjà une volée d'enregistrement dans ma DB ...
Ouais enfin bon : c'est un script de 5 lignes ! Smiley langue

Tiens d'ailleurs je te le donne :
<?php
$sql = 'Select id, champ_formate from matable';
$result = mysql_query($sql);
while ($row = mysql_fetch_assoc($result)) {
	$sql2 = 'update matable set nouveau_champ = \''.strip_tags($row['champ_formate']).'\' where id = '.$row['id'];
	mysql_query($sql2);
}
?>
Smiley lol

Merci, mais plus sincèrement, ça m'ennuie de dupliquer le contenu dans ma DB pour un module de recherche.

J'aimerais trouvé une autre solution.

Je vais faire quelques recherches ... Peut-être aussi décortiquer le code d'un CMS pour voir comment ils font.

Si je trouve quelque chose de convaincant, je vous tiens informé Smiley cligne
Tu peux aussi développer une fonction strip_tags en MySQL que tu utilises au moment du SELECT. Smiley murf (en plus elle se trouve en cherchant sur Google)
Agylus a écrit :
Tu peux aussi développer une fonction strip_tags en MySQL que tu utilises au moment du SELECT. Smiley murf (en plus elle se trouve en cherchant sur Google)
+1 (sauf qu'une recherche dans le contenu est déjà très gourmande en ressources et que ça ne fait qu'augmenter la charge).

Personnellement j'utilise 2 méthodes :
* soit un index fulltext sur un (ou des) champ(s) strip_tagué(s).
* soit je parse le contenu au moment de l'insert/update et pour chaque mot je crée un enregistrement dans une table recherche (mot, lien_vers_la_page, note) dont la note vaut 1 ou plus si le mot était dans un titre. C'est un peu lourd mais comme ce n'est fait qu'une fois (par insert/update) la recherche est elle-même très rapide et permet également de trier en fonction de la "pertinence".
Modifié par Heyoan (29 Apr 2009 - 14:57)
Sauf qu'après, à lui aussi d'optimiser ses requêtes de recherche. En effet, l'utilisation du OR plombe les performances, parce pour chaque condition MySQL va parcourir toute la table. Il est plus judicieux dans ce cas-là de ne pas utiliser les opérateurs de logique, mais des fonctions qui s'exécutent plus rapidement.

Un exemple d'optimisation de sa requête serait :

WHERE
   IFNULL( spo_articles.art_designation LIKE '%".$val."%', 
      IFNULL( spo_articles.art_description LIKE '%".$val."%',
         IFNULL( spo_marques.mar_nom LIKE '%".$val."%',
            IFNULL( spo_categories.cat_nom LIKE '%".$val."%', 0 )
         )
      )
   )";
Agylus a écrit :
Sauf qu'après, à lui aussi d'optimiser ses requêtes de recherche.
C'est clair. Smiley cligne
a écrit :

Tu peux aussi développer une fonction strip_tags en MySQL


Je ne connaissais pas les fonctions mysql Smiley confused
Je viens de jeter un coup d'oeil et je patauge un peu ... De plus, j'ai des erreurs avec phpmyadmin quand j'essaye d'en "intégrer" une ...

a écrit :

Sauf qu'après, à lui aussi d'optimiser ses requêtes de recherche


Ne soyez pas trop dur avec moi Smiley cligne

a écrit :

Un exemple d'optimisation de sa requête


Je note Smiley smile

Edit : note perso : penser à m'offir un bouquin sur mysql Smiley langue
Modifié par sharky (29 Apr 2009 - 15:58)
Merci Heyoan.

Tiens, j'ai essayé :


WHERE

   IFNULL( spo_articles.art_designation LIKE '%".$val."%', 

      IFNULL( spo_articles.art_description LIKE '%".$val."%',

         IFNULL( spo_marques.mar_nom LIKE '%".$val."%',

            IFNULL( spo_categories.cat_nom LIKE '%".$val."%', 0 )

         )

      )

   )";


Il me renvoie moins de résultat qu'auparavant ...
Bon, malgré que je ne suis pas tout a fait convaincu, j'ai fini par choisir ta solution Heyoan > un champ supplémentaire dans ma DB avec strip_tags.

J'ai pas trouvé mieux pour l'instant ...

Et ca fonctionne nickel.

Il me semble que c'est à chaque fois toi qui me sauve la mise sur ce forum Smiley lol

Merci aux autres aussi bien entendu !