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'=>...))
* @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);
$this->sDatabase = $sDatabase;
$this->asOptions = $asOptions;
//$this->oConnection = mysql_connect(self::DB_SERVER, self::DB_LOGIN, self::DB_PASS);
$this->oConnection = new mysqli($sDbServer, $sLogin, $sPass);
$this->syncPhpParams($sEncoding);
$this->syncPhpParams($sEncoding, $sTimeZone);
/*
$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
$this->oConnection->set_charset($sEncoding); //SET NAMES
//Time zone
$oNow = new DateTime();
$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}';");
//Timezone
$this->setQuery("SET time_zone='{$sTimeZone}';");
}
public function __destruct()
@@ -210,7 +203,7 @@ class Db extends PhpObject
$asForeignKeyQueries = array();
foreach($asTableNames as $sTableName)
{
$asTableColumns = array_keys($this->getTablecolumns($sTableName));
$asTableColumns = $this->getTablecolumns($sTableName, false);
foreach($asTableColumns as $sColumnName)
{
if($this->isId($sColumnName) && $sColumnName!=self::getId($sTableName))
@@ -313,10 +306,11 @@ class Db extends PhpObject
private function isField($sTableFieldName)
{
$asPath = explode('.', str_replace('`', '', $sTableFieldName));
return (is_array($asPath)
return (
is_array($asPath)
&& count($asPath)==2
&& in_array($asPath[0], $this->getTables()) //table among the declared tables
&& 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)
@@ -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;
@@ -339,10 +333,17 @@ class Db extends PhpObject
foreach($this->asOptions['tables'][$sTableName] as $sFieldName) $asTableColumns[] = $sFieldName;
$asTableColumns[] = 'led';
if(!$bTypes) return $asTableColumns;
$asTableName = array_fill(0, count($asTableColumns), $sTableName);
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)
{
$sColumnType = '';

View File

@@ -63,11 +63,12 @@ abstract class Main extends PhpObject
if($bDb) $asMandatoryClasses[] = array('name'=>'db', 'project'=>false);
foreach($asMandatoryClasses as $asClass) $this->oClassManagement->incClass($asClass['name'], $asClass['project']);
$sTimeZone = ($sTimeZone=='')?Settings::TIMEZONE:$sTimeZone;
$this->setContext($sProcessPage, $sTimeZone);
//Init objects
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();
}
}
@@ -81,7 +82,7 @@ abstract class Main extends PhpObject
private function setContext($sProcessPage, $sTimeZone='')
{
//Browser <> PHP <> MySql synchronization
date_default_timezone_set(($sTimeZone=='')?Settings::TIMEZONE:$sTimeZone);
date_default_timezone_set($sTimeZone);
ini_set('default_charset', Settings::TEXT_ENC);
header('Content-Type: text/html; charset='.Settings::TEXT_ENC);
mb_internal_encoding(Settings::TEXT_ENC);