Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 29-12-2009 18:58:41

lesdoudous
Membre
Lieu: Paris, France
Date d'inscription: 24-10-2009
Messages: 27

Encodage cohérent entre Zend & MySQL

Bonjour à tous,


J'ai créé une base via phpMyAdmin comme suit :
- base de données en utf8_general_ci
- interclassement de toutes les tables en utf8_general_ci
- interclassement des champs de table en utf8_general_ci


Dans mon layout, j'ai intégré :
- appendHttpEquiv('Content-Type', 'text/html;charset=utf-8')

Lorsque je fais une insertion de ééééé via ZF, je vois dans phpMyAdmin ceci ééééé !
J'ai tenté une connexion via Mysql Query Browser, pensant que peut-être l'encodage des pages via pma est incorrect, mais le résultat est le même...

Avez-vous une idée sur la raison de tout cela ?
Une solution pour faire marcher tout ca de concert (ZF + MYSQL) ??

Merci par avance et bonnes fêtes !


Recrute 2 développeurs Zend expérimentés pour du développement d'applications métier... ==> MP !

Hors ligne

 

#2 29-12-2009 22:22:16

throrin19
Membre
Date d'inscription: 01-03-2009
Messages: 318
Site web

Re: Encodage cohérent entre Zend & MySQL

c'st tout con, par défaut mysql retourne les résultats en latin. Pour ce faire, lors de l'initialisation de ta base de donnée, si tu passe par les fichiers de config tu fais ceci:

Code:

resources.db.adapter                    = PDO_MYSQL
resources.db.params.charset                = UTF8 ;c'est le truc qui nous intéresse ici
resources.db.params.host                = localhost
resources.db.params.username            = root
resources.db.params.password            = 
resources.db.params.dbname                = mabase
resources.db.isDefaultTableAdapter    = true

Hors ligne

 

#3 30-12-2009 08:46:49

lesdoudous
Membre
Lieu: Paris, France
Date d'inscription: 24-10-2009
Messages: 27

Re: Encodage cohérent entre Zend & MySQL

Merci pour cette réponse.

Je ne passe pas par un fichier de config, mais un modele DB (solution surement discutable ?).

J'ai donc fait la chose suivante :

Code:

    public static function connect() {
        $connParams = array (
            "host" => "localhost", 
            "port" => "3306", 
            "username" => "root", // Oui, ca n'est pas très sécurisé, mais c'est un test local !
            "password" => "", 
            "dbname" => "xxx",
            "charset" => "utf8"
        );
        $db = new Zend_Db_Adapter_Pdo_Mysql ( $connParams );
        return $db;
    }

Il me semble, même si la méthode est différente, que j'utilise déjà le charset UTF-8.
Je suis tenté de conclure que le problème ne vient pas de la.

Qu'en pensez-vous ?

Dernière modification par lesdoudous (30-12-2009 08:47:30)


Recrute 2 développeurs Zend expérimentés pour du développement d'applications métier... ==> MP !

Hors ligne

 

#4 30-12-2009 10:09:04

Mr.MoOx
Administrateur
Lieu: Toulouse
Date d'inscription: 27-03-2007
Messages: 1444
Site web

Re: Encodage cohérent entre Zend & MySQL

Pour que ta connexion soit en UTF8 il te faut faire la requête "SET NAMES UTF8" après ta connexion.

Hors ligne

 

#5 30-12-2009 10:43:17

3uclide
Membre
Date d'inscription: 09-08-2008
Messages: 194

Re: Encodage cohérent entre Zend & MySQL

Code:

@version    $Id: Mysql.php 16942 2009-07-22 04:03:09Z ralph $

if (!empty($this->_config['charset'])) {
     $initCommand = "SET NAMES '" . $this->_config['charset'] . "'";
     $this->_config['driver_options'][1002] = $initCommand; // 1002 = PDO::MYSQL_ATTR_INIT_COMMAND
}

Dernière modification par 3uclide (30-12-2009 10:46:51)

Hors ligne

 

#6 30-12-2009 11:47:38

lesdoudous
Membre
Lieu: Paris, France
Date d'inscription: 24-10-2009
Messages: 27

Re: Encodage cohérent entre Zend & MySQL

Merci Mr.MoOx !

Peux tu éclairer ma lanterne sur la raison qui fait qu'on doive à la fois spécifier le charset ET la connexion en UTF-8 ?


Recrute 2 développeurs Zend expérimentés pour du développement d'applications métier... ==> MP !

Hors ligne

 

#7 30-12-2009 11:52:02

Mr.MoOx
Administrateur
Lieu: Toulouse
Date d'inscription: 27-03-2007
Messages: 1444
Site web

Re: Encodage cohérent entre Zend & MySQL

Pas plus que ça smile
Mais comme dit ci dessus, apparement les adapteurs se chargent maintenant de faire cette requête.

Hors ligne

 

#8 30-12-2009 12:00:36

lesdoudous
Membre
Lieu: Paris, France
Date d'inscription: 24-10-2009
Messages: 27

Re: Encodage cohérent entre Zend & MySQL

J'utilise pourtant une version récente...

Code:

const VERSION = '1.9.5';

PS : 3uclide, j'ai vu ton message après avoir posté le mien :s


Recrute 2 développeurs Zend expérimentés pour du développement d'applications métier... ==> MP !

Hors ligne

 

#9 31-12-2009 01:51:11

throrin19
Membre
Date d'inscription: 01-03-2009
Messages: 318
Site web

Re: Encodage cohérent entre Zend & MySQL

