Fix timezone for dates in the past

This commit is contained in:
2020-02-09 13:10:36 +01:00
parent 08dfd82710
commit b175fd28ab
2 changed files with 22 additions and 20 deletions

View File

@@ -37,14 +37,14 @@ class Db extends PhpObject
* 'cascading_delete'=>array('table_name1'=>array('linked_table1', 'linked_table2', ...), 'table_name2'=>...)) * 'cascading_delete'=>array('table_name1'=>array('linked_table1', 'linked_table2', ...), 'table_name2'=>...))
* @var Array * @var Array
*/ */
public function __construct($sDbServer, $sLogin, $sPass, $sDatabase, $asOptions, $sEncoding='utf8mb4') public function __construct($sDbServer, $sLogin, $sPass, $sDatabase, $asOptions, $sEncoding='utf8mb4', $sTimeZone='Europe/Paris')
{ {
parent::__construct(__FILE__, Settings::DEBUG); parent::__construct(__FILE__, Settings::DEBUG);
$this->sDatabase = $sDatabase; $this->sDatabase = $sDatabase;
$this->asOptions = $asOptions; $this->asOptions = $asOptions;
//$this->oConnection = mysql_connect(self::DB_SERVER, self::DB_LOGIN, self::DB_PASS); //$this->oConnection = mysql_connect(self::DB_SERVER, self::DB_LOGIN, self::DB_PASS);
$this->oConnection = new mysqli($sDbServer, $sLogin, $sPass); $this->oConnection = new mysqli($sDbServer, $sLogin, $sPass);
$this->syncPhpParams($sEncoding); $this->syncPhpParams($sEncoding, $sTimeZone);
/* /*
$dsn = 'mysql:dbname='.$this->sDatabase.';host='.self::DB_SERVER; $dsn = 'mysql:dbname='.$this->sDatabase.';host='.self::DB_SERVER;
@@ -73,20 +73,13 @@ class Db extends PhpObject
} }
} }
private function syncPhpParams($sEncoding) private function syncPhpParams($sEncoding, $sTimeZone)
{ {
//Characters encoding //Characters encoding
$this->oConnection->set_charset($sEncoding); //SET NAMES $this->oConnection->set_charset($sEncoding); //SET NAMES
//Time zone //Timezone
$oNow = new DateTime(); $this->setQuery("SET time_zone='{$sTimeZone}';");
$iMins = $oNow->getOffset() / 60;
$iSign = ($iMins < 0)?-1:1;
$iMins = abs($iMins);
$iHours = floor($iMins / 60);
$iMins -= $iHours * 60;
$sOffset = sprintf('%+d:%02d', $iHours*$iSign, $iMins);
$this->setQuery("SET time_zone='{$sOffset}';");
} }
public function __destruct() public function __destruct()
@@ -210,7 +203,7 @@ class Db extends PhpObject
$asForeignKeyQueries = array(); $asForeignKeyQueries = array();
foreach($asTableNames as $sTableName) foreach($asTableNames as $sTableName)
{ {
$asTableColumns = array_keys($this->getTablecolumns($sTableName)); $asTableColumns = $this->getTablecolumns($sTableName, false);
foreach($asTableColumns as $sColumnName) foreach($asTableColumns as $sColumnName)
{ {
if($this->isId($sColumnName) && $sColumnName!=self::getId($sTableName)) if($this->isId($sColumnName) && $sColumnName!=self::getId($sTableName))
@@ -313,10 +306,11 @@ class Db extends PhpObject
private function isField($sTableFieldName) private function isField($sTableFieldName)
{ {
$asPath = explode('.', str_replace('`', '', $sTableFieldName)); $asPath = explode('.', str_replace('`', '', $sTableFieldName));
return (is_array($asPath) return (
&& count($asPath)==2 is_array($asPath)
&& in_array($asPath[0], $this->getTables()) //table among the declared tables && count($asPath)==2
&& in_array($asPath[1], array_keys($this->getTablecolumns($asPath[0])))); //field among the table fields && $this->isColumnInTable($asPath[0], $asPath[1])
);
} }
private function getTable($sTableId) private function getTable($sTableId)
@@ -331,7 +325,7 @@ class Db extends PhpObject
} }
} }
public function getTablecolumns($sTableName) public function getTablecolumns($sTableName, $bTypes=true)
{ {
if(!array_key_exists($sTableName, $this->asOptions['tables'])) return false; if(!array_key_exists($sTableName, $this->asOptions['tables'])) return false;
@@ -339,9 +333,16 @@ class Db extends PhpObject
foreach($this->asOptions['tables'][$sTableName] as $sFieldName) $asTableColumns[] = $sFieldName; foreach($this->asOptions['tables'][$sTableName] as $sFieldName) $asTableColumns[] = $sFieldName;
$asTableColumns[] = 'led'; $asTableColumns[] = 'led';
if(!$bTypes) return $asTableColumns;
$asTableName = array_fill(0, count($asTableColumns), $sTableName); $asTableName = array_fill(0, count($asTableColumns), $sTableName);
return array_combine($asTableColumns, array_map(array('self', 'getColumnType'), $asTableColumns, $asTableName)); return array_combine($asTableColumns, array_map(array('self', 'getColumnType'), $asTableColumns, $asTableName));
} }
public function isColumnInTable($sTableName, $sColName) {
$asCols = $this->getTablecolumns($sTableName, false);
return ($asCols && in_array($sColName, $asCols));
}
private function getColumnType($sColumnName, $sTableName) private function getColumnType($sColumnName, $sTableName)
{ {

View File

@@ -63,11 +63,12 @@ abstract class Main extends PhpObject
if($bDb) $asMandatoryClasses[] = array('name'=>'db', 'project'=>false); if($bDb) $asMandatoryClasses[] = array('name'=>'db', 'project'=>false);
foreach($asMandatoryClasses as $asClass) $this->oClassManagement->incClass($asClass['name'], $asClass['project']); foreach($asMandatoryClasses as $asClass) $this->oClassManagement->incClass($asClass['name'], $asClass['project']);
$sTimeZone = ($sTimeZone=='')?Settings::TIMEZONE:$sTimeZone;
$this->setContext($sProcessPage, $sTimeZone); $this->setContext($sProcessPage, $sTimeZone);
//Init objects //Init objects
if($bDb) { if($bDb) {
$this->oDb = new Db(Settings::DB_SERVER, Settings::DB_LOGIN, Settings::DB_PASS, Settings::DB_NAME, $this->getSqlOptions() , Settings::DB_ENC); $this->oDb = new Db(Settings::DB_SERVER, Settings::DB_LOGIN, Settings::DB_PASS, Settings::DB_NAME, $this->getSqlOptions() , Settings::DB_ENC, $sTimeZone);
if(in_array($this->oDb->sDbState, array(Db::DB_NO_DATA, Db::DB_NO_TABLE))) $this->install(); if(in_array($this->oDb->sDbState, array(Db::DB_NO_DATA, Db::DB_NO_TABLE))) $this->install();
} }
} }
@@ -81,7 +82,7 @@ abstract class Main extends PhpObject
private function setContext($sProcessPage, $sTimeZone='') private function setContext($sProcessPage, $sTimeZone='')
{ {
//Browser <> PHP <> MySql synchronization //Browser <> PHP <> MySql synchronization
date_default_timezone_set(($sTimeZone=='')?Settings::TIMEZONE:$sTimeZone); date_default_timezone_set($sTimeZone);
ini_set('default_charset', Settings::TEXT_ENC); ini_set('default_charset', Settings::TEXT_ENC);
header('Content-Type: text/html; charset='.Settings::TEXT_ENC); header('Content-Type: text/html; charset='.Settings::TEXT_ENC);
mb_internal_encoding(Settings::TEXT_ENC); mb_internal_encoding(Settings::TEXT_ENC);