Как заставить PDO запускать SET NAMES utf8 при каждом подключении в ZendFramework

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

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


person Itay Moav -Malimovka    schedule 25.02.2009    source источник


Ответы (7)


Итай,

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

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

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

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

person David Snabel-Caunt    schedule 31.03.2009

бояться моего гугл-фу

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

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

person SchizoDuckie    schedule 25.02.2009
comment
:-) Мой google foo лучше, нашел это перед публикацией, должен был так сказать. Я уточню свой вопрос, я пытаюсь сделать это в config.ini, а не в php-коде. - person Itay Moav -Malimovka; 25.02.2009
comment
Что случилось с косой чертой в этой константе? - person Kzqai; 01.08.2012
comment
Да вопрос как ставить utf8. Но я думаю, вам следует подумать об использовании utf8mb4 для поддержки полных наборов символов utf8, если вы используете mysql. Если вы используете utf8, вы можете потерять данные в зависимости от того, как настроен ваш mysql. - person dminer; 25.03.2014
comment
Спасибо, SchizoDuckie, я искал решение моей странной проблемы с символами, и ваше решение отлично работает! - person UserX; 30.05.2014
comment
Результаты Google приводят к переполнению стека :) - person Yasen; 01.05.2016

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

database.params.charset = "utf8"

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

person tawfekov    schedule 07.09.2009
comment
Теперь это лучший способ сделать это :) - person David Snabel-Caunt; 08.09.2009

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

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

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

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

person Leon Fedotov    schedule 29.07.2009

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

person mlarcher    schedule 03.12.2010

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

$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; 
person Black    schedule 26.04.2018

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

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

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

Zend_Registry::set('db', $db);
person Community    schedule 06.03.2009