Php 如何在连接时设置pdo时区
我有这个代码,我连接到数据库,代码工作正常。但是MySQL的now()函数与PHP的set default time zone函数不同步。我现在正在比较PHP日期和MySQL。因此,我也想设置数据库时区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
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]);