Как заставить адаптер PDO запускать SET NAMES utf8 каждый раз, когда я подключаюсь, в ZendFramework. Я использую INI-файл для сохранения данных конфигурации адаптера. какие записи я должен добавить туда?
Если это было непонятно, я ищу правильный синтаксис, чтобы сделать это в файле config.ini моего проекта, а не в php-коде, поскольку я рассматриваю эту часть кода конфигурации.
Итай,
Очень хороший вопрос. К счастью для вас, ответ очень прост:
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, не будет выполнен.
Вот что я узнал сегодня, борясь с этой самой проблемой:
Вы не можете ссылаться на 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, чтобы сделать это за вас.
В Windows вам нужно установить php> = 5.3.1 для MYSQL_ATTR_INIT_COMMAND.
Если вы замените версию php на 5.3.1 или выше (я также проверил 5.3.3), вам нужно убедиться, что вы установили значение в pdo_mysql.default_socket в php.ini. Пустое значение по умолчанию не будет работать (будет подтверждено: я что-то прочитал об этом, но не потрудился попробовать без него, узнав о точке 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');