il me semble que pour le moment par défaut c'est en latin et non en utf8 (devrait être définitivement en utf8 avec php6)
cela vient de mysql et non de php, enfin à voir smile

Hors ligne

 

#10 31-12-2009 03:09:06

3uclide
Membre
Date d'inscription: 09-08-2008
Messages: 194

Re: Encodage cohérent entre Zend & MySQL

Et si tu fais un uft8_encode/uft8_decode sur tes données ça donne quoi?

Hors ligne

 

#11 31-12-2009 09:43:18

lesdoudous
Membre
Lieu: Paris, France
Date d'inscription: 24-10-2009
Messages: 27

Re: Encodage cohérent entre Zend & MySQL

Le problème est résolu en effectuant la chose suivante :

Code:

    public static function connect() {
        $connParams = array (
            "host" => "localhost", 
            "port" => "3306", 
            "username" => "root", 
            "password" => "", 
            "dbname" => "mrj-web",
            "charset" => "utf8"
        );
        $db = new Zend_Db_Adapter_Pdo_Mysql ( $connParams );
        $db->query("SET NAMES UTF8");
        return $db;
    }

Avant, ca, j'utilisais des utf_decode uniquement... il manquait peut être un encode avant l'insertion en base smile

Dans la mesure ou j'ai ajouté le SET NAMES UTF8, je n'ai plus besoin d'ajouter de fonction d'encodage / décodage !

Ce que je ne m'explique pas, c est que la portion de code que tu proposes, 3uclide, si elle est présente dans ZF 1.9.5, ne s'exécute pas (pour une raison que j'ignore...).


Recrute 2 développeurs Zend expérimentés pour du développement d'applications métier... ==> MP !

Hors ligne

 

#12 31-12-2009 12:01:53

throrin19
Membre
Date d'inscription: 01-03-2009
Messages: 318
Site web

Re: Encodage cohérent entre Zend & MySQL

normalement si tu dis ici que t'es en utf8, paramettrant tes pages web en utf8 (côté vue et meta) tout sera en utf8.
Ensuite le set names utf8 est aussi obligatoire car mysql réencode tout en latin avant de t'envoyer les données. Un utf8_decode est inutile ici.

Hors ligne

 

#13 31-12-2009 17:13:29

3uclide
Membre
Date d'inscription: 09-08-2008
Messages: 194

Re: Encodage cohérent entre Zend & MySQL

T'utilise quel moteur pour ta base MySQL?

cf: http://php.net/manual/fr/ref.pdo-mysql.php

Hors ligne

 

#14 31-12-2009 19:11:55

lesdoudous
Membre
Lieu: Paris, France
Date d'inscription: 24-10-2009
Messages: 27

Re: Encodage cohérent entre Zend & MySQL

Si par moteur tu entends type alors c'est du Myisam pour les tables (bizarrement le type de la base est innoDB...).
Si tu parles de l'extention, je ne spécifie rienn (ni PDO, ni mysql, ni mysqli !).

Si tu parles d'autre chose... Et bien je donne ma langue au chat (qui sera à mon avis bien embêté de savoir quoi en faire).


Recrute 2 développeurs Zend expérimentés pour du développement d'applications métier... ==> MP !

Hors ligne

 

#15 01-01-2010 17:23:31

throrin19
Membre
Date d'inscription: 01-03-2009
Messages: 318
Site web

Re: Encodage cohérent entre Zend & MySQL

myisam est le moteur par défaut pour une table qui n'a pas de lien avec une autre able. Aucune journalisation n'est vraiment effectuée pr mysql et il n'y a pas de réel validation des données (si ta requête plante en plein millieu, il te valide la moitié)

innoDB lui offre une journalisation et permet de faire des liens avec d'autres tables. Un peu plus lent que le moteur myisam mais plus sûr car lui permet une réelle validation des données.  (vu en cours d'oracle/mysql)

Ces parties n'ont rien à voir avec l'encodage.

Ensuite, ni pdo, ni mysql, mysqli ne gèrent l'encodage qui sort. C'est le serveur mysql qui le traite et, pour une raison que j'ignore, il ne ressort par défaut que des résulats encodés en Latin (même pour une table en utf8)

Les seuls moyens sont le "SET NAMES UTF8" et/ou la ligne d'encodage au niveau du fichier .ini (qui doit permettre d'effectuer cette requête en arrière plan)

J'espère ne pas avoir dit de bourdes sur ce point.

Hors ligne

 

#16 01-01-2010 17:54:48

3uclide
Membre
Date d'inscription: 09-08-2008
Messages: 194

Re: Encodage cohérent entre Zend & MySQL

Avertissement
Prenez garde : certains types de tables MySQL (moteur d'enregistrement) ne supportent pas les transactions. Lorsque vous écrivez du code de base de données transactionnel en utilisant un type de table qui ne supporte pas les transactions, MySQL prétendra qu'une transaction était initiée correctement. De plus, toutes requêtes DLL publiées enverra implicitement toutes les transactions en attente.

myisam fait partie de ceux qui ne supportent pas les transactions. C'est pourquoi le paramètre passé dans ton fichier ini ne fonctionne pas (charset).

Hors ligne

 

#17 02-01-2010 12:30:40

lesdoudous
Membre
Lieu: Paris, France
Date d'inscription: 24-10-2009
Messages: 27

Re: Encodage cohérent entre Zend & MySQL

3uclide, si j'ai bien compris :
cela signifie que le fichier .ini est utilisé pour instancier la connexion, mais que l'info n'est pas utilisée lorsque la requête est transmise à MySQL ?


Recrute 2 développeurs Zend expérimentés pour du développement d'applications métier... ==> MP !

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages