2009-02-25 3 views
38

Comment faire l'adaptateur PDO exécuter SET NAMES utf8 chaque fois que je me connecte, Dans ZendFramework. J'utilise un fichier INI pour enregistrer les données de configuration de l'adaptateur. quelles entrées dois-je ajouter là?Comment faire PDO exécuter SET NAMES utf8 chaque fois que je me connecte, Dans ZendFramework

Si ce n'était pas clair, je cherche la syntaxe correcte pour le faire dans le fichier config.ini de mon projet et pas dans le code php, car je considère cette partie du code de configuration.

Répondre

46

Itay,

Une très bonne question. Heureusement pour vous, la réponse est très simple:

database.params.driver_options.1002 = "SET NAMES utf8" 

1002 est la valeur de PDO :: constante MYSQL_ATTR_INIT_COMMAND

Vous ne pouvez pas utiliser la constante dans le config.ini

118

peur mon google-fu

$pdo = new PDO(
    'mysql:host=mysql.example.com;dbname=example_db', 
    "username", 
    "password", 
    array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")); 

premier coup;)

+1

:-) Mon google foo est mieux, trouvé ceci avant de poster, aurait dû le dire. Je vais affiner ma question, j'essaie de le faire dans le config.ini et non dans le code php. –

+1

Qu'est-ce qui se passe avec la barre oblique s'échappant dans cette constante? – Kzqai

+0

Oui, la question demande comment configurer utf8. Mais je pense que vous devriez envisager d'utiliser utf8mb4 pour supporter les jeux de caractères utf8 complets si vous utilisez mysql. Si vous utilisez utf8, vous pouvez perdre des données en fonction de la configuration de votre mysql. – dminer

0

Dans votre fichier de démarrage ...

$db = Zend_Db::factory($adapter, $config); 
$db->query("SET NAMES 'utf8'"); 

alors vous enregistrez cette instance dans votre registre

Zend_Registry::set('db', $db); 
4

La connexion Zend_Db est paresseux, ce qui signifie qu'il se connecte à la première requête. Si vous avez une page statique sans requête, elle ne se connecte jamais, même si elle est initialisée dans votre fichier d'amorçage.

donc en cours d'exécution:

$db->query("SET NAMES 'utf8'"); 

est-ce pas si intelligent. Un grand merci à Dcaunt pour sa solution.

32

vient de mettre dans votre config

database.params.charset = "utf8" 

ou après ZF 1.11 cela fonctionnerait à resources.db.params.charset = utf8 qui est elle

+4

Ceci est maintenant la meilleure façon de le faire :) –

+2

resources.db.params.charset = utf8 a travaillé pour moi –

-1
$table->getAdapter()->query('SET NAMES UTF8'); 
3

Toutes ces méthodes SHOUD travail, sauf dans certaines spéciales conditions. Par exemple, si vous exécutez un serveur Web localement sur une machine Windows avec php < 5.3.1, seulement une requête 'manual' $ db-> ("SET NAMES 'utf8'"); avant que votre requête réelle ne fonctionne. Toute autre méthode essayant d'utiliser MYSQL_ATTR_INIT_COMMAND échouera.

Voici ce que j'ai appris aujourd'hui, aux prises avec ce problème très:

  1. Vous ne pouvez pas se référer à PDO :: MYSQL_ATTR_INIT_COMMAND dans certains environnements (à savoir le mien, en particulier, je ne sais pas).Vous devez utiliser explicitement 1002 à la place

  2. Avec Zend Framework 1.11 (peut-être depuis 1.8, à confirmer), vous n'avez pas besoin de définir database.params.driver_options.1002 = "SET NAMES utf8" dans votre configuration. ini: resources.db.params.charset = "utf8" sera suffisant pour que Zend_Db_Adapter_Pdo_Mysql le fasse pour vous.

  3. Sous Windows, vous avez besoin de php> = 5.3.1 pour que MYSQL_ATTR_INIT_COMMAND fonctionne.

  4. Si vous remplacez votre version de php avec 5.3.1 ou supérieur (j'ai également testé 5.3.3), vous devez vous assurer que vous définissez une valeur à pdo_mysql.default_socket dans votre php.ini. La valeur vide par défaut ne fonctionnera pas (à confirmer: j'ai lu quelque chose à ce sujet mais je n'ai pas essayé de le faire après avoir découvert le point 5)

  5. Vous devez également vous assurer d'avoir '127.0. 0,1 localhost » dans vos windows \ system32 \ drivers \ etc \ hosts fichier système caché (qui n'a pas été un problème pour php 5.3.0)

Avec tout cela à l'esprit, vous devriez être en mesure d'économiser de vous-même un jour de googling et gardez certains de vos cheveux! :)

Questions connexes