Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PHP & MySQL
PHP & MySQL Forum d'entraide sur les fonctions MySQL avec PHP. Avant de poster -> FAQ MySQL, Cours MySQL et Sources MySQL. Pour les questions concernant le moteur MySQL plutôt que les fonctions PHP, merci d'utiliser le forum MySQL.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 28/09/2011, 17h18   #1
Membre habitué
 
Inscription : avril 2010
Messages : 307
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 307
Points : 109
Points : 109
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.
mesken est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/09/2011, 18h16   #2
Expert Confirmé
 
Avatar de Séb.
 
Inscription : mars 2005
Messages : 2 823
Détails du profil
Informations personnelles :
Âge : 34
Localisation : France

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

Informations forums :
Inscription : mars 2005
Messages : 2 823
Points : 3 454
Points : 3 454
Citation:
Quelqu'un a t-il une idée ?
Probablement une divergence de charset.
__________________
Un problème exposé clairement est déjà à moitié résolu
Keep It Smart and Simple
Séb. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/09/2011, 20h42   #3
Membre habitué
 
Inscription : avril 2010
Messages : 307
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 307
Points : 109
Points : 109
Peut-être, mais pourquoi seulement sur les champs BLOB , TEXT et LONGTEXT, pourquoi ça marche partout ailleurs ?
mesken est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/09/2011, 22h12   #4
Expert Confirmé
 
Avatar de Séb.
 
Inscription : mars 2005
Messages : 2 823
Détails du profil
Informations personnelles :
Âge : 34
Localisation : France

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

Informations forums :
Inscription : mars 2005
Messages : 2 823
Points : 3 454
Points : 3 454
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.
__________________
Un problème exposé clairement est déjà à moitié résolu
Keep It Smart and Simple
Séb. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/09/2011, 01h42   #5
Membre habitué
 
Inscription : avril 2010
Messages : 307
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 307
Points : 109
Points : 109
OK, dans ma base de données, j'ai une table simple avec trois champs:
Code :
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 :
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 :
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>
mesken est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/09/2011, 01h46   #6
Modérateur
 
Inscription : septembre 2010
Messages : 7 131
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 131
Points : 8 491
Points : 8 491
pourquoi tu travailles pas en utf-8 ?
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/09/2011, 08h44   #7
Expert Confirmé
 
Avatar de Séb.
 
Inscription : mars 2005
Messages : 2 823
Détails du profil
Informations personnelles :
Âge : 34
Localisation : France

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

Informations forums :
Inscription : mars 2005
Messages : 2 823
Points : 3 454
Points : 3 454
@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.
__________________
Un problème exposé clairement est déjà à moitié résolu
Keep It Smart and Simple
Séb. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/10/2011, 08h49   #8
Membre habitué
 
Inscription : avril 2010
Messages : 307
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 307
Points : 109
Points : 109
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
mesken est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/10/2011, 00h41   #9
Membre habitué
 
Inscription : avril 2010
Messages : 307
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 307
Points : 109
Points : 109
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
mesken est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/10/2011, 00h50   #10
Modérateur
 
Inscription : septembre 2010
Messages : 7 131
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 131
Points : 8 491
Points : 8 491
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
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/10/2011, 09h33   #11
Membre habitué
 
Inscription : avril 2010
Messages : 307
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 307
Points : 109
Points : 109
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 :
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
mesken est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/10/2011, 10h07   #12
Modérateur
 
Inscription : septembre 2010
Messages : 7 131
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 131
Points : 8 491
Points : 8 491
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
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/10/2011, 20h39   #13
Membre habitué
 
Inscription : avril 2010
Messages : 307
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 307
Points : 109
Points : 109
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
mesken est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/10/2011, 10h10   #14
Nouveau Membre du Club
 
Inscription : novembre 2007
Messages : 43
Détails du profil
Informations personnelles :
Âge : 37

Informations forums :
Inscription : novembre 2007
Messages : 43
Points : 32
Points : 32
Citation:
J'aimerai aussi savoir si c'est possible de changer l'Interclassement de toutes les tables à l'aide d'une commande
Oui :
Code :
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
Citation:
mysql_query("SET NAMES UTF8");
pour que les transactions se fassent dans le bon charset.
greg91 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/10/2011, 10h23   #15
Modérateur
 
Inscription : septembre 2010
Messages : 7 131
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 131
Points : 8 491
Points : 8 491
Citation:
Envoyé par greg91 Voir le message
Code :
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
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/10/2011, 10h56   #16
Nouveau Membre du Club
 
Inscription : novembre 2007
Messages : 43
Détails du profil
Informations personnelles :
Âge : 37

Informations forums :
Inscription : novembre 2007
Messages : 43
Points : 32
Points : 32
Citation:
c'est mysql_set_charset

Ouuups désolé
greg91 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/10/2011, 13h07   #17
Membre habitué
 
Inscription : avril 2010
Messages : 307
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 307
Points : 109
Points : 109
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
mesken est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h18.


 
 
 
 
Partenaires

Hébergement Web