使用Doctrine 1.2连接到MYSQL 5.1服务器获得Zend Framework Web应用程序。
大多数数据需要在本地时区输入和显示。所以遵循建议here,我想(我认为)将PHP和MySQL设置为使用UTC,然后我将处理转换到本地时间以进行显示,并在插入/更新之前处理UTC。 [如果这完全是傻瓜,我很高兴听到更好的方法。]
那么,我如何告诉Doctrine将MySQL会话设置为UTC?基本上,如何在打开连接时告诉Doctrine发出MySQL命令SET SESSION time_zone = 'UTC';
?
提前致谢!
答案 0 :(得分:2)
似乎可以通过使用Doctrine_Connection
方法将Doctrine_EventListener
对象附加到postConnect()
来完成此操作。
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。]