【问题标题】:Changing time zone after connecting to database using "set time_zone = ..."使用“set time_zone = ...”连接到数据库后更改时区
【发布时间】:2014-08-25 00:01:41
【问题描述】:

我正在尝试在连接到我的数据库后立即将时区更改为“欧洲/伦敦”。这是我的原始代码:

$pdo = new PDO('mysql:host=localhost;dbname=exampletable', 'exampleuser', 'examplepassw', array(\PDO::MYSQL_ATTR_INIT_COMMAND =>  'SET NAMES utf8');

我将其更改为以下代码,但显然这不是更改时区的正确方法,因为我收到错误。

$pdo = new PDO('mysql:host=localhost;dbname=exampletable', 'exampleuser', 'examplepassw', array(\PDO::MYSQL_ATTR_INIT_COMMAND =>  'SET NAMES utf8', 'SET time_zone = 'Europe/London''));

如何更改从 PDO 开始的时区?

【问题讨论】:

  • 我不知道是否可以将其注入PDO,但<?php date_default_timezone_set('Europe/London');不够或不够?
  • 查看bugs.php.net/bug.php?id=48859 可能会为您提供一些答案。正在使用array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8;SET time_zone = 'Europe/Prague'"),所以试试看。
  • 你得到什么错误?我看到代码有几个潜在的问题。 (a) 值必须是一个数组,(b) 单引号字符串中的单引号字符串。 (c) SET time_zone 可能是每个语句,并且 (d) 时区名称可能对您的 MySQL 服务器不可用。试试array (\PDO::MYSQL_ATTR_INIT_COMMAND => array ('SET NAMES utf8', 'SET GLOBAL time_zone = "+01:00"'))
  • 'SET NAMES utf8', "SET time_zone = 'Europe/London'")); 现在,我们等待...
  • 所以现在我有了这段代码,我的网页将不再加载:$pdo = new PDO('mysql:host=localhost;dbname=exampletable', 'exampleuser', 'examplepassw', array(\PDO::MYSQL_ATTR_INIT_COMMAND => array ('SET NAMES utf8', "SET time_zone = 'Europe/London'")));

标签: php mysql sql pdo timezone


【解决方案1】:

在其他人的帮助下(参见 cmets),我设法找到了完成这项工作的代码:

$pdo = new PDO('mysql:host=localhost;dbname=exampletable', 
               'exampleuser', 
               'examplepassw', 
               [PDO::MYSQL_ATTR_INIT_COMMAND =>"SET NAMES utf8;SET time_zone = 'Europe/London'"]);

【讨论】:

    【解决方案2】:

    我这样做(在 Amazon RDS 上 - 因为没有“系统”方式来更改它):

    try {
        $timezone = "America/Chicago";;
    
        $objDb = new PDO('mysql:host=localhost;dbname=my_database', 'username', 'password');
        $objDb->exec("SET time_zone = '{$timezone}'");
    
    } catch (PDOException $e) {
        echo 'Connection failed: ' . $e->getMessage();
    }
    

    【讨论】:

      【解决方案3】:

      这是唯一适合我的方法:

      $db = new PDO('mysql:host='.$servername.';dbname='.$dbname,$username,$password,
      array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8, time_zone = "-6:00";', 
      PDO::ATTR_EMULATE_PREPARES => false, 
      PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
      

      希望对您有所帮助。

      【讨论】:

      • 您通过查询而不是 DSN 设置字符集的任何原因?
      • 没有特别的原因。我使用拉丁字符并认为是最好的方法。
      • 不是。根据文档,在 DSN 中设置字符集是唯一推荐的方法,因为它告诉服务器 客户端使用哪个字符集,而您的查询仅影响服务器
      猜你喜欢
      • 1970-01-01
      • 2011-11-28
      • 2021-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-04
      • 2017-12-26
      相关资源
      最近更新 更多