2010-11-26 45 views
1

得到了Zend Framework Web應用程序使用Doctrine 1.2連接到MYSQL 5.1服務器。設置MySQL會話變量 - 時區 - 使用Doctrine 1.2和Zend Framework

大部分數據需要輸入並顯示在本地時區。因此,遵循here的建議,我想(我認爲)將PHP和MySQL設置爲使用UTC,然後在插入/更新之前處理顯示和UTC顯示的本地時間轉換。 [如果這是完全愚蠢的,我很高興地聽到一個更好的辦法。]

所以,我怎麼告訴主義到MySQL會話設置爲UTC?從本質上講,如何告訴Doctrine在打開連接時發出MySQL命令SET SESSION time_zone = 'UTC';

提前致謝!

+0

你會考慮用`--timezone = UTC`來啓動mysql嗎? http://dev.mysql.com/doc/refman/5.1/en/time-zone-support.html?否則,您需要查找http://www.doctrine-project.org/api/orm/1.2/doctrine/doctrine_query.html。 – ajreal 2010-11-26 05:17:19

回答

2

看起來這可以通過使用postConnect()方法附加到Doctrine_Connection對象Doctrine_EventListener來完成。

Doctrine ORM for PHP - Creating a New Listener

喜歡的東西:

class Kwis_Doctrine_EventListener_Timezone extends Doctrine_EventListener 
{ 
    protected $_timezone; 

    public function __construct($timezone = 'UTC') 
    { 
     $timezone = (string) $timezone; 
     $this->_timezone = $timezone; 
    } 

    public function postConnect(Doctrine_Event $event) 
    { 
     $conn = $event->getInvoker(); 
     $conn->execute(sprintf("SET session time_zone = '%s';", $this->_timezone)); 
    } 
} 

[使用sprintf()這裏可能是業餘的,但我無法弄清楚如何做一個適當的參數綁定。 (不好意思的笑臉)

然後在我的應用程序的Bootstrap.php,我有這樣的事情:

protected function _initDoctrine() 
{ 
    // various operations relating to autoloading 
    // .. 

    $doctrineConfig = $this->getOption('doctrine'); 

    $manager = Doctrine_Manager::getInstance(); 
    // various boostrapping operations on the manager 
    // .. 

    $conn = Doctrine_Manager::connection($doctrineConfig['dsn'], 'doctrine'); 
    // various boostrapping operations on the connection 
    // .. 

    // Here's the good stuff: Add the EventListener 
    $conn->addListener(new Kwis_Doctrine_EventListener_Timezone()); 

    return $conn; 
} 

[一個稍微題外話注:我的本地開發機器上,我不停地奔跑到MySQL錯誤我沒有進入任何時區似乎被接受。原來,標準的MySQL安裝會創建mysql數據庫中的所有時區表,但實際上並未填充它們;你需要分別填充它們。更多信息在MySQL site。]