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 :

Recherche avec un mot clé contenant les accents [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre éclairé
    Inscrit en
    Avril 2010
    Messages
    342
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 342
    Par défaut Recherche avec un mot clé contenant les accents
    Bonjour,

    SVP tout est OK dans l'affichage de mes textes, tout marche normalement. Mais lorsque j'effectue une recherche dans mon formulaire avec un mot clé ayant des accents, rien ne s'affiche, pourtant le mot clé existe bien dans la table dans plusieurs occurrences.

    Dans ma table, mon champ est de type TEXT et l'interclassement est à latin1_general_ci .

    Je voudrais préciser que avec le type VARCHAR ça marche parfaitement, mais lorsque je dois utiliser un type pour les gros textes, il faut passer à autre chose et je ne peux pas utilisé BLOB par ce qu'il est sensible à la casse, je ne peux que utiliser TEXT ou LONGTEXT mais aucun ne gère les accents comme je veux.

    Quelqu'un a t-il une idée ?

    Merci.

  2. #2
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 317
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 317
    Billets dans le blog
    17
    Par défaut
    Quelqu'un a t-il une idée ?
    Probablement une divergence de charset.

  3. #3
    Membre éclairé
    Inscrit en
    Avril 2010
    Messages
    342
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 342
    Par défaut
    Peut-être, mais pourquoi seulement sur les champs BLOB , TEXT et LONGTEXT, pourquoi ça marche partout ailleurs ?

  4. #4
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 317
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 317
    Billets dans le blog
    17
    Par défaut
    Citation Envoyé par mesken Voir le message
    Peut-être, mais pourquoi seulement sur les champs BLOB , TEXT et LONGTEXT, pourquoi ça marche partout ailleurs ?
    Peut-être parce qu'avec MySQL on peut donner un charset différent à chaque champ. Tu peux vérifier ça sous phpMyAdmin.
    Eventuellement donne-nous un court dump de ta BdD et un petit script PHP à tester.

  5. #5
    Membre éclairé
    Inscrit en
    Avril 2010
    Messages
    342
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 342
    Par défaut
    OK, dans ma base de données, j'ai une table simple avec trois champs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE TABLE `nbase_bd`.`lexique` (
    `Num` INT( 9 ) NOT NULL AUTO_INCREMENT ,
    `Mot` VARCHAR( 255 ) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL ,
    `Explication` TEXT CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL ,
    PRIMARY KEY ( `Num` ) 
    ) ENGINE = InnoDB
    J'insère deux occurrences, pour le champ Explication, j'abrège le texte... pour vous épargner de trop de textes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    INSERT INTO `lexique` (`Num`, `Mot`, `Explication`)VALUES (NULL , 'éventail', 'L'éventail est un accessoire de mode et de confort dont la principale...')
     
    INSERT INTO `lexique` (`Num`, `Mot`, `Explication`)VALUES (NULL , 'économie', '...Cependant, le mot est polysémique. L’économie est le concept étudié par les sciences économiques...')
    Et sur mon formulaire PHP, j'ai une zone de texte sur laquelle on tape la recherche du mot et on a l'explication venant du lexique, selon le bout de code suivant :
    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    <form id="form1" name="form1" method="post" action="">
    <table width="577" border="0" cellspacing="0" cellpadding="0">
      <tr>
        <td width="282">&nbsp;</td>
        <td width="180">
            <input type="text" name="Recherche" id="Recherche" size="30"/>
        </td>
        <td width="12">&nbsp;</td>
        <td width="103"><input type="submit" name="button" id="button6" value="Rechercher" /></td>
      </tr>
      <tr>
        <td>&nbsp;</td>
        <td>&nbsp;</td>
        <td>&nbsp;</td>
        <td>&nbsp;</td>
      </tr>
      <tr>
        <td colspan="2">
     
        <?php
     
    //Récupération de la valeur de la zone de texte et paramétrage pour récupérer tout contient ce que l'on saisi
     	 $Rechercher=$_REQUEST["Rechercher"];  
    	 $Rech='%'.$Rechercher.'%';
     
    //Sélection dans la BD
    	 $query="SELECT * FROM lexique WHERE Mot LIKE '$Rech' OR Explication LIKE '$Rech'";
    	 $resultat=mysql_query($query);
     
    //Parcourt du résultat et affichage
      if ($resultat){
    	while($ligne=mysql_fetch_array($resultat)){
    		$Mot=$ligne['Mot'];
    		$Explication=$ligne['Explication'];
    		$DefinitionFr=$ligne['val6'];
     
    //Suppression des slash qui ont été ajoutés à l'enregistrement pour gérer les simples cotes
    		$Mot=stripslashes($Mot);
    		$Explication=stripslashes($Explication);
     
    //Affichage du résultat proprement dit
    		echo '<font face="Verdana" size="2" color="#006498" ><strong>'.$Mot.'</strong></font><br>';
     
    		echo '<font face="Arial" size="2" color="#000000" >'.$Explication.'</font></a>';
    		echo '<br><br>';
     
    	}
    }
     
     
    	?>
     
        </td>
        <td>&nbsp;</td>
        <td>&nbsp;</td>
      </tr>
    </table>
     </form>

  6. #6
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    pourquoi tu travailles pas en utf-8 ?

  7. #7
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 317
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 317
    Billets dans le blog
    17
    Par défaut
    @mesken
    Après correction du nom de champ chez moi la recherche d'un mot accentué fonctionne correctement.
    Attention aux charsets PHP / MySQL, assure-toi d'avoir du Latin-1 ou ISO-8859-1 partout.

  8. #8
    Membre éclairé
    Inscrit en
    Avril 2010
    Messages
    342
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 342
    Par défaut
    J'ai mis du temps à répondre parce que je voulais tester tout ce que je pouvais tester et être sûr avant de repondre. Mais sincèrement je ne sais pas ce qui se passe. La recherche avec les accents ne passe toujours pas sur certains champs pourtant ça passe sur d'autres, je ne comprends pas vraiment se qui se passe. Tous les champs ont pourtant le même Interclassement.

    J'ai mis du Latin1_general_ci Séb., j'ai même laissé la valeur par défaut Latin1_swedish_ci, j'ai même utilisé utf8 stealth35 sans changement


    Merci

  9. #9
    Membre éclairé
    Inscrit en
    Avril 2010
    Messages
    342
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 342
    Par défaut
    Merci beaucoup Séb. et stealth35 et tous les autres. Je n'ai pas encore trouvé la solution mais j'ai une piste très intéressante qui nous aidera tous. En fait voici ce que j'ai découvert :

    Le problème vient en fait de l'éditeur FCKEditor. Lorsque j'utilise une zone de texte normale pour enregistrer les données dans la table, la recherche se passe normalement avec ou sans accents, mais lorsque j'utilise l'éditeur pour enregistrer les données sur les gros champs, la recherche avec les accents ne marche pas.

    Je suis allé un peu plus loin dans ma recherche, et je me rend compte dans la table, lorsque je passe par une zone de texte simple pour enregistrer le mot évènement par exemple, dans la table, j'ai ceci évènement, mais lorsque je passe par l'éditeur, j'ai ceci dans la table
    &eacute;v&egrave;nement, donc en fait avec l'éditeur, le codage est différent et c'est ça qui pose problème

    Comment je peux résoudre ce problème SVP

    Merci

  10. #10
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    les insert n'était pas bons, dans ta table les donnée doivent être sans traitement, donc va falloir réparé ça, tout récupéré et tout réimporté dans le bon format

  11. #11
    Membre éclairé
    Inscrit en
    Avril 2010
    Messages
    342
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 342
    Par défaut
    OK, merci beaucoup stealh35
    Pour enregistrer des valeurs dans toutes les tables de mon application, voici ce que je fais. Soient deux champs Nom et Prenom d'une table employe

    Lorsque l'utilisateur envoit le formulaire, je fais ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    //Récupération des valeurs saisis
    $Nom=$_REQUEST["Nom"];
    $Prenom=$_REQUEST["Prenom"];
     
    //Ajout des slash au cas où l'on entrait des valeurs avec des cotes
    $Nom=addslashes($Nom);
    $Prenom=addslashes($Prenom);
     
    //Enregistrement des données proprement dit
    requete="INSERT INTO `employe` (`Nom`, `Prenom`)VALUES ('Nom', 'Prenom')";
    resultat=mysql_query(requete);
    Et dans MySQL, je crée juste la BD , je cré la table avec les champs et je laisse l'Interclassement par défaut (Latin1_swedish_ci). Je ne fais rien d'autre

    STP il y a t-il un Script de plus à ajouter dans PHP ou quelques chose d'autre à faire dans MYSQL pour parvenir à ce que tu dis ?

    Merci

  12. #12
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    c'est pas addslashes mais mysql_real_escape_string
    tu dois aussi faire un mysql_set_charset après la connexion, je te conseil de travailler en utf-8

  13. #13
    Membre éclairé
    Inscrit en
    Avril 2010
    Messages
    342
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 342
    Par défaut
    Merci beaucoup stealth35, ça marche !!!!!

    J'aimerai aussi savoir si c'est possible de changer l'Interclassement de toutes les tables à l'aide d'une commande, parce que j'ai environ 100 tables et je voudrais les mettre toutes à utf8 et ce sera pénible de le faire champ après champ.
    Et aussi je voudrais savoir si c'est possible de définir l'Interclassement par défaut de chaque table qui sera créée ?

    Merci

  14. #14
    Membre confirmé Avatar de greg91
    Homme Profil pro
    Administrateur système
    Inscrit en
    Novembre 2007
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur système

    Informations forums :
    Inscription : Novembre 2007
    Messages : 121
    Par défaut
    J'aimerai aussi savoir si c'est possible de changer l'Interclassement de toutes les tables à l'aide d'une commande
    Oui :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ALTER TABLE `nom_table` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci
    Mais cela ne convertis pas les caractères spéciaux html... Donc cela ne suffira pas.
    Je verrai plus plus une petite boucle avec un décodage des caractères html mais il y a peut-être mieux, je ne sais pas.

    Aprés le connexion à ta base, met un
    mysql_query("SET NAMES UTF8");
    pour que les transactions se fassent dans le bon charset.

  15. #15
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    Citation Envoyé par greg91 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mysql_query("SET NAMES UTF8");
    Aprés le connexion à ta base, met un pour que les transactions se fassent dans le bon charset.
    c'est mysql_set_charset

  16. #16
    Membre confirmé Avatar de greg91
    Homme Profil pro
    Administrateur système
    Inscrit en
    Novembre 2007
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur système

    Informations forums :
    Inscription : Novembre 2007
    Messages : 121
    Par défaut
    c'est mysql_set_charset

    Ouuups désolé

  17. #17
    Membre éclairé
    Inscrit en
    Avril 2010
    Messages
    342
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 342
    Par défaut
    OK, merci beaucoup pour le charset par défaut sur chaque table.

    Pour que les transactions se fassent avec le bon charset, je l'ai déjà fait plus haut, selon l'astuce que m'a donné stealth35 , c'est pourquoi je disais que ça marche !!

    Merci encore

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

Discussions similaires

  1. [MySQL] recherche avec plusieurs mots clé
    Par RAtiche dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 09/05/2008, 17h03
  2. recherche avec plusieurs mots-clé
    Par MAMANHOU dans le forum IHM
    Réponses: 6
    Dernier message: 12/07/2007, 10h05
  3. Réponses: 4
    Dernier message: 01/03/2006, 13h58
  4. Réponses: 6
    Dernier message: 04/11/2005, 17h09
  5. Réponses: 3
    Dernier message: 25/07/2005, 18h41

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