【问题标题】:How to set time_zone using PDO如何使用 PDO 设置 time_zone
【发布时间】:2017-02-24 19:45:11
【问题描述】:

我有一个使用 PDO 的连接,箭头 SET NAMES UTF8

$options = [ PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES UTF8" ];

但我会添加SET time_zone='America/Sao_Paulo'。但是在我尝试过的所有方式中,我都得到了一个例外!

这是我的连接类:

//Conexão usando objeto PDO 单例模式

/** @var PDO */
private static $connect = null;

/**
 * Conecta com o banco de dados com o pattern singleton
 * Retorna um objeto PDO!
 */
private static function Conectar(){

    try {

        Setup::checkLocal();

        if(self::$connect == null) {
            $dsn = 'mysql:host='.Setup::$host.';dbname='.Setup::$base;
            $options = [ PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES UTF8; SET time_zone='America/Sao_Paulo'" ];
            self::$connect = new PDO($dsn, Setup::$user, Setup::$pass, $options);
        }

    } catch (PDOException $e) {
        echo 'PDOException: erro ao conectar ao banco de dados.';
        //PHPErro($e->getCode(), $e->getMessage(), $e->getFile(), $e->getLine());
        die;
    }

    self::$connect->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    //self::$connect->setAttribute(PDO::ATTR_ORACLE_NULLS, PDO::NULL_EMPTY_STRING);

    return self::$connect;
}

/** Retorna um objeto PDO Singleton Pattern */
public static function getConn(){
    return self::Conectar();
}

public static function prepareQuery($query, $params){

    $preparedQuery = self::getConn()->prepare($query);
    foreach ($params as $key => $value) {
        $preparedQuery->bindValue($key, $value);
    }

    $preparedQuery->execute();
    $result = $preparedQuery->fetchAll(PDO::FETCH_OBJ);

    self::$connect = null;

    return $result;
}

【问题讨论】:

标签: php mysql pdo


【解决方案1】:

这可能会对您有所帮助。试试看!

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

【讨论】:

  • 我试过这种方式,但它给了我以下错误:“致命错误:未捕获的异常 'PDOException' 带有消息 'SQLSTATE[HY000]:一般错误:2014 无法执行查询,而其他无缓冲查询是活动。考虑使用 PDOStatement::fetchAll()。或者,如果您的代码只针对 mysql 运行,您可以通过设置 PDO::MYSQL_ATTR_USE_BUFFERED_QUERY 属性来启用查询缓冲。在……”
  • 如果我只使用:[PDO::MYSQL_ATTR_INIT_COMMAND =>"SET NAMES utf8"] 它可以工作。但是使用 [PDO::MYSQL_ATTR_INIT_COMMAND =>"SET NAMES utf8;SET time_zone = 'Europe/London'"] 不起作用
  • 如果您一次执行多个查询,它将不起作用。能否请您给我看一些您的代码。
  • MySQL 客户端协议不允许多个查询“进行中”。也就是说,您已经执行了一个查询,并且您已经获取了一些结果,但不是全部——然后您尝试执行第二个查询。如果第一个查询仍有要返回的行,则第二个查询会出错。
猜你喜欢
  • 2019-09-01
  • 2020-09-05
  • 2011-04-15
  • 1970-01-01
  • 1970-01-01
  • 2011-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多