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 15/05/2011, 20h04   #1
Membre du Club
 
Avatar de scrouet
 
Inscription : décembre 2003
Messages : 198
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : décembre 2003
Messages : 198
Points : 44
Points : 44
Par défaut Gestion caractères spéciaux

Bonjour.

Je viens de migrer mon ensemble Apache 2.2.6 / PHP 5.2.3 vers Apache 2.2.18 / PHP 5.3.6.
Et là, oh surprise, les caractères spéciaux ne sont plus gérés correctement. Lorsque je consulte les données dans la base MySQL, pas de soucis. Mais lorsque je demande à mes scripts PHP d'afficher le résultat des requêtes SQL, j'ai n'importe quoi.
Je ne comprends pas ce qui s'est passé. Une idée ?
scrouet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/05/2011, 20h08   #2
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 381
Points : 16 381
L'encodage de ta base de données a du changer.
Si tu obtiens des é la base fourni de l'UTF8 et toi tu affiches en ISO
Si tu obtiens des �, c'est l'inverse.
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/05/2011, 20h08   #3
Membre Expert
 
Inscription : septembre 2010
Messages : 1 242
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 1 242
Points : 1 564
Points : 1 564
L'encodage par défaut a peut être changé et l'encodage à utiliser n'est pas spécifié dans tes scripts php ?

Tu dis que cela affiche n'importe quoi, mais quoi par exemple ?
__________________
- Réalisations
- Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical.
ABCIWEB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/05/2011, 21h44   #4
Membre du Club
 
Avatar de scrouet
 
Inscription : décembre 2003
Messages : 198
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : décembre 2003
Messages : 198
Points : 44
Points : 44
Par exemple j'ai des é à la place des é.
Je ne précise aucun encodage dans mes pages HTML.
Le jeu de caractère pour MySQL est a priori UTF-8 et ça n'a pas changé (je n'ai pas fait de mise à jour de ce côté-ci).
scrouet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/05/2011, 21h53   #5
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 381
Points : 16 381
Citation:
Je ne précise aucun encodage dans mes pages HTML.
fais le
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/05/2011, 22h05   #6
Membre Expert
 
Inscription : septembre 2010
Messages : 1 242
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 1 242
Points : 1 564
Points : 1 564
Pour passer en utf-8 il y a pas mal de tutos. Par exemple un premier ici.
__________________
- Réalisations
- Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical.
ABCIWEB est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 16/05/2011, 21h41   #7
Membre du Club
 
Avatar de scrouet
 
Inscription : décembre 2003
Messages : 198
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : décembre 2003
Messages : 198
Points : 44
Points : 44
J'ai ajouté la balise
Code :
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1" />
Ça ne change rien.
scrouet est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 16/05/2011, 21h44   #8
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 381
Points : 16 381
Citation:
Envoyé par scrouet Voir le message
Le jeu de caractère pour MySQL est a priori UTF-8
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/05/2011, 23h15   #9
Membre du Club
 
Avatar de scrouet
 
Inscription : décembre 2003
Messages : 198
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : décembre 2003
Messages : 198
Points : 44
Points : 44
Ce n'est pas mieux en encodage utf-8. En fait j'ai écrit dans un fichier de logs ce que le script PHP reçoit de la base de données : ça n'est déjà pas bon. J'ai l'impression que c'est au niveau de l'exécution de la requête que ça coince.
scrouet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2011, 02h30   #10
Membre Expert
 
Inscription : septembre 2010
Messages : 1 242
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 1 242
Points : 1 564
Points : 1 564
Tu as lu le tuto que je t'ai mis en lien ?
Essayes de mettre
SET NAMES "utf8";
avant ta requête.
__________________
- Réalisations
- Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical.
ABCIWEB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2011, 10h13   #11
Modérateur
 
Inscription : septembre 2010
Messages : 7 103
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 103
Points : 8 466
Points : 8 466
sous mysql utilise mysql_set_charset
sous mysqli utilise mysqli_set_charset
sous pdo_mysql utilise le parametre charset dans le dsn (PHP 5.3.6) ou fait un SET NAMES (mais c'est pas le même effets)
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2011, 16h08   #12
Membre Expert
 
Inscription : septembre 2010
Messages : 1 242
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 1 242
Points : 1 564
Points : 1 564
Citation:
sous mysql utilise mysql_set_charset
sous mysqli utilise mysqli_set_charset
Oui c'est recommandé mais (cf doc) ces fonctions requièrent MySQL version 5.0.7 ou supérieure.
__________________
- Réalisations
- Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical.
ABCIWEB est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 18/05/2011, 16h24   #13
Modérateur
 
Inscription : septembre 2010
Messages : 7 103
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 103
Points : 8 466
Points : 8 466
Citation:
Envoyé par ABCIWEB Voir le message
Oui c'est recommandé mais (cf doc) ces fonctions requièrent MySQL version 5.0.7 ou supérieure.
ça commence a bien dater cette version
c'est surtout que les fonctions là agissent en interne sur les autres (pour mysql_real_escape_string par exemple, qui ducoup prend le bon charset alors qu'avec SET NAMES il sera pas prit en compte)
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2011, 19h58   #14
Membre Expert
 
Inscription : septembre 2010
Messages : 1 242
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 1 242
Points : 1 564
Points : 1 564
Citation:
Envoyé par stealth35 Voir le message
ça commence a bien dater cette version
c'est surtout que les fonctions là agissent en interne sur les autres (pour mysql_real_escape_string par exemple, qui ducoup prend le bon charset alors qu'avec SET NAMES il sera pas prit en compte)
Ben oui mais y'a quelques mois j'ai voulu updater tous mes sites avec ces fonctions et j'ai dû y renoncer pour deux d'entre eux car la version mysql sur un mutualisé était encore 5.0.3. C'est pour cela que je précise de faire attention

Pour le reste je savais que ces fonctions étaient recommandées par rapport à SET NAME mais je ne savais pas exactement pourquoi. Merci de la précision
__________________
- Réalisations
- Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical.
ABCIWEB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/05/2011, 23h00   #15
Membre du Club
 
Avatar de scrouet
 
Inscription : décembre 2003
Messages : 198
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : décembre 2003
Messages : 198
Points : 44
Points : 44
Bon, si je résume ce que j'ai compris, il faut que j’homogénéise mes jeux de caractères entre ma base de données, mes scripts et mes pages Web.
Du coup, deux questions :
  1. Sachant que mes sites sont très majoritairement en français et qu'il n'y a pas de langues non européennes, ne serait-il pas plus pertinent de me contenter du jeu de caractères ISO-8859-15 ?
  2. Comment dois-je procéder pour faire cette homogénéisation ?
scrouet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/05/2011, 23h10   #16
Modérateur
 
Inscription : septembre 2010
Messages : 7 103
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 103
Points : 8 466
Points : 8 466
Citation:
Envoyé par scrouet Voir le message
Sachant que mes sites sont très majoritairement en français et qu'il n'y a pas de langues non européennes, ne serait-il pas plus pertinent de me contenter du jeu de caractères ISO-8859-15 ?
non utf-8 partout, il n'y a aucun intérêt a travailler en iso-8859-1 sachant que l'utf-8 comprend tout ces caractères

il faut bien mettre tout tes table en utf-8, ainsi que tes entete html (content-type/charset) et aussi tes fichiers doivent être en utf-8 (a régler dans ton éditeur), pour finir ton serveur doit envoyer les en tetes de pages en utf-8 tu dois aussi faire comme AB t'as dis au niveau de ta connexion mysql, si tu respecte tout ça tu n'aura plus de probleme d'encodage et tu seras dans la "norme" actuelle
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2011, 04h29   #17
Membre Expert
 
Inscription : septembre 2010
Messages : 1 242
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 1 242
Points : 1 564
Points : 1 564
Je rejoins stealth35, pendant que tu te penche sur l'encodage autant utiliser la norme actuelle qui est l'utf-8. D'ailleurs pas mal de fonction php requièrent l'utf8 comme json_encode etc
Et puis même si tes sites sont en français ça te permet de mélanger plusieurs langues dans un même document, ce qui te permettra donc de dire que bonjour s'écrit こんにちは en japonais
__________________
- Réalisations
- Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical.
ABCIWEB est déconnecté   Envoyer un message privé Réponse avec citation 11
Vieux 22/05/2011, 21h42   #18
Membre du Club
 
Avatar de scrouet
 
Inscription : décembre 2003
Messages : 198
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : décembre 2003
Messages : 198
Points : 44
Points : 44
Bon. Je pense avoir suivi toutes les étapes du tuto mentionné plus haut :
  • J'ai ajouté le tag meta correct au début des fichiers HTML.
  • J'ai enregistré mes fichiers en UTF-8 (avec PSPad).
  • J'ai ajouté "AddDefaultCharset utf-8" à la fin du fichier hhtpd.conf et j'ai redémarré mon serveur.
  • J'ai modifié ma base de données via phpMyAdmin.
  • J'ai ajouté "charset=utf-8" à la fin de mon DSN (j'utilise PDO pour la connexion à la base de données).
Mais ça ne suffit pas. Aurais-je fait quelque chose de travers ?
scrouet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2011, 22h27   #19
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 381
Points : 16 381
Tu as changé l'encodage de mysql ? Tu as essayé avec SET NAMES ?
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2011, 09h55   #20
Modérateur
 
Inscription : septembre 2010
Messages : 7 103
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 103
Points : 8 466
Points : 8 466
Citation:
Envoyé par scrouet Voir le message
J'ai ajouté "charset=utf-8" à la fin de mon DSN (j'utilise PDO pour la connexion à la base de données).
Mais ça ne suffit pas. Aurais-je fait quelque chose de travers ?
le charset c'est uniquement à partir de la 5.3.6 (en espérant que t'as la bonne version)
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 11h54.


 
 
 
 
Partenaires

Hébergement Web