【问题标题】:Cakephp set database timezoneCakephp 设置数据库时区
【发布时间】:2016-02-13 20:39:13
【问题描述】:

我将时区设置为 php 和 mysql 以国际化我的 CakePHP 应用程序。

当服务器收到来自客户端的请求时,在处理请求之前,它会连接到 GeoIp 位置服务器并获取时区。然后我使用date_default_timezone_set() 设置php 时区。当我想设置数据库时区时,问题就出现了。连接 Cakephp 后,我需要执行像 SET time_zone='-06:00' 这样的 sql 查询。

在 /lib/Cake/Model/Datasource/Database/Mysql.php 我可以在 connect() 函数中看到以下代码:

    try {
        $this->_connection = new PDO(
            $dsn,
            $config['login'],
            $config['password'],
            $flags
        );
        $this->connected = true;
        if (!empty($config['settings'])) {
            foreach ($config['settings'] as $key => $value) {
                $this->_execute("SET $key=$value");
            }
        }
    } catch (PDOException $e) {
        throw new MissingConnectionException(array(
            'class' => get_class($this),
            'message' => $e->getMessage()
        ));
    }

有一个 $config['settings'] 数组可以配置为执行此操作。但我不知道如何填充设置数组以及最好的地方。

我需要即时修改默认数据源配置

【问题讨论】:

    标签: php mysql cakephp internationalization


    【解决方案1】:

    您可以向位于app/Config/database.php 的配置数组添加一个附加键,如下所示:

    public $default = array(
        'datasource'  => 'Database/Mysql',
        'persistent'  => false,
        'host'        => 'localhost',
        'login'       => 'db_user',
        'password'    => 'db_pass',
        'database'    => 'db_name',
        'prefix'      => '',
        'settings'    => array(
               'time_zone' => "'+01:00'", // note the quotes!
        )
    );
    

    相关:CakePHP switch database (using same datasource) on the fly?

    【讨论】:

    • 嗯...我知道那个选项,但是这样我就无法连接到 GeoIp Server。 -06:00 是动态的。
    • 并非如此。 AppController 在 ConnectionManager 建立连接之前执行,所以我在那里获得了用户的位置,我不知道如何从 AppController 获取默认配置和添加设置数组。我不需要另一个连接,因为在那一刻,还没有连接。我需要的是:即时修改默认数据源配置。
    • 我已经发布了一个关于我真正想做的解决方案@skywalker
    • 我已经编辑了答案。该代码引发了 MySQL 错误,要使其正常工作,您必须将传递的值括在引号中,以便 MySQL 将其视为字符串而不是表达式。见How to set time zone of MySQL。测试了建议的更新并确认它有效。
    【解决方案2】:

    我通过以下方式解决了。

    首先,在DATABASE_CONFIG类中添加setOptions()方法如下:

    public function setOptions ($datasource, array $options){
        $this->{$datasource} = array_merge($this->{$datasource}, $options);
    }
    

    之后,扩展 ConnectionManager 类对其进行初始化:

    class ConnectionManagerCustomConfig extends ConnectionManager
    {
        public static function initialize(){
            self::_init();
        }
    }
    

    现在我初始化类并添加新选项:

    ConnectionManagerCustomConfig::initialize();
    $configClass = ConnectionManagerCustomConfig::$config;
    $configClass->setOptions('default', array(
      'settings' => array(
        'time_zone' => $offset
      )
    ));
    

    【讨论】:

    • 我自己从来没有时间写这样的东西,但我认为这是要走的路。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-21
    • 2022-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-27
    • 2012-12-04
    相关资源
    最近更新 更多