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

Outils MySQL Discussion :

[PHP/MySQL] Problème d'encodage


Sujet :

Outils MySQL

  1. #1
    Membre émérite
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur étude et développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Points : 2 834
    Points
    2 834
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Futur Membre du Club
    Inscrit en
    Janvier 2007
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    essaye ça:
    utf8_decode() lors de la lecture

  3. #3
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    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 Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  4. #4
    Membre émérite
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur étude et développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Points : 2 834
    Points
    2 834
    Par défaut
    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 :/

  5. #5
    Membre émérite
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur étude et développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Points : 2 834
    Points
    2 834
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    $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.

  6. #6
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    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 Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  7. #7
    Membre émérite
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur étude et développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Points : 2 834
    Points
    2 834
    Par défaut
    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 :/

  8. #8
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    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 Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  9. #9
    Membre émérite
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur étude et développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Points : 2 834
    Points
    2 834
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : 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
    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 :
    Test <br>
    é è à ç ù
    ce résultat dans le code source :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  10. #10
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    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 Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  11. #11
    Membre émérite
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur étude et développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Points : 2 834
    Points
    2 834
    Par défaut
    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 ?

  12. #12
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    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 Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  13. #13
    Membre émérite
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur étude et développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Points : 2 834
    Points
    2 834
    Par défaut
    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 =)

  14. #14
    Membre émérite
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur étude et développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Points : 2 834
    Points
    2 834
    Par défaut
    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.

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

Discussions similaires

  1. [MySQL] Php/mysql problème débutant !
    Par hazaki dans le forum PHP & Base de données
    Réponses: 20
    Dernier message: 26/12/2011, 17h01
  2. Réponses: 3
    Dernier message: 13/04/2007, 19h43
  3. [MySQL] Problème d'encodage / transfert de base de données
    Par Theberge43 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 30/01/2007, 18h21

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