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

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

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

Ответов (8)

Решение

Итай,

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

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

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

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

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

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

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

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

Вам просто нужно выполнить эту команду перед запуском запросов, вам нужно выполнить ее только один раз перед запросами, а не для каждого запроса.

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

Полный пример

$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; 

бойся моего гугл-фу

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

первое попадание;)

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

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

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

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

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

database.params.charset = "utf8"

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

Все Этих методы Шоуда работа, за исключением некоторых особых обстоятельств. Например, если вы запускаете веб-сервер локально на машине 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).

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