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 :

Charset MySQL/PHP


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 68
    Par défaut Charset MySQL/PHP
    Bonjour tout le monde

    Dans ma base j'ai une donnée avec le signe euro "€".
    La table est en utf8-general-ci, la colonne aussi.

    Je récupère cette donnée dans un script PHP, et je l'utilise pour créer un message envoyé par email.
    Le fichier PHP est encodé en utf-8, j'envoie l'email avec le charset=utf-8

    Problème : dans l'email je ne lis pas "€" mais "?"

    Si j'écris le signe "€" directement dans mon fichier PHP (sans le récupérer depuis ma BDD MySQL), alors l'email affiche bien le signe €.
    Et si je fais utf8_encode() sur ma donnée récupérée depuis la BDD, alors l'email affiche bien le signe €.
    Cela me fait penser que le problème vient soit de la BDD, soit de la liaison BDD/PHP ?

    J'ai lu que quand il est affiché "?" c'est que la donnée est encodée en ISO-8859 alors qu'on essaie de l'afficher en utf-8. Mais je ne vois pas où est-ce qu'il pourrait y avoir de l'ISO, et je ne sais pas quoi/comment vérifier.
    C'est bien possible que la base ait été créée avec tous les types en latin1-swedish-ci, puis les données insérées, puis tous les types modifiés en utf8-general-ci via phpMyAdmin. Je sais pas si ça peut créer des problèmes de conversion...

    Merci de m'aider !

  2. #2
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 418
    Par défaut
    Avant de lire tes données depuis la table avec php, il faut dire que tu utilise l'utf-8 avec une requête du genre : query("SET NAMES 'utf8'");
    L'as-tu fais ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 68
    Par défaut
    J'utilise PDO pour parler à la BDD depuis PHP.
    Je ne fais rien qui ressemble à SET NAMES...

    Je ne sais pas si il y a besoin, sur mon phpMyAdmin je vois les variables suivantes :
    character set client     = utf8
    (Valeur globale)           latin1
    character set connection = utf8
    (Valeur globale)l          latin1
    character set database   = latin1
    character set filesystem = binary
    character set results    = utf8
    (Valeur globale)           latin1
    character set server     = latin1
    character set system     = utf8
    collation connection     = utf8_general_ci
    (Valeur globale)           latin1_swedish_ci
    collation database       = latin1_swedish_ci
    collation server         = latin1_swedish_ci

  4. #4
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 323
    Par défaut
    Bonjour,
    c'est a la connexion que l'on rentre ce parametre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $myPDOsql = new PDO('mysql:host=localhost;dbname=test', 'root', '');
    $myPDOsql->exec('SET NAMES utf8');
    il peut parfois être passé dans le constructeur de PDO.

  5. #5
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 418
    Par défaut
    Pour préciser la réponse de papajoker le "parfois" veut dire avant PHP 5.3.6.
    Donc si tu utilise PHP 5.3.6 ou supérieur tu peux faire une connexion dans ce genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    // l'option [PDO::ATTR_EMULATE_PREPARES] = false est très recommandée.
     
    $pdo_options = null;
    $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
    $pdo_options[PDO::ATTR_EMULATE_PREPARES] = false;
    $pdo_options[PDO::ATTR_DEFAULT_FETCH_MODE] = PDO::FETCH_OBJ;
     
    $connexion = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', '', $pdo_options);
    Je donne cet exemple avec les options parce que alternativement tu peux aussi passer le charset dans les options (si tu trouves cela plus lisible ou pour les versions < PHP 5.3.6)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $pdo_options = null;
    $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
    $pdo_options[PDO::ATTR_EMULATE_PREPARES] = false;
    $pdo_options[PDO::ATTR_DEFAULT_FETCH_MODE] = PDO::FETCH_OBJ;
    $pdo_options[PDO::MYSQL_ATTR_INIT_COMMAND] = "SET NAMES utf8";
     
    $connexion = new PDO('mysql:host=localhost;dbname=test', 'root', '', $pdo_options);
    ...pour dire qu'il y a plusieurs façons d'indiquer le charset

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 68
    Par défaut
    Merci à tous, c'était bien ça !
    Passer le charset dans le constructeur de PDO...

    Par contre cette écriture n'a pas fonctionné dans mon cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new PDO("mysql:host=monsite.com;dbname=mabase;charset=utf8", $username, $password);
    J'ai du écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new PDO("mysql:host=monsite.com;dbname=mabase", $username, $password, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"))
    Peut-être que "SET NAMES" modifie plus de variables que juste "charset=utf8" ?

    Petite question : Est-ce normal qu'il faille faire ça si ma base est vraiment en utf8 ? C'est pas ma base qui est mal configurée ?

Discussions similaires

  1. [MySQL] Le bon choix de charset entre php et MySQL ?
    Par CinePhil dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 16/03/2010, 15h07
  2. [MySQL] EasyPHP,sortie MySQL,charset!=pg php
    Par sending dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 25/09/2006, 21h57
  3. [mysql][php]aucune base selectionnée
    Par Destampy dans le forum Requêtes
    Réponses: 3
    Dernier message: 01/06/2005, 10h21
  4. Types de variables entre mysql/php et flash
    Par ramses83 dans le forum Flash
    Réponses: 2
    Dernier message: 06/10/2003, 18h35
  5. Réponses: 14
    Dernier message: 17/03/2003, 18h31

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