I have this code where I connect to database and the code is working properly. However the now() function of MySQL is out of sync with PHP set default time zone function. I am comparing the PHP date with MySQL now. Therefore, I wanted to set the database time zone as well.
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;
}
I wanted to set the database time upon connection. I have this code from this site I wanted to adapt it to mine. This is the code below. I came across this code and I thought it could be of help but I am finding it hard to implement with my already working code.
$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';");
I got several error when I implemented it. One of which is.
Parse error: syntax error, unexpected ‘new’ (T_STRING), expecting function (T_FUNCTION) in /home/…/…classes/dbh.class.php on line 12. I thought may be I needed to put private and it still throw errors.
Please, how do I implement the two codes together
Link to the code I am adapting is this. Set timezone in PHP and MySQL
FULL CODE 1.(index.php)
$datedefault=date_default_timezone_set($zone['continent'].'/'.$zone['city']);
2.(dbh.class.php)
class Dbh{
private $host="22222";
private $user="777777";
private $pwd="6666";
private $dbName="55555";
protected function connect(){
$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);
$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);
$pdo->exec("SET time_zone='$offset';");
return $pdo;
}
}
This is where I am using the class 3. (user.class.php)
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;
}
}
Advertisement
Answer
You can execute SET time_zone
as an initial command. Although you really should use prepared statements all the time, this might be an acceptable hack.
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;
}
However, I need to point out that such class is completely useless. PDO is a class already and wrapping the connection logic like that serves no purpose. What I would do instead is execute it procedurally without any class.
$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]);
Now you can pass $pdo
around to whichever class that needs the connection.