IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Full Text sensible à la casse :( [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre averti
    Inscrit en
    Juin 2008
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 34
    Par défaut Full Text sensible à la casse :(
    Bonsoir tout le monde,

    Dans le manuel de MySql il est écrit noir sur blanc que la recherche FULLTEXT n'est pas sensible à la casse. Pourtant, mes tests me montrent l'inverse. Ma base est en UTF8-bin et mon système est un dérivé UNIX (Mac OS Leopard), ça peut venir de là ?

    Au cas où ce soit utile, voici la façon dont je fais ma recherche, c'est un peu compliqué mais c'est parce que je dois générer ma requête à partir d'un formulaire dont on ne remplit pas forcément tous les champs. Bref, y'a de la concaténation à tout va...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    <?php
    function DisplayNews() {
    	if (!empty($_POST['news_search'])) {
    		$news = '
    			<ul>
    		';
    		if (!empty($_POST['day'])) {
    			$day = "jour = " . $_POST['day'] . "";
    			if (!empty($_POST['month']) OR !empty($_POST['year']) OR !empty($_POST['keywords'])) {
    				$day.= ' AND ';
    			}
    		}
    		if (!empty($_POST['month'])) {
    			$month = "mois = " . $_POST['month'] . "";
    			if (!empty($_POST['year']) OR !empty($_POST['keywords'])) {
    				$month.= ' AND ';
    			}
    		}
    		if (!empty($_POST['year'])) {
    			$year = "annee = " . $_POST['year'] . "";
    			if (!empty($_POST['keywords'])) {
    				$year.= ' AND ';
    			}
    		}
    		if (!empty($_POST['keywords'])) {
    			$keywords = "MATCH (titre,contenu) AGAINST ('" . $_POST['keywords'] . "')";
    		}
    		$__news = mysql_query("SELECT * FROM news WHERE $day$month$year$keywords") or die (mysql_error());
    		while ($_news = mysql_fetch_array($__news)) {
    			$news.= '
    				<li>' . $_news['contenu'] . '</li>
    			';
    		}
    		$news.= '
    			</ul>
    		';
    		echo $news;
    	}
    }
    ?>
    Merci d'avance pour votre passage sur ce post

    P.S. J'ai bien sûr créé un index sur les colonnes idoines et j'ai réussi à avoir des requêtes qui marchent si je respecte les majuscules.

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Plutot que de commencer par le code, execute plutot ta requete finale avec phpmyadmin avec ou sans majuscule.
    Si a ce moment la, tu as des resultats differents, donne nous la requete et un dump de ta table.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre averti
    Inscrit en
    Juin 2008
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 34
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM news WHERE MATCH (titre,contenu) AGAINST ('Robin')
    -> Fonctionne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM news WHERE MATCH (titre,contenu) AGAINST ('robin')
    -> Pas de résultat

    Et voici le dump (j'ai rempli avec un peu n'importe quoi...)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    -- phpMyAdmin SQL Dump
    -- version 2.11.9.2
    -- http://www.phpmyadmin.net
    --
    -- Serveur: localhost
    -- Généré le : Lun 09 Mars 2009 à 22:24
    -- Version du serveur: 5.0.67
    -- Version de PHP: 5.2.6
     
    SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
     
    --
    -- Base de données: `alternanse`
    --
     
    -- --------------------------------------------------------
     
    --
    -- Structure de la table `news`
    --
     
    CREATE TABLE IF NOT EXISTS `news` (
      `id` int(11) NOT NULL auto_increment,
      `jour` int(2) NOT NULL,
      `mois` int(2) NOT NULL,
      `annee` int(4) NOT NULL,
      `titre` varchar(255) collate utf8_bin NOT NULL,
      `contenu` text collate utf8_bin NOT NULL,
      PRIMARY KEY  (`id`),
      FULLTEXT KEY `titre` (`titre`,`contenu`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=8 ;
     
    --
    -- Contenu de la table `news`
    --
     
    INSERT INTO `news` (`id`, `jour`, `mois`, `annee`, `titre`, `contenu`) VALUES
    (5, 2, 1, 2000, 'Hind', 0x48696e64204d61686d6f756469),
    (4, 1, 1, 2000, 'Robin', 0x526f62696e204d61796f6c),
    (6, 2, 1, 2000, 'Les gens', 0x736f6e742073796d706173),
    (7, 3, 2, 2001, 'Test', 0x746573746920746573746f);

  4. #4
    Membre émérite Avatar de obito
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2008
    Messages
    773
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2008
    Messages : 773
    Par défaut
    Bonsoir ! Bon ok je vais contourner le probleme mais pour ca je sais pas trop quoi proposer d'autre:

    http://fr2.php.net/manual/fr/function.ucfirst.php

    A savoir mettre le premier caractère de ta variable en majuscule avant la requete

    bon je sais pas propre du tout puisque tu aura surement des mot sans majuscules... A voir donc =)

  5. #5
    Membre averti
    Inscrit en
    Juin 2008
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 34
    Par défaut
    Héhé j'y ai pensé, tester les deux à chaque fois, voire même le mot tout en majuscules mais bon... Je préfère garder ça en dernier recours !

  6. #6
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Fiou j'ai cherché ...
    La réponse est dans la doc en anglais :

    By default, the search is performed in case-insensitive fashion. However, you can perform a case-sensitive full-text search by using a binary collation for the indexed columns. For example, a column that uses the latin1 character set of can be assigned a collation of latin1_bin to make it case sensitive for full-text searches.
    Pour les non-anglophone : par defaut la recherche n'est pas sensible a la casse sauf pour les collations binaires.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  7. #7
    Membre émérite Avatar de obito
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2008
    Messages
    773
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2008
    Messages : 773
    Par défaut
    J'imagine ! Je viens de lire deux trois choses sur le fulltext ta méthode semble la bonne pourtant, c'est bien un match avec un against... donc niveau syntaxe rien à dire, il reste donc un problème au niveau base de donnée? Au niveau mySQL c'est bon ... donc peut être au niveau construction de la table? ^^

  8. #8
    Membre averti
    Inscrit en
    Juin 2008
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 34
    Par défaut
    Citation Envoyé par obito Voir le message
    J'imagine ! Je viens de lire deux trois choses sur le fulltext ta méthode semble la bonne pourtant, c'est bien un match avec un against... donc niveau syntaxe rien à dire, il reste donc un problème au niveau base de donnée? Au niveau mySQL c'est bon ... donc peut être au niveau construction de la table? ^^
    En tout cas merci beaucoup pour ton implication ! Je sais que je m'étais mis au UTF8-bin pour que ma base soit sensible aux accents, et puis l'UTF8 c'est l'avenir, le genre de truc qui nous ©%vite pas mal de probl$€~mes

    Je crois que je suivre ton conseil du post précédent, de toute façon faut que je gère les éventuelles fautes de frappe aussi... D'ailleurs je m'en vais tout de suite tester ce que ça donne avec "SOUND LIKE" !

  9. #9
    Membre averti
    Inscrit en
    Juin 2008
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 34
    Par défaut
    Avec SOUNDS LIKE ça ne cherche pas dans le contenu (TEXT) que dans le titre (VARCHAR)...


  10. #10
    Expert confirmé
    Avatar de N1bus
    Homme Profil pro
    Dev. Web & OpenERP
    Inscrit en
    Janvier 2003
    Messages
    2 827
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Dev. Web & OpenERP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 827
    Par défaut
    Bonjour,

    J'ai eu le problème aussi , mais :

    Citation Envoyé par Doc MySql
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('MySQL');
    La recherche du mot MySQL ne donne aucun résultat dans l'exemple précédent, car il est présent dans plus de la moitié des lignes. Ainsi, il est considéré comme un mot à ignorer (un mot avec une valeur sémantique nulle).

    Si tu cherches un mot dans tes 100 lignes de la table alors qu'il est présent dans + de 50 lignes, MySql le considère comme un mot à ignorer.

    Ainsi, c'est peut-être le cas pour "robin " mais pas "Robin" ???

  11. #11
    Membre averti
    Inscrit en
    Juin 2008
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 34
    Par défaut
    Bien vu, mais j'ai déjà vérifié cette hypothèse !

    J'ai fini par faire une colonne annexe toute en minuscules sans accents sur laquelle je fais un LIKE %%...

    Je dois quand même mettre résolu même si j'ai contourné le problème ?

  12. #12
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    ba vu que j'ai donné la réponse mais que personne m'ecoute ...
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  13. #13
    Membre averti
    Inscrit en
    Juin 2008
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 34
    Par défaut
    J'étais passé à côté ! Merci Sabotage ! (fan des Beastie Boys ?)

    J'aime bien ma colonne en UTF8, elle m'évite d'avoir à mettre des fonctions partout pour convertir les caractères... Je pense que je vais faire une colonne contenant la même chose mais en Latin.

    Merci beaucoup à tous pour vos réponses et votre patience

  14. #14
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    heu non ce n'est pas un probleme de latin/utf8 mais un probleme de _bin.
    tu peux mettre ta colonne en utf8_unicode_ci par exemple
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  15. #15
    Membre averti
    Inscrit en
    Juin 2008
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 34
    Par défaut
    Okééé ! Je viens de comprendre un nouveau truc du coup

    Je pensais que les collations étaient des "variantes" de l'encodage mais ce sont bien deux choses différentes donc.

    S'il y en a qui sont aussi ignorants que moi :

    http://dev.mysql.com/doc/refman/5.0/...t-general.html

    Merci encore sabotage

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Surligner texte rechercher : sensible à la casse
    Par benjea06 dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 09/04/2014, 11h58
  2. [MySQL] Finesse avec full text sur l'orthographe, comment être moins sensible
    Par yule dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 01/11/2010, 16h35
  3. probleme avec une requete full text
    Par maxxou dans le forum Langage SQL
    Réponses: 2
    Dernier message: 07/03/2005, 17h20
  4. [Info]moteur de recherche full text en environnement j2ee
    Par ddams dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 03/11/2004, 19h39
  5. Recherche FULL Text existe que dans MySql ?
    Par seb.49 dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 01/06/2004, 22h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo