Zend Framework: Как мне включить мое процедурное решение для кириллических (русских) символов в мой проект ZF? - PullRequest
1 голос
/ 07 декабря 2011

Я в своем первом проекте ZF и наткнулся на кирпичную стену с русскими иероглифами. (см. мой оригинальный пост на StackOverflow здесь ) Я переключился на простой старый процедурный PHP, чтобы устранить его, и теперь я могу использовать небольшую помощь для внедрения моего решения в мой проект ZF.

<code>// in application.ini
    resources.db.adapter = pdo_mysql
    resources.db.params.host = localhost
    resources.db.params.username = user
    resources.db.params.password = pass
    resources.db.params.dbname = db
    resources.db.params.charset = UTF8
    resources.db.params.driver_options.1002 = "SET NAMES utf8"

// in bootstrap
    public function initDb(){  // For Testing ---->
        /* Configures PDO to execute the 'SET NAMES UTF8;' SQL query just before any
           other query. If no query is executed on your page, this will not be executed. */
        $pdoParams = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES UTF8;');

        $params = array(
            'host' => 'localhost',  // TODO: get from application.ini
            'username' => 'user',  // TODO: get from application.ini
            'password' => 'pass',  // TODO: get from application.ini
            'dbname' => 'db',  // TODO: get from application.ini
            'driver_options' => $pdoParams
        );
        try {
            $db = Zend_Db::factory('PDO_MYSQL', $params);
            Zend_Db_Table_Abstract::setDefaultAdapter($db);
        } catch (Exception $e) {
            exit($e->getMessage());
        }

        Zend_Registry::set('dbAdapter', $db);
    }

// my data table gateway
    class Model_DbTable_Books extends Zend_Db_Table_Abstract {
        protected $_name = 'book';
        protected $_primary = 'id';
    }

// my controller action
    public function listAction(){
        $DbTableBooks = new Model_DbTable_Books();
        $this->view->allBooks = $DbTableBooks->fetchAll();
    }

// my view script
     echo'<pre>'; print_r($this->allBooks); echo'
'; // Для тестирования ---->

[UPDATE]

Вот SQL для моей таблицы:

CREATE TABLE IF NOT EXISTS `book` (
  `id` int(3) unsigned NOT NULL AUTO_INCREMENT,
  `parentID` int(3) unsigned DEFAULT NULL,
  `russian` varchar(24) NOT NULL,
  `english` varchar(24) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `parentId` (`parentID`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=3;

INSERT INTO `book` (`id`, `parentID`, `russian`, `english`) VALUES
(1, 0, 'Мэри имела', 'Mary had'),
(2, 0, 'Небольшой ягненок', 'a little lamb');

А вот процедурный код, который работает:

<code>/* SANDBOX */
if(!$link = mysql_connect('localhost','user','pass')) die('Could not connect: ' . mysql_error());
mysql_set_charset('UTF8',$link);

if (!$db = mysql_select_db('db', $link)) die ("Can't use $_DB : " . mysql_error());

$result = mysql_query('SELECT * FROM book');
while($row = mysql_fetch_assoc($result))  {
    echo'<pre>';print_r($row);echo'
'; // Для тестирования ----> } mysql_close ($ ссылка);

[/ UPDATE]

Ответы [ 2 ]

1 голос
/ 07 декабря 2011

У меня были те же проблемы с французскими акцентами.Моя база данных была в utf8_general_ci, мое соединение в UTF-8, как вы делаете.

Чтобы это работало, мне пришлось запустить следующий код в моем _initDb в моем загрузчике:

protected function _initDbAdapter()
{
    $this->bootstrap('db');
    $db = $this->getPluginResource('db');

    // force utf-8 charset
    $stmt = new Zend_Db_Statement_Pdo(
        $db->getDbAdapter(),
        "SET NAMES 'utf8'"
    );
    $stmt->execute();

    $dbAdapter = $db->getDbAdapter();

    Zend_Registry::set('db', $dbAdapter);
}
0 голосов
/ 08 декабря 2011

Возможно, звучит глупо, но попробуйте поставить UTF8 в "", что-то вроде:

resources.db.params.charset = "UTF8"

Это было бы:

resources.db.adapter = "Pdo_Mysql"
resources.db.params.charset = "UTF8"
resources.db.params.username = "woot"
resources.db.params.password = "forever_alone"
resources.db.params.dbname = "wooot_10000"
resources.db.params.host = "localhost"
...