diff --git a/inc/db.php b/inc/db.php index 7ac7a67..449a701 100644 --- a/inc/db.php +++ b/inc/db.php @@ -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) - && 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 + return ( + is_array($asPath) + && count($asPath)==2 + && $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,9 +333,16 @@ 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) { diff --git a/inc/main.php b/inc/main.php index 6c8dbc4..23a1fa4 100755 --- a/inc/main.php +++ b/inc/main.php @@ -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);