Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

Итай,

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

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

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

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

Ответ 2

боюсь google-fu

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

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

Ответ 3

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

database.params.charset = "utf8"

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

Ответ 4

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

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

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

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

Ответ 5

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

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

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

  • С 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, чтобы сделать это для вас.

  • В окнах вам понадобится php >= 5.3.1 для MYSQL_ATTR_INIT_COMMAND.

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

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

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

Ответ 6

В вашем файле начальной загрузки...

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

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

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

Ответ 7

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