Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Outils
Outils Forum d'entraide sur les outils pour MySQL. Avant de poster -> Outils 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 06/01/2007, 06h09   #1
Modérateur
 
Avatar de ymoreau
 
Homme Yoann Moreau
Ingénieur en laboratoire de recherche
Inscription : septembre 2005
Messages : 724
Détails du profil
Informations personnelles :
Nom : Homme Yoann Moreau
Âge : 26
Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Ingénieur en laboratoire de recherche
Secteur : Enseignement

Informations forums :
Inscription : septembre 2005
Messages : 724
Points : 1 130
Points : 1 130
Par défaut [PHP/MySQL] Problème d'encodage

Bonjour, je débute plus ou moins en base de données et php, j'ai un site assez simple où j'enregistre des textes avec un formulaire XHTML qui sont envoyés dans la base de données puis réaffichés en PHP.

La base de données est celle fournie avec un espace perso Free. Après avoir lu plusieurs avis, j'ai choisi d'enregistrer dans la base de données le texte brut puis de convertir avec les caractères spéciaux HTML seulement à la lecture des tables.

Le problème est que lors de l'envoi du texte (l'enregistrement dans la table) certains caractères spéciaux sont transformés
j'entre ceci dans le formulaire :
é è à ç
dans mon code php la variable $texte réaffiche ces mêmes caractères, par contre lorsque je vais lire la base de données (à partir d'un autre code php, et sur le site de gestion en ligne phpmyadmin.free.fr) c'est ceci qui est affiché (sans les espaces sur le code html) :
é & #232 ; & #224 ; ç

voici la portion de code
Code :
1
2
3
echo "Texte : $texte";
$cmd = "REPLACE INTO db_news(date,texte) VALUES('$date','$texte')";
IF(!($result = mysql_query($cmd)))
sachant que l'echo de la variable $texte m'affiche correctement les lettres, c'est seulement dans la base de données qu'elles sont modifiées.

Merci d'avance
ymoreau est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2007, 09h47   #2
Invité de passage
 
Inscription : janvier 2007
Messages : 10
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 10
Points : 4
Points : 4
Envoyer un message via MSN à harbout_jr Envoyer un message via Skype™ à harbout_jr
essaye ça:
utf8_decode() lors de la lecture
harbout_jr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2007, 10h26   #3
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 540
Points : 9 540
quel est le jeu de caractères de ta page ?

comment visualises-tu ce qu'il y a dans ta base ? est-ce que ce ne serait pas juste un mauvais réglage de phpMyAdmin ?
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2007, 11h49   #4
Modérateur
 
Avatar de ymoreau
 
Homme Yoann Moreau
Ingénieur en laboratoire de recherche
Inscription : septembre 2005
Messages : 724
Détails du profil
Informations personnelles :
Nom : Homme Yoann Moreau
Âge : 26
Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Ingénieur en laboratoire de recherche
Secteur : Enseignement

Informations forums :
Inscription : septembre 2005
Messages : 724
Points : 1 130
Points : 1 130
Pour la page c'est ça :
<meta http-equiv="content-type" content="text/html; charset=windows-1250" />
Honnètement je ne sais pas trop à quoi ça correspond comme encodage ^^

Pour ce qui est du visionnage, j'ai le même résultat en récupérant le texte par PHP/MySQL qu'en visionnant sur le site en ligne.
Par contre je vois qu'il y a une erreur dans le sujet dsl, le résultat visionné a été converti là. Ce que je vois c'est ça (sans les espaces sur le code html) :
é & #232 ; & #224 ; ç

Hum donc j'ai un peu mal formulé le problème, même si je suppose que ça tourne autour de l'encodage. Certains caractères (ici è et à) sont convertit en HTML alors que je n'utilise plus la fonction htmlentities() AVANT d'envoyer dans la base de données.
Et j'ai cherché un peu mais je ne vois nulle part dans phpMyAdmin une option qui puisse être en rapport :/
ymoreau est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2007, 13h23   #5
Modérateur
 
Avatar de ymoreau
 
Homme Yoann Moreau
Ingénieur en laboratoire de recherche
Inscription : septembre 2005
Messages : 724
Détails du profil
Informations personnelles :
Nom : Homme Yoann Moreau
Âge : 26
Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Ingénieur en laboratoire de recherche
Secteur : Enseignement

Informations forums :
Inscription : septembre 2005
Messages : 724
Points : 1 130
Points : 1 130
Bon je n'arrive pas à trouver pourquoi les caractères sont (partiellement) convertis en code HTML.

Etant donné que le texte récupéré passe par htmlentities(), le code HTML ressort avec le '&' convertit en "& amp ;".
Solution bricolage que je viens de trouver remplacer "& amp ;" par le caractère '&' à nouveau pour que les caractères s'affichent avec le code.
Code :
$texte = str_replace("&amp;", "&", $texte);
Cependant je serais curieux de savoir pourquoi cette conversion au sein de la base de données, je souhaitais à la base stocker tout le texte sans HTML.
ymoreau est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2007, 23h09   #6
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 540
Points : 9 540
Citation:
Envoyé par YoniBlond
Pour la page c'est ça :
<meta http-equiv="content-type" content="text/html; charset=windows-1250" />
Honnètement je ne sais pas trop à quoi ça correspond comme encodage ^^
ça doit être ce que MySQL appelle cp850, décrit comme "Windows Central European". Les jeux Central European correspondent à l'alphabet latin avec les accents utilisés pour les langues slaves, Č, ž et consorts...

Si ça ne correspond pas à ce que tu veux, je ne peux que t'inciter à utiliser un jeu plus adapté, latin-1 ou UTF-8.
Citation:
Envoyé par YoniBlond
Pour ce qui est du visionnage, j'ai le même résultat en récupérant le texte par PHP/MySQL qu'en visionnant sur le site en ligne.
Par contre je vois qu'il y a une erreur dans le sujet dsl, le résultat visionné a été converti là. Ce que je vois c'est ça (sans les espaces sur le code html) :
é & #232 ; & #224 ; ç

Hum donc j'ai un peu mal formulé le problème, même si je suppose que ça tourne autour de l'encodage. Certains caractères (ici è et à) sont convertit en HTML alors que je n'utilise plus la fonction htmlentities() AVANT d'envoyer dans la base de données.
Et j'ai cherché un peu mais je ne vois nulle part dans phpMyAdmin une option qui puisse être en rapport :/
Que tu les vois sur ta page n'implique pas qu'ils soient dans ta BDD... tu peux vérifier avec CHARACTER_LENGTH() et ORD() le contenu exact de ta base.

Ton htmlentities à l'affichage peut produire ce genre d'erreurs : en effet, htmlentities utilise par défaut le latin-1 (ISO-8859-1), et ne va pas forcément encoder correctement en windows-1250. Dans PHP5, tu peux préciser le jeu à utiliser dans htmlentities.

Si ces caractères mal affichés l'ont été dans des champs de formulaire, puis renvoyés au serveur MySQL, cela peut expliquer la présence de code HTML dans la base.
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2007, 00h04   #7
Modérateur
 
Avatar de ymoreau
 
Homme Yoann Moreau
Ingénieur en laboratoire de recherche
Inscription : septembre 2005
Messages : 724
Détails du profil
Informations personnelles :
Nom : Homme Yoann Moreau
Âge : 26
Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Ingénieur en laboratoire de recherche
Secteur : Enseignement

Informations forums :
Inscription : septembre 2005
Messages : 724
Points : 1 130
Points : 1 130
Non le HTML et le formulaire n'y est pour rien car comme je le montre dans le bout de code, j'ai testé le contenu de ma variable PHP juste avant d'envoyer la requête SQL et le texte était normal.
De plus il ne s'agit pas d'un mauvais affichage suite à un encodage, mais plutôt de la conversion en caractère HTML lors de l'écriture dans la base de données.

Peut être que le problème vient plutôt de phpmyadmin que d'autre chose :/
ymoreau est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2007, 23h40   #8
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 540
Points : 9 540
si ta variable $texte contient "&eacute;" et que tu fais un echo, ce que tu verras sur ta page c'est "é"... Il faut que tu regardes sur ton code source et/ou que tu demandes la str_len pour vérifier le nb de caractères...
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2007, 15h42   #9
Modérateur
 
Avatar de ymoreau
 
Homme Yoann Moreau
Ingénieur en laboratoire de recherche
Inscription : septembre 2005
Messages : 724
Détails du profil
Informations personnelles :
Nom : Homme Yoann Moreau
Âge : 26
Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Ingénieur en laboratoire de recherche
Secteur : Enseignement

Informations forums :
Inscription : septembre 2005
Messages : 724
Points : 1 130
Points : 1 130
En effet je suis bète j'y avais pas pensé...
Tu as raison, les caractères sont transformés déjà avant la requête, le problème vient donc de quelque part dans mon php.

Voici les codes utilisés :

Le formulaire XHTML
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
<form method="post" action="./valide_livredor.php"><p class="formulaire">
	<label FOR="pseudo">Votre pseudo :</label>
	<input type="text" id="pseudo" name="pseudo" value="" size="30" /> <br />
 
	<label FOR="email">Votre email :</label>
	<input type="text" id="email" name="email" value="" size="30" /> <br />
 
	<label FOR="texte">Votre texte :<br /></label>
	<textarea id="texte" name="texte" cols="40" rows="8"></textarea> <br />
 
	<input class="bouton" type="reset" name="annule" value="Effacer" />
	<input class="bouton" type="submit" name="valide" value="Envoyer" />
</p></form>
Et le code php dans l'autre page :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
IF($_POST['pseudo'] == "")
	echo "Erreur : Vous n'avez pas indiqu&eacute; de pseudo";
else IF($_POST['texte'] == "")
	echo "Erreur : Vous n'avez pas &eacute;crit de message";
else {
	$texte = $_POST['texte'];
	echo "<p>Texte brut : $texte </p>";
	$texte = strip_tags($texte);
	echo "<p>Texte filtre : $texte </p>";
	$valeurs = '\''.$_POST['pseudo'].'\',\''.$_POST['email'].'\',\''.$texte.'\'';
	$cmd = "INSERT INTO db_livredor(pseudo,email,texte,date) VALUES($valeurs,NOW())";
	IF($result = mysql_query($cmd))
	{
		echo "Votre message a bien &eacute;t&eacute; enregistr&eacute;<br /><br />";
		echo "<a href=\"./livredor.php\">Retour</a><br />";
		echo "(redirection automatique)";
	} else
		echo "Erreur de requ&ecirc;te de base de donn&eacute;es.";
}
Les deux echo de test ont donné pour ce message test :
Citation:
Test <br>
é è à ç ù
ce résultat dans le code source :
Code :
1
2
3
4
<p>Texte brut : Test <br>
é è à ç ù </p>
<p>Texte filtre : Test 
é è à ç ù </p>
(merde les caractères ont été remplacés... bon en gros : è, à et ù ont été remplacé par "& # xxx ;")

Je ne vois pas d'où peut venir cette conversion des caractères, de plus le 'é' et le 'ç' ne sont pas transformés eux
ymoreau est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2007, 00h53   #10
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 540
Points : 9 540
Je connaissais les magic_quotes, mais pas le magic HTML encoding !

Tu es sûr d'avoir ce gag-là même quand tu pars d'un formulaire vide sur lequel tu tapes toi-même les lettres accentuées ?
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2007, 00h57   #11
Modérateur
 
Avatar de ymoreau
 
Homme Yoann Moreau
Ingénieur en laboratoire de recherche
Inscription : septembre 2005
Messages : 724
Détails du profil
Informations personnelles :
Nom : Homme Yoann Moreau
Âge : 26
Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Ingénieur en laboratoire de recherche
Secteur : Enseignement

Informations forums :
Inscription : septembre 2005
Messages : 724
Points : 1 130
Points : 1 130
Oui le texte de test a été tapé dans une textarea vierge :/
J'espérais que ça soit seulement une erreur de ma part flagrante pour un habitué, par contre ce genre de bug divins j'aime pas ça ^^

J'y connais rien mais serait-il possible que la méthode POST effectue cette conversion ? d'ailleurs cette méthode dépend du navigateur ou de l'hébergeur ?
ymoreau est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2007, 06h50   #12
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 540
Points : 9 540
Citation:
Envoyé par YoniBlond
J'y connais rien mais serait-il possible que la méthode POST effectue cette conversion ? d'ailleurs cette méthode dépend du navigateur ou de l'hébergeur ?
Je ne vois pas d'autre explication... A priori, j'aurai plutôt eu tendance à accuser une obscure option de PHP (quelle version as-tu ?), mais ça pourrait aussi venir du navigateur (essaie d'en tester d'autres).

S'il s'avère que le navigateur est innocent, essaie de voir du côté du forum PHP si qqn a déjà rencontré ce problème-là.
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2007, 14h29   #13
Modérateur
 
Avatar de ymoreau
 
Homme Yoann Moreau
Ingénieur en laboratoire de recherche
Inscription : septembre 2005
Messages : 724
Détails du profil
Informations personnelles :
Nom : Homme Yoann Moreau
Âge : 26
Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Ingénieur en laboratoire de recherche
Secteur : Enseignement

Informations forums :
Inscription : septembre 2005
Messages : 724
Points : 1 130
Points : 1 130
Exactement le même résultat sous IE. Pour la version du php je ne sais pas, je suis hébergé sur free, je vais aller voir de ce côté là alors. Merci quand même =)
ymoreau est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2007, 12h08   #14
Modérateur
 
Avatar de ymoreau
 
Homme Yoann Moreau
Ingénieur en laboratoire de recherche
Inscription : septembre 2005
Messages : 724
Détails du profil
Informations personnelles :
Nom : Homme Yoann Moreau
Âge : 26
Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Ingénieur en laboratoire de recherche
Secteur : Enseignement

Informations forums :
Inscription : septembre 2005
Messages : 724
Points : 1 130
Points : 1 130
Le forum PHP a résolu mon problème, il s'agit de l'encodage de ma page qui était windows-1250, une fois le charset mis à ISO-8895-1 les caractères spéciaux ne sont plus convertis.
ymoreau est actuellement 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 00h24.


 
 
 
 
Partenaires

Hébergement Web