Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在连接时设置pdo时区_Php_Mysql_Sql_Datetime_Pdo - Fatal编程技术网

Php 如何在连接时设置pdo时区

Php 如何在连接时设置pdo时区,php,mysql,sql,datetime,pdo,Php,Mysql,Sql,Datetime,Pdo,我有这个代码,我连接到数据库,代码工作正常。但是MySQL的now()函数与PHP的set default time zone函数不同步。我现在正在比较PHP日期和MySQL。因此,我也想设置数据库时区 private $host="9999999"; private $user="99999999"; private $pwd="8888888"; private $dbName="88888

我有这个代码,我连接到数据库,代码工作正常。但是MySQL的now()函数与PHP的set default time zone函数不同步。我现在正在比较PHP日期和MySQL。因此,我也想设置数据库时区

    private $host="9999999";
    private $user="99999999";
    private $pwd="8888888";
    private $dbName="88888888";

    protected function connect(){
        $dsn='mysql:host='.$this->host.';dbname='.$this->dbName;
        $pdo = new PDO($dsn, $this->user, $this->pwd);
    
        $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
    
        return $pdo;
    }
    
    



我想在连接时设置数据库时间。我有这个网站的代码,我想让它适应我的。这是下面的代码。我遇到了这段代码,我认为它可能会有所帮助,但我发现用我已经在工作的代码很难实现


$now = new DateTime();
$mins = $now->getOffset() / 60;
$sgn = ($mins < 0 ? -1 : 1);
$mins = abs($mins);
$hrs = floor($mins / 60);
$mins -= $hrs * 60;
$offset = sprintf('%+d:%02d', $hrs*$sgn, $mins);

//Your DB Connection - sample
$pdo = new PDO('mysql:host=localhost;dbname=test', 'dbuser', 'dbpassword');
$pdo->exec("SET time_zone='$offset';");

2.(dbh.class.php)


您可以作为初始命令执行
设置时区
。尽管您确实应该始终使用准备好的语句,但这可能是一种可以接受的黑客行为

protected function connect() {
    $tz = (new DateTime('now', new DateTimeZone('Asia/Kabul')))->format('P');
    $dsn = 'mysql:host='.$this->host.';dbname='.$this->dbName;
    $pdo = new \PDO($dsn, $this->user, $this->pwd, [
        \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION,
        \PDO::MYSQL_ATTR_INIT_COMMAND => "SET time_zone='$tz'"
    ]);

    $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);

    return $pdo;
}
然而,我需要指出的是,这样的类是完全无用的。PDO已经是一个类了,像这样包装连接逻辑毫无用处。我要做的是在没有任何类的情况下按程序执行它

$tz = (new DateTime('now', new DateTimeZone('Asia/Kabul')))->format('P');

$pdo = new \PDO("mysql:host=localhost;dbname=test;charset=utf8mb4", 'user', 'pass', [
    \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION,
    \PDO::MYSQL_ATTR_INIT_COMMAND => "SET time_zone='$tz'"
]);

$stmt = $pdo->prepare('SET time_zone=?');
$stmt->execute([$tz]);

现在,您可以将
$pdo
传递给需要连接的任何类。

我已经尝试解释了更多。第一个代码正在运行。我想修改第二段代码,将php中的时区转换为mysql now()函数。现在解决方案运行良好。然而,我在php中通过了时区,我将类dbh设置为私有,并在其他CALS中使用它。我的index.php
$datedefault=date\u default\u timezone\u set('Africa'./'Lagos')我如何使它和这个数据库关联?你们帮我做了
$tz=(newdatetime('now',newdatetimezone('Africa/Lagosl'))->格式('P')我想要一个场景,在这个场景中,带有connect()方法的类dbh将获取php中设置的默认时区,而不是创建一个单独的时区。我想这段代码可以做到<代码>$now=new DateTime()$分钟=$now->getOffset()/60$sgn=($mins<0?-1:1)$分钟=绝对值($分钟)$小时=楼层(分钟/60美元)$分钟-=$hrs*60$偏移量=sprintf('%+d:%02d',$hrs*$sgn,$min)而不是再次设置它$tz=(新日期时间('now',新日期时区('Asia/Kabul'))->格式('P')@Kokwo您可以省略
(new DateTime('now'))->format('P')
中的时区参数。我需要指出的是,您永远不应该从连接类继承,只应该连接一次。
class Users extends Dbh{

    
        protected function getByandbye($email, $phone){
        $sql="SELECT * FROM user WHERE `email`=? OR CONCAT (`pre`,`phone`)=?";
        $stmt= $this->connect()->prepare($sql);
        $stmt->execute([$email, $phone]);
        $user=$stmt->fetch();
        return $user;

    }
}

protected function connect() {
    $tz = (new DateTime('now', new DateTimeZone('Asia/Kabul')))->format('P');
    $dsn = 'mysql:host='.$this->host.';dbname='.$this->dbName;
    $pdo = new \PDO($dsn, $this->user, $this->pwd, [
        \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION,
        \PDO::MYSQL_ATTR_INIT_COMMAND => "SET time_zone='$tz'"
    ]);

    $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);

    return $pdo;
}
$tz = (new DateTime('now', new DateTimeZone('Asia/Kabul')))->format('P');

$pdo = new \PDO("mysql:host=localhost;dbname=test;charset=utf8mb4", 'user', 'pass', [
    \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION,
    \PDO::MYSQL_ATTR_INIT_COMMAND => "SET time_zone='$tz'"
]);

$stmt = $pdo->prepare('SET time_zone=?');
$stmt->execute([$tz]);