2010-02-11 3 views
2

таблицы в моей базе данных создаются с правильной UTF-8 кодировкой, как это:Zend_Db_Table UTF-8 символов

CREATE TABLE users (
id INT NOT NULL AUTO_INCREMENT, 
... 
... 
... 
... 
... 
PRIMARY KEY (id) 
) ENGINE = INNODB CHARACTER SET utf8 COLLATE utf8_slovak_ci; 

Однако, когда я использую Zend_Db_Table для извлечения данных из таблицы с помощью этого метода:

public function getSingle($id) 
{ 
    $select = $this->select(); 
    $where = $this->getAdapter()->quoteInto('id = ?', $id, 'INTEGER'); 
    $select->where($where); 
    return $this->fetchRow($select); 
} 

Он возвращает объект с испорченными символами UTF-8 (преобразованный в iso-8859-1, я думаю).

Когда я смотрю в базе данных через phpmyadmin, он отображает все символы правильно, а также показывает правильную кодировку (UTF-8), поэтому я не знаю, где проблема.

Как я могу решить эту проблему?

UPDATE:

Так что я сделал это, и она работает:

protected function _initDb() 
{ 
    $this->configuration = new Zend_Config_Ini(APPLICATION_PATH 
               . '/configs/application.ini', 
               APPLICATION_ENVIRONMENT); 
    $this->dbAdapter = Zend_Db::factory($this->configuration->database); 
    Zend_Db_Table_Abstract::setDefaultAdapter($this->dbAdapter); 
    $stmt = new Zend_Db_Statement_Pdo($this->dbAdapter, 
             "SET NAMES 'utf8'"); 
    $stmt->execute(); 
} 

Есть ли лучший способ?

UPDATE2:

Я попытался это:

protected function _initDb() 
{ 
    $this->configuration = new Zend_Config_Ini(APPLICATION_PATH 
               . '/configs/application.ini', 
               APPLICATION_ENVIRONMENT); 
    $this->dbAdapter = Zend_Db::factory($this->configuration->database); 
    $this->dbAdapter = Zend_Db::factory($this->configuration->database->adapter, 
             $this->configuration->database->params->toArray() 
             + array('driver_options' => array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'"))); 
    Zend_Db_Table_Abstract::setDefaultAdapter($this->dbAdapter); 
} 

И я получаю ошибку:

Fatal error: Undefined class constant 'MYSQL_ATTR_INIT_COMMAND' in C:\wamp\www\bakalarka\application\Bootstrap.php on line 46 
+1

Пожалуйста см мой ответ, по-другому, что вы могли бы найти более удобным. –

+0

Спасибо, я попробую :) –

+0

Не уверен, что это применимо к вашей настройке, но я просто прочитал несколько историй (http://www.google.com/search?q=MYSQL_ATTR_INIT_COMMAND) о ошибках PHP, где 'MYSQL_ATTR_INIT_COMMAND' является недоступен в некоторых версиях. :(Вы можете попробовать использовать конкретное значение '1002', но в некоторых сообщениях сообщается, что он также не работает. Или, может быть, вам следует обновить свою настройку. Не уверен, если вы считаете, что все это стоит всех. –

ответ

3

я думаю вы используете MySQL? Единственный способ, который я знаю, чтобы заставить его вернуть данные в UTF-8, чтобы открыть соединение с базой данных и выполнить следующий запрос:

SET NAMES 'utf8' 

или, если вы используете Mysqli расширение:

mysqli_set_charset('utf8'); 

должен также работать ...

+0

Да, я подаю в суд на MySQL. попробуйте это. –

3

Wim является правильным. Однако есть способ сделать это без явного выполнения запроса, используя опцию driver_options для фабричного метода Zend_Db. Я предполагаю, что вы используете адаптер pdo_mysql и создаете его с помощью заводского метода Zend_Db.

Вы можете передать дополнительный набор параметров адаптеру с помощью этого заводского метода. Опция для pdo_mysql вы ищете PDO's MYSQL_ATTR_INIT_COMMAND.

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

$adapterType = 'pdo_mysql'; 
$adapterConfig = array(
    'host' => 'localhost', 
    'dbname' => 'yourdb', 
    'username' => 'user', 
    'password' => 'yourpassword', 
    // here is where the driver options are defined, as an associative array 
    'driver_options' => array(
     PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8' 
    ) 
); 

$dbAdapter = Zend_Db::factory($adapterType, $adapterConfig); 

Как вы можете видеть, мы можем использовать MYSQL_ATTR_INIT_COMMAND вариант ПДО. Вероятно, вы понимаете, что эта константа непригодна для использования в конфигурациях .ini.Поэтому, если вы прочитали настройки конфигурации адаптера db из файла .ini, вам нужно либо использовать конкретное значение константы в файле .ini, либо добавить/объединить массив driver_options позже в аргумент фабричного метода при выполнении (это то, что я делаю), например, так:

$dbAdapter = Zend_Db::factory(
$configuration->database->adapter, 
$configuration->database->params->toArray() + 
     array('driver_options' => array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8')) 
); 

EDIT
Я полагаю, что это вполне возможно только с проходящей один аргумент к заводским способом, как вы делаете в вашем примере, а также. Я просто привык к тому, чтобы передать два аргумента фабричному методу.

+0

См. мой отредактированный ответ: P –

13

Вместо настройки driver_options вы можете легко выполнить следующее.

Ваш ини файл:

db.adapter   = Pdo_Mysql 
db.params.host  = localhost 
db.params.dbname = mydb 
db.params.username = myuser 
db.params.password = mypass 
db.params.charset = UTF8 

Примечание Последний параметр. Затем прочитал ваш конфиг, используя Zend_Config_Ini:

$config = new Zend_Config_Ini('application.ini'); 

и передавать параметры базы данных как конфигурации подобъекте:

$db = Zend_Db::factory($config->db); 
+1

Это работало для меня. Спасибо! – Randell

+1

Работал и для меня, лучшее решение здесь IMHO –