使用Doctrine 1.2和Zend Framework设置MySQL会话变量 - 时区

时间:2010-11-26 04:12:14

标签: mysql zend-framework session doctrine timezone

使用Doctrine 1.2连接到MYSQL 5.1服务器获得Zend Framework Web应用程序。

大多数数据需要在本地时区输入和显示。所以遵循建议here,我想(我认为)将PHP和MySQL设置为使用UTC,然后我将处理转换到本地时间以进行显示,并在插入/更新之前处理UTC。 [如果这完全是傻瓜,我很高兴听到更好的方法。]

那么,我如何告诉Doctrine将MySQL会话设置为UTC?基本上,如何在打开连接时告诉Doctrine发出MySQL命令SET SESSION time_zone = 'UTC';

提前致谢!

1 个答案:

答案 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。]