Как заставить PDO запускать SET NAMES utf8 при каждом подключении, в ZendFramework - PullRequest
40 голосов
/ 25 февраля 2009

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

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

Ответы [ 8 ]

122 голосов
/ 25 февраля 2009

страх мой google-fu

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

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

47 голосов
/ 01 апреля 2009

Итай,

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

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

1002 - значение постоянной PDO :: MYSQL_ATTR_INIT_COMMAND

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

32 голосов
/ 07 сентября 2009

просто поместите это в свой конфиг

database.params.charset = "utf8"

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

4 голосов
/ 29 июля 2009

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

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

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

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

3 голосов
/ 03 декабря 2010

Все эти методы 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. Вам также необходимо убедиться, что у вас есть скрытый системный файл windows \ system32 \ drivers \ etc \ hosts '127.0.0.1 localhost' (это не было проблемой для php 5.3.0)

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

1 голос
/ 26 апреля 2018

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

$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; 
0 голосов
/ 21 сентября 2010
$table->getAdapter()->query('SET NAMES UTF8');
0 голосов
/ 06 марта 2009

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

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

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

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