L'action NewTextSearch à pour but de complétrer voir de remplacer l'action TextSearch
Présentation
J'ai fait une action qui, basée directement sur une requête SQL, permet l'utilisation de paramètres de recherche spéciaux:
- "_" pour remplacer un caractère inconnu.
- "%" pour remplacer une chaîne de caractères inconnus.
- Utilisation de moins de 4 caractères de recherche
Info sur
ContributionsClesEnMain et
chez moi.
Mise en place
En complément
Copiez newtextsearch.php dans /actions et appelez la fonction avec NewTextSearch
En substitution
Renommez newtextsearch.php en textsearch.php et copiez le dans /actions
Code source v1.6
<?php
/*
Copyright 2004 Nicolas FORGEARD-GRIGNON
nicephore17 **at** adminrezo.net
REMERCIEMENT à toute l'équipe de WikiNi.net pour son aide
15/12/2004 - V1.6 Passage à la méthode GET
12/12/2004 - v1.5 Optimisation de la sécurité et des performances
09/12/2004 - v1.4 Optimisation SQL utilisation des classes WikiNi
07/12/2004 - v1.3 Sécurisation au lancement de l'action hors WikiNi
Amélioration du SQL: ne liste pas les pages non accessibles
Activation de toutes les fonctionnalités de {{textsearch}}
06/12/2004 - v1.2 modification des caractères spéciaux
06/12/2004 - v1.1 correction du bug des recherches successives
04/12/2004 - v1.0 initial release
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
3. The name of the author may not be used to endorse or promote products
derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
INFORMATION D'UTILISATION
Copiez le dans /action et appelez le avec {{newtextsearch}}
Vous pouvez renommer ce fichier en textsearch.php pour remplacer l'ancien.
*/
// Empéche l'execution php en direct
if (!defined('WIKINI_VERSION')) {die ('accès direct interdit');};
// Initialisations de base
if (!defined('NTS_VERSION')) {define('NTS_VERSION' , '1.6');};
if (!defined('AFFICHER_COMMENTAIRES')) {define('AFFICHER_COMMENTAIRES' , FALSE);};
$prefixe = $this->config['table_prefix'] ;
$user = $this->GetUser();
$AfficherFormulaire = TRUE;
// On récupére ou initialise toutes le varible comme pour textsearch
// label à afficher devant la zone de saisie
$label = $this->GetParameter('label', 'Ce que vous souhaitez chercher : ');
// largeur de la zone de saisie
$size = $this->GetParameter('size', '40');
// texte du bouton
$button = $this->GetParameter('button', 'Chercher');
// texte à chercher
$phrase = $this->GetParameter('phrase');
// séparateur entre les éléments trouvés
$separator = $this->GetParameter('separator');
// Récupération de la chaine de recherche
if ($_GET['phrase']) { $phrase = $_GET['phrase']; };
if ($separator) { $AfficherFormulaire = FALSE; };
// Affichade de la version en commentaire HTML
echo ("<!-- Action New Text Search version ".NTS_VERSION." -->\n\n");
// Affichage du formulaire de saisie
if ($AfficherFormulaire) {
// Hack pour la compatibilité XHTML
$URL = htmlSpecialChars($_SERVER['REQUEST_URI']);
// Code de la méthode GET
echo ("<form action='$URL' method='get'>
<input type='hidden' name='wiki' value='".$this->GetPageTag()."' />
<strong>$label</strong><input type='text' name='phrase' value='' size='$size' />
<input type='submit' value='$button'/></form>
<small>Un caractére inconnu peut être remplacé par \"?\" plusieurs par \"*\"
</small><br />\n\n");
};
// Lancement de la recherche
if ($phrase) {
// Modification de caractère sépciaux
$phrase= str_replace(array('*','?'), array('%','_'),$phrase);
$phrase = addslashes($phrase);
// Blablabla SQL
$requestfull = 'SELECT tag FROM '.$prefixe.'pages
LEFT JOIN '.$prefixe.'acls ON tag = page_tag AND privilege = "read"
WHERE latest = "Y"
AND ( list IS NULL OR list ="*" '.
($user ? 'OR owner = "'.$user['name'].'" OR list = "+" OR (list NOT LIKE "%!'.$user['name'].'%" AND list LIKE "%'.$user['name'].'")':'').')'.
(AFFICHER_COMMENTAIRES ? '':'AND tag NOT LIKE "comment%"').
' AND body LIKE "%' . $phrase . '%"
ORDER BY tag';
// Exécution de la requete
if ($resultat = $this->LoadAll($requestfull)) {
// Affichage des resultats
// Restauration de la chaine de base
$phrase = str_replace(array('%','_'), array('*','?'),$phrase);
// Affichage des résultats en liste
if (empty($separator)) {
echo $this->Format('---- --- **Résultats de la recherche [""'.$phrase.'""] :---**');
echo ('<ul>');
foreach ($resultat as $line) { echo ("<li>".$this->ComposeLinkToPage($line['tag'])."</li>\n");};
echo ('</ul>');
// Affichage des r?sultats en ligne
} else {
echo ('<br />');
foreach ($resultat as $line) { echo ($this->ComposeLinkToPage($line['tag']).' ');};
};
} else {
echo $this->Format('---- --- **Désolé mais il n\'y a aucun de résultat pour votre recherche.**');
};
};
?>
Discussion
INSEREZ ICI LES COMMENTAIRES D'ORDRE GÉNÉRAL
(Indépendents des versions)
version 1.4 out
Avant d'ajouter des fonctionnalités (si si j'ai des idées) il faudrait vérifier la qualité du code. De plus on pourrait peut-être optimiser la gestion du formulaire en utilisant des classes de
WikiNi plutôt que du code HTML.
- Je n'ai pas encore porté une grande attention à la création de formulaire, mais ça me parait en effet être une bonne idée d'utiliser ces méthodes simplificatrices (en fait je pense que ça ne sert qu'à en ouvrir et en fermer...)
- Sinon comme idée je serais assez partant pour permettre à l'utilisateur de faire des combinaisons dans ses recherches avec des AND, OR et NOT... ah mais pour ça on pourra récupérer mon code de l'ActionCondition en fait je pense :-P -- LordFarquaad
- Autre idée à ne pas oublier: permettre de limiter le nombre de résultats, à la fois dans le formulaire et dans les arguments de l'action... (lol ton test dans le BacASable) -- LordFarquaad
Merci à toi
LordFarquaad -- De rien, c'est avec plaisir :-) --
LordFarquaad
- -- Nicephore17
- Je vais jetter un oeil à ton nouveau code alors :-) -- LordFarquaad
- Je m'y mets, je reprends depuis le début:
- par convention on met des noms en majuscules pour les constantes, mais bon...
- "Commentaires" me paraît être un terme un peu trop général pour une chose réservée à une seule action... je pense qu'il serait préférable d'utiliser une variable de toute façon.
- essaie d'appeler ton action deux fois... et oui, on ne peut pas redéfinir une constante, c'est logique non ? (tu dois donc vérifier si ta constante est déjà définie avec defined())
- oups, je n'avais pas vu ça: "include('wakka.config.php');", très mauvais ! La confguration est stockée dans $this->config en fait.
- je te conseillerais de stocker $this->GetUser() dans $user, tu n'as pas besoin de la valeur dans le cas où l'utilisateur n'est pas connecté (ça servira plus loin)
- le deuxième argument de $this->GetParameter() est facultatif en fait, sa valeur par défaut est la chaine vide ( '' )
- à quoi sert $separator ? c'est pour une versio ultérieure ? je ne sais pas si c'est très utile en fait...
- pour le formulaire:
- je pense qu'on peut se passer de l'argument 'action' s'il s'agit de la page courante, à vérifier (sur w3c.org)
- tu devrais régler la taille en utilisant le css (si je ne me trompe: style="width: 40px"... mais en fait il est préférable d'utiliser les "em" à la place des "px" [1em = hauteur d'un charactère, donc si le visiteur change la taille du texte dans son navigateur, la taille de ta boite change avec :-) très agréable pour les mal voyants)
- utilisation de $_REQUEST: cette variable regroupe $_POST, $_GET et $_COOKIES, mais les priorités d'insertions dépendent de la configuration de php... Je te conseille donc d'aller voir directement dans le tableau qui t'intéresse, et de définir toi-même les priorités. Pour vérifier si un élément existe, utilise isset() ou empty() (personnellement je préfère le deuxième), sinon tu afficheras des notices en mode error_reporting = E_ALL (j'en déduits d'ailleurs que tu ne développes pas en E_ALL, mais je te conseille vraiment de le faire parce que ça te permet d'afficher, entre autres, l'utilisation de variables non initialisées, celles-ci étant de potentielles failles de sécurité...). Voici un exemple de code qui donne la priorité à la valeur passée par la méthode post, ensuite get et pour finir celle imposée dans l'action (si ce n'est pas celle-là en dernier, pourquoi réafficher le formulaire vu qu'il ne marchera pas...):
<?php
if(!empty($_POST['request'])) $request = $_POST['request'];
elseif(!empty($_GET['request'])) $request = $_GET['request']; // ou phrase si tu préfères... autant être cohérant et utiliser partout les mêmes indexes, ça me parait plus clair.
else $request = $this->GetParameter('request'); // idem
?>php
- lancement de la recherche:
- Note: avec le bout de code que je donne ci-dessus, on est certain que $request est défini, on n'est donc pas obligé d'utiliser isset() ou empty().
- if( $machin != '' ) revient exactement au même que if( $machin ) car avec le cast automatique, une chaine vide est transformée en la valeur booléenne false. En fait ton test est similaire à if( $bidule != false ) ("erreur" fréquente chez les débutants dans tous les langages de programmation...)
- optimisation de ton for: $request = addcslashes(addslashes($request), '%_'); // on échappe échappe tous les carractères dangereux (antislash, guillemets simples et doubles et carractère //NUL//) avec addslashes, ensuite on permet la recherche de "mots" contenant les charactères '%' et '_' en échappant ceux-ci avec addcslashes()
str_replace(array('*', '?'), array('%', '_')); // on permet d'utiliser * et ? comme jockers
- la requête:
- tu devrais repasser privilege = "read" dans le LEFT JOIN, sinon celui-ci ne sert à rien... (et on aura jamais le cas list = NULL)
- si tu as fait le remplacement de GetUserName() par GetUser(), tu peux remplacer $this->GetUser() par $user
- si tu as appliqué mon optimisation de ton for, enlève le addslashes(), puisque je le fais dans l'optimisation.
- le foreach
- $i ne te sert pas, tu peux te contenter de as $line (je ne sais pas s'il y a un gain de performances notoire, mais bon, autant éviter l'inutile...)
- $this->Format(' - '.$line['tag'].'---');: regarde plus haut ce que j'avais fait, explication:
- format vérifie à toujours si un lien pointe vers une page qui existe avant de le créer (pour voir s'il faut un lien simple ou un point d'interrogation) = une requête, or tu es certain que la page existe...
- il y a un "tracking" des liens pour lier une page à toutes les autres pages dont elle possède des liens. Ce tracking est effectué lors de l'édition de la page, mais ton affichage est dynamique (deux affichages de la même recherche n'afficheront pas forcément les résultat). Il faut donc éviter le "tracking" de ces liens-là.
- pour éviter cela, j'utilisais ComposeLinkToPage qui d'une part ne vérifie pas si l'existance de la page et d'autre part permet, via son dernier argument, de désactiver le LinkTracking. (il existe aussi deux méthodes pour l'activer/désactiver, mais le problème c'est qu'en les utilisant tu n'es pas certain de restaurer le LinkTracking à son état précédent, après formatage de ton lien...). Ensuite je le réinsérais dans la chaine entre des guillemets doubles, pour pouvoir utiliser Format et générer facilement mes listes. Optimisation: générer toute la chaine de résultat et le passer en un coup à Format. Le code XHTML en sortie en sera bien meilleur (et plus court, sinon Format crée une liste pour chaque élément, ce qui supprime en fait l'intérêt des listes...)
- Pfiou, eh bien me voilà au bout ;-) Désolé s'il y a des fautes, mais j'ai la flemme de me relire et j'ai confiance en moi ^^ (enfin, au moins à moitié, je suppose qu'il n'y a pas de grosses fautes ;-) ) -- LordFarquaad
Je n'ai pas le temps de suivre mais je sens qu'il va en sortir quelque chose de chouette :) N'hésitez pas à jardiner la page quand vous aurez des choses montrables ;) --
CharlesNepote
Je fatigue un peu là... il faut que je respire alors je passe un peu à
ActionMailToUser... :D dès que j'aurais avancé sur le mail je reviens avec comme projet minimum d'utiliser les classes Wikini pour la gestion du formulaire. Une fois que tout marchera et que le code sera propre, j'étudierais la possibilité d'ajouter un champ de recherche (Contenu de la page, Nom de l'auteur ou Titre de la page).
Votre aide m'est précieuse... Merci beaucoup... Désolé pour les pages que je génère, se sait que ce n'est pas un forum mais je suis tellement fébrile...
--
Nicephore17
Bon je vais voir ce que je peux faire quand (calendrier plein) je dois le faire... Tes explications sont claires ça derait aller vite vers la version 1.5 (il se trouve que
WikiNi est aussi un bout outil pédagogique poru mon apprentissage de PHP)
--
Nicephore17
Version 1.5 out
Ca y est, j'ai suivi tes instructions pas à pas, cependant...
- ActionNewTextSearch doit pouvoir remplacer ActionTextSearch c'est pour cela qu'elle passe plein de paramètres et que je ma gestion des priorité de passage de paramètre sont bizarre... Par exemple, sur AdminRezo.net, l'ActionTextSearch n'existe plus, son code à été subsititué par ActionNewTextSearch. Tu comprendras alors pourquoi certaines choses sont un peu flou. Pareillement, le petit moteur de recherche dans le footer pointe vers mon action.
- J'ai eu de soucis avec addslashes, j'ai bricolé, j'espère que c'est correct.
- J'ai réabilité l'utilisation du paramétre (bizard je l'accorde) separator tel que décrit dans ActionTextSearch.
- J'arrive pas à mettre en page avec ComposeLinkToPage?() et Format() ensemble donc j'ai laissé tel quel.
NOTA: Les fichiers seront sur mon serveur dans kk minutes
J'ai vérifié dans mon php.ini, la fonction error_reporting = E_ALL est conforme à ce que tu me disais.
--
Nicephore17
N'hésite pas à publier ton code ici même.
- Je pense que c'est un peu trop long...
- (Tu as essayé entre deux %%(php) [ton code php] %% ? Ca reste lisible même si c'est long.)
Je n'ai pas regardé le code mais j'ai déjà quelques remarques :
- je trouve préférable, dans le cas de la recherche, d'utiliser une requête GET plutôt qu'un POST comme tu le proposes. A vrais dire, je ne saisi pas la nuance, si tu pouvais m'expliquer... de même que j'ai du mal à interpréter le code de actiontextsearch
Et à part ça les variables sont dans $_GET au lieu de $_POST et c'est tout? Tu ne serais pas sur MSN par hasard?
- Oui. Je ne compte pas utiliser MSN et je ne recommanderai pas son usage :
- MSN Messenger est un protocole propriétaire qui contribue à rendre ses utilisateurs toujours un peu plus prisonnier d'une société connue pour ses pratiques commerciales douteuses (vente liée, abus de monopole, etc.)
- jabber me donne pleine satisfaction du point de vu fonctionnel, c'est un protocole libre et maintenant normalisé par l'IETF (il existe des dizaines de clients différents pour toutes plateformes)
Nicephore17 rajoute:
Hihihi on croirait m'entendre quand je parle d'OpenOffice.... Bon je promet que je vais faire un effort pour Jabber... j'ai eu des souci avec la dernière fois et je n'arrive pas à faire suivre les collègues/amis/famille là dedans... ceci dit je ne suis pas complètement pourri: je tourne avec aMSN.
Pour la méthode GET j'y cours de suite... et je publie la 1.6 dans la foulée... j'attendais ton avis.
PAR CONTRE (si j'ai bien compris) la méthode GET à un énorme inconvénient... la pages RechercheTexte doit absolument exister... Ceci me semble une contrainte inutile... De plus, TextSearch et elle souvent utilisée dans les pages, est il vraiement nécessaire de conserver le code du séparateur... je pense ouvrir un vote pour le passage de la 1.6 à 1.7, je laisse certains morceaux de code au cas où... J'aimerais qu'on se mette d'accord là dessus après quoi je pourrais attaquer le suite (ex: Mots clef OU et ET, recherche dans les titres ou dans les noms d'utilisateurs etc)
- Pour l'inconvéniant, tu te trompes. En fait techniquement GET et POST fonctionnent exactement de la même façon côté PhP (et au niveau HTTP il n'y a pas d'énormes changements non plus). Dans n'importe quel script, si tu modifies tous les formulaires GET en formulaires POST et que tu fais les remplacements de variable, le script fonctionnera toujours.
- Pour ce qui est des fonctionnalités supplémentaires, je pense que plus il y en a, mieux ce sera. La décision à prendre c'est peut-être de choisir entre des mots clefs en Anglais ou en Français... -- LordFarquaad
- dans le formulaire il y a une petite erreur HTML : <input type="text" name="request" value='' size="40em" /> : l'attribut size ne prend pas d'unité "em" (c'est en CSS) ; "40" suffit Corrigé pour la prochaine version
- la liste à puce qui génère les résultats est très bizare : en fait tu établis pour chaque résultat une liste à puce avec une seule puce : que de code gaspillé ;) Corrigé pour la prochaine version
Exemple :
<ul>
<li> <a href="http://www.adminrezo.net/wakka.php?wiki=ActionTrail">ActionTrail</a><br /></li>
</ul>
alors qu'il suffirait de :
<li><a href="http://www.adminrezo.net/wakka.php?wiki=ActionTrail">ActionTrail</a></li>
--
CharlesNepote
Nicephore17 ajoute: je verrais ça se soir.
Note à effacer : une raison pour laquelle j'apprécie tout particulièrement cette action, c'est la possibilité de faire des recherches sur des mots de 3 lettres (voir moins). Pour moi, cette raison justifie à elle seule l'intégration à
WikiNi. --
CharlesNepote
Version 1.6b out
Méthode GET
Bon je met à dispo la 1.6b et je vais me coucher.
Comme je ne suis pas tout à fait sûr de moi je le met en béta j'ai laissé une grande partie de l'ancien code (entre /* ... */) et pas mal d'autres commentaires dedans. Inutile de les répéter ici. Si vous voulez y jeter un oeil téléchargez là
ici.
OBJECTIFS: J'aimerais qu'on valide ça vite fait (le passage POST -> GET) que j'applique quelques correctifs: ($request -> $phrase pour la cohérence) et qu'on puisse se concentrer sur les objectifs vers la 2.0 (à savoir pas de fonction en plus mais un code presqueparfait...).
PETITE PROPOSITION: j'ai pris l'habitude d'afficher la version en haut, je propose de ne l'afficher que si le mode debug est activé.
Et encore
merci de votre aide.
Bonne nuit (je suis fatigué mais qu'est ce que je m'éclate...)
Je pense que je vais faire un peu de ménage sur cette page demain, ça commence à être long et plus ou moins illisible...
--
Nicephore17
Mes commentaires sur ta 1.6b :
- on y est presque
- bravo pour les commentaires dans le code, une bonne habitude
- ta requête GET ne fonctionne pas si on emploi une autre page de RechercheTexte ; voici le correctif :
echo '<form action="' . $_SERVER['PHP_SELF'] . '" method="get">
- <input type="hidden" name="wiki" value="'.$this->GetPageTag().'" />
- <strong>' . $label . '</strong>
- <input type="text" name="phrase" value="'. $request . '" size="' . $size . '" />
- <input type="submit" value="' . $button . '" /></form>
- <small>Un caractére inconnu peut être remplacé par "?" plusieurs par "*"
- <br />NewTextSearch? v' . NTS_VERSION . '</small>';
- remarques de détail :
- l'intruction PHP "echo" n'a pas besoin de parenthèses : echo "toto"; (c'est plus facile à lire)
- en PHP, il n'y a pas besoin de point-virgule ";" après une accolade fermante
- lors d'une structure nécessitant des accolades, tâche au minimum d'introduire des espaces de part et d'autre
- n'oublie pas la lisibilité du code HTML généré : c'est plus pratique pour déboguer et ça donne l'image d'un outil propre ; par exemple, veille à mettre des retours de lignes aux endroits stratégiques ; pour présenter ta liste j'écrirais par exemple :
echo "<ul>\n";
- foreach ($resultat as $line)
- {
- echo '<li>'.$this->ComposeLinkToPage($line['tag'])."</li>\n";
- }
- echo "</ul>\n";
Bon bon bon...
- echo et les parenthéses c'est une de mes habitude... Toujours ou jamais et la meilleure façon de ne pas oublier... Mais je ferais un effort.
- Le point virgule après une accolade... idem.. je l'oublie tellement souvant que bon... et puis c'est pas grave si on le met ;)
- Les espace entre accolade... Oui! Là j'ai pas bien fait.
- HTML... je n'y avais même pas pensé...
La 1.6 finale sera online ce soir avec les petites modifs énoncées ci-dessus.
Je fais quoi pour l'affichage de la version en dessous du formulaire?
--
Nicephore17
- Pour la version au dessous du formulaire, je la virerai : elle risque de provoquer des questions chez l'utilisateur final alors qu'il n'y a pas lieu de s'en poser. Eventuellement, tu peux la mettre dans un commentaire HTML, cela peut aider pour débogage et le support ; du style, juste après la balise <form> : <!-- Action New Text Search v. 1.6 --> -- CharlesNepote
Version 1.6 out
Bon j'ai mis tout ça à jour avec:
- Une seule variable au lieu de $phrase et $request
- Epuration du code (encore....)
- Contrôle de la lisibilité du code source HTML
- Contrôle de la validité XHTML 1.0
- Conservation de la requête SQL (c finalisé ça à mon avis)
- Masquage de la version (commentaire HTML)
Merci encore et toujours.
Maintenant je vais peut-être laisser courir un peu avant de passer à la 1.7
C'est bien beau de coder pour la communauté mais j'ai pas grand monde pour s'occuper de
mon site or j'ai du travail à faire sur son contenu.
Je me suis permis de supprimer les commentaires antérieur à la version 1.4 pour "nettoyer" un peu la page j'espère que vous ne m'en voudrez pas.
--
Nicephore17
- Je vais sur la page de demo pour tester la nouvelle recherche de texte.. j'entre le mot "present" par exemple, il me sort plein de pages... je vais sur la premiere et... pas de mot "present". Je ne sais pas si c'est moi ou le moteur de recherche mais y'a rien de mieux par rapport au moteur par defaut : inutile (en tout cas pour moi). -- ArtemiS
-> Il semblerait qu'il ai une confusion entre caractères accentués ou non, j'y regarderais. --
Nicephore17
-> A priori, cela vient d'une limitation de
MySQL au niveau de la gestion des accents, je ne vois pas de solution pour le moment --
Nicephore17
- Oui c'est sûr: tu utilises la fonction LIKE qui, comme son nom l'indique, fait des recherches de mots qui ressemblent à ce que tu veux. Cela implique qu'il n'y a pas d'influence des majuscules, et que le comportement quand aux accents dépend de la locale du serveur... Si on veut éviter cela il faut utiliser REGEXP, qui est malheureusement beaucoup plus lourd... (ou, comme avant, la recherche en texte intégral...) Il faudrait tout de même vérifier que c'est bien ce qui se produit chez ArtemiS et non un vétirable bug... -- LordFarquaad
j'ai vérifié... Ceci dit REGEXP permet une plus grand flexibilité, il pourrait être intéressant de l'utiliser. --
Nicephore17
- Ah oui je viens d'y jetter un oeil et de fait ce n'est pas génial les résultat, une recherche de "present" ne devrait pas trouver "présente" mais bien par contre une recherche de "present?"... Avec un LIKE il n'y a pas moyen de différencier les deux, ça c'est certain. Je me demande s'il ne serait pas bon de proposer un choix entre recherche classique (qui se ferait avec LIKE) et une recherche exhaustive (qui se ferait avec REGEXP et donnerait des résultats plus précis). Le problème avec REGEXP c'est qu'il faut faire gaffe puisqu'il y a des tas de carractères qui ont un sens (parenthèses, classes etc.) Je pense que le mieux avec REGEXP c'est de procéder comme ceci:
- Echappement de tous ces carractères avec preg_quote
- remplacement des valeurs échappées du "?" et de "*" par, respectivement, "." et ".*" (rien n'empêche de proposer aussi le "+", comme je l'avais déjà proposé pour LIKE...)
- faire la recherche avec l'option i (insensible à la casse) et éventuellement s (les points peuvent ainsi remplacer aussi les retours à la ligne, pas sûr que ce soit une bonne ou une mauvaise chose dans le cas présent...)
- -- LordFarquaad
Misc.
Problème de download déplacé sur la page
ActionAttachBug. --
Nicephore17