Как заставить PDO запускать SET NAMES utf8 каждый раз, когда я подключаюсь, в ZendFramework

Как заставить адаптер PDO запускать SET NAMES utf8 каждый раз, когда я подключаюсь, в ZendFramework. Я использую INI-файл для сохранения данных конфигурации адаптера. какие записи я должен добавить туда?

Если это было непонятно, я ищу правильный синтаксис, чтобы сделать это в файле config.ini моего проекта, а не в php-коде, поскольку я рассматриваю эту часть кода конфигурации.

Solutions Collecting From Web of "Как заставить PDO запускать SET NAMES utf8 каждый раз, когда я подключаюсь, в ZendFramework"

Итай,

Очень хороший вопрос. К счастью для вас, ответ очень прост:

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

1002 – значение константы PDO :: MYSQL_ATTR_INIT_COMMAND

Вы не можете использовать константу в config.ini

боюсь, мой google-fu

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

первый удар;)

просто поместите это в свою конфигурацию

 database.params.charset = "utf8" 

или после ZF 1.11 это будет работать на resources.db.params.charset = utf8 что и есть

Соединение в zend_db является ленивым, что означает, что он подключается к первому запросу. если у вас есть статическая страница без запроса, она никогда не будет даже подключаться – даже если она инициализирована в вашем файле начальной загрузки.

так работает:

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

Разве это не так умно. Большое спасибо dcaunt за его решение.

Все эти методы работают, за исключением особых обстоятельств. Например, если вы используете веб-сервер локально на машине Windows с php <5.3.1, только «ручной» запрос $ db-> («SET NAMES 'utf8»); прежде чем ваш фактический запрос будет работать. Любой другой метод, пытающийся использовать MYSQL_ATTR_INIT_COMMAND, не будет выполнен.

Вот что я узнал сегодня, борясь с этой самой проблемой:

  1. Вы не можете ссылаться на PDO :: MYSQL_ATTR_INIT_COMMAND в некоторых средах (то есть на мой, в частности, я не знаю). Вы должны явно использовать 1002 вместо этого

  2. С Zend Framework 1.11 (возможно, начиная с версии 1.8, для подтверждения) вам не нужно устанавливать database.params.driver_options.1002 = "SET NAMES utf8" в config.ini: resources.db.params.charset = "utf8 «будет достаточно для Zend_Db_Adapter_Pdo_Mysql, чтобы сделать это за вас.

  3. В Windows вам нужно установить php> = 5.3.1 для MYSQL_ATTR_INIT_COMMAND.

  4. Если вы замените версию php на 5.3.1 или выше (я также проверил 5.3.3), вам нужно убедиться, что вы установили значение в pdo_mysql.default_socket в php.ini. Пустое значение по умолчанию не будет работать (будет подтверждено: я что-то прочитал об этом, но не потрудился попробовать без него, узнав о точке 5)

  5. Вы также должны убедиться, что у вас есть «127.0.0.1 localhost» в вашем Windows \ system32 \ drivers \ etc \ hosts скрытый системный файл (это не проблема для php 5.3.0)

Имея это в виду, вы должны быть в состоянии спасти от себя день гуглинга и сохранить некоторые из ваших волос! 😉

В вашем загрузочном файле …

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

то вы сохраняете этот экземпляр в своем реестре

 Zend_Registry::set('db', $db); 
 $table->getAdapter()->query('SET NAMES UTF8');