40 votes

Comment faire en sorte que PDO exécute SET NAMES utf8 à chaque connexion, dans ZendFramework

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

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

122voto

SchizoDuckie Points 6420

Craindre 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 votes

:-) Mon google foo est meilleur, j'ai trouvé ça avant de poster, j'aurais dû le dire. Je vais affiner ma question, j'essaie de le faire dans le config.ini et non dans le code php.

1 votes

Qu'est-ce qui se passe avec le slash échappé dans cette constante ?

0 votes

Oui, la question demande comment définir 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.

47voto

David Caunt Points 30636

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 la constante PDO::MYSQL_ATTR_INIT_COMMAND

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

32voto

tawfekov Points 4061

Mettez simplement ceci dans votre configuration

database.params.charset = "utf8"

ou après ZF 1.11 cela fonctionnerait pour resources.db.params.charset = utf8 c'est tout

4 votes

C'est maintenant la meilleure façon de le faire :)

4voto

Leon Fedotov Points 719

La connexion dans zend_db est paresseuse ce qui signifie qu'elle se connecte à la première requête. Si vous avez une page statique sans aucune requête, elle ne se connectera jamais - même si elle est initialisée dans votre fichier de démarrage.

donc courir :

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

n'est pas si intelligent. Un grand merci à dcaunt pour sa solution.

3voto

mlarcher Points 144

Toutes ces méthodes devrait travail, sauf dans certaines circonstances particulières. Par exemple, si vous exécutez un serveur web localement sur une machine Windows avec php < 5.3.1, seule une requête 'manuelle' $db->query("SET NAMES 'utf8'") ; avant votre requête réelle fonctionnera. Toute autre méthode essayant d'utiliser MYSQL_ATTR_INIT_COMMAND échouera.

Voici ce que j'ai appris aujourd'hui, en me débattant avec ce même problème :

  1. Vous ne pouvez pas faire référence à PDO::MYSQL_ATTR_INIT_COMMAND dans certains environnements (le mien, par exemple, je ne sais pas). Vous devez explicitement utiliser 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 config.ini : resources.db.params.charset = "utf8" sera suffisant pour que Zend_Db_Adapter_Pdo_Mysql le fasse pour vous.

  3. Sous Windows, vous devez disposer de php >= 5.3.1 pour que la commande MYSQL_ATTR_INIT_COMMAND fonctionne.

  4. Si vous remplacez votre version de php par 5.3.1 ou plus (j'ai également testé 5.3.3), vous devez vous assurer que vous définissez une valeur pour 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 pris la peine d'essayer sans cela après avoir découvert le point 5).

  5. Vous devez également vous assurer que vous avez '127.0.0.1 localhost' dans votre système d'exploitation Windows. \system32\drivers\etc\hosts fichier système caché (ce qui n'était pas un problème pour php 5.3.0)

Avec tout cela en tête, vous devriez pouvoir vous épargner une journée de recherche sur Internet et garder certains de vos cheveux !)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X