web-dev-qa-db-fra.com

Comment faire exécuter PDO SET NAMES utf8 chaque fois que je me connecte, dans ZendFramework

Comment faire fonctionner l'adaptateur PDO 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 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.

40
Itay Moav -Malimovka

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

47
David Snabel-Caunt

craignez mon google-f

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

premier coup;)

121
SchizoDuckie

il suffit de mettre cela dans votre config

database.params.charset = "utf8"

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

32
tawfekov

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 requête, elle ne se connectera jamais - même si elle est initialisée dans votre fichier bootstrap.

si courant:

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

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

4
Leon Fedotov

Toutes ces méthodes shoud fonctionnent, 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-> ("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:

  1. Vous ne pouvez pas faire référence à PDO :: MYSQL_ATTR_INIT_COMMAND dans certains environnements (c'est-à-dire le mien, en particulier, je ne sais pas). Vous devez utiliser explicitement 1002 à la place

  2. Avec Zend Framework 1.11 (peut-être depuis la version 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 avez besoin de php> = 5.3.1 pour que MYSQL_ATTR_INIT_COMMAND fonctionne.

  4. Si vous remplacez votre version php par 5.3.1 ou supérieur (j'ai également testé 5.3.3), vous devez vous assurer de définir 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 après avoir découvert le point 5)

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

Avec tout cela à l'esprit, vous devriez pouvoir vous épargner une journée de recherche sur Google et garder certains de vos cheveux! ;)

3
mlarcher

Vous n'avez qu'à exécuter cette commande avant de démarrer les requêtes, vous ne devez l'exécuter qu'une seule fois avant les requêtes et pas pour chaque requête.

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

Exemple complet

$servername = "localhost";
$username = "root";
$password = "test";
$dbname = "yourDB";

try {
    $pdo = new PDO("mysql:Host=$servername;dbname=$dbname", $username, $password);

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

    //set the PDO error mode to exception
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $sql = "SELECT name FROM nations";
    foreach ($pdo->query($sql) as $row) {
       echo "<option value='".$row['name']."'>".$row['name']."</option>";
    }


} catch(PDOException $e) {
    echo "Error: " . $e->getMessage();
}
$pdo = null; 
1
Black

Dans votre fichier bootstrap ...

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

puis vous enregistrez cette instance dans votre registre

Zend_Registry::set('db', $db);
0
patchinko