app->Container('Database'); private $disablehtmlclearing; /** @var bool */ private $disableclearjs; /** @var int */ private $maxAllowedPacket = 16777215; /** @var string */ private $dbuser; /** @var string */ private $dbpass; /** @var string */ private $dbhost; /** @var int $dbport */ private $dbport = 3306; /** @var array */ protected $columnCache = []; /** @var ApplicationCore $app */ /** * DB constructor. * * @param string $dbhost * @param string $dbname * @param string $dbuser * @param string $dbpass * @param null|Application $app * @param int $dbport */ public function __construct($dbhost,$dbname,$dbuser,$dbpass,$app=null,$dbport=null) { $this->app = $app; $this->dbname=$dbname; $this->dbhost = $dbhost; $this->dbport = $dbport !== null ? (int)$dbport : 3306; $this->dbuser = $dbuser; $this->dbpass = $dbpass; $this->disablehtmlclearing = false; $this->disableclearjs = false; $this->columnCache[$dbname] = []; $this->connection = mysqli_connect($dbhost, $dbuser, $dbpass, '', $dbport); if(empty($this->connection)) { return; } mysqli_select_db($this->connection,$dbname); mysqli_query($this->connection, "SET NAMES 'utf8'"); mysqli_query($this->connection, "SET SESSION SQL_MODE := ''"); mysqli_query($this->connection, "SET CHARACTER SET 'utf8'"); mysqli_query($this->connection, 'SET lc_time_names = "de_DE" '); mysqli_query($this->connection, 'SET SQL_BIG_SELECTS=1'); } /** * @return DB */ public function getClone() { return new DB($this->dbhost, $this->dbname, $this->dbuser, $this->dbpass, $this->app, $this->dbport); } /** * @return array */ public function getProcessListIds() { $processList = $this->SelectArr('SHOW PROCESSLIST'); $ids = []; if(empty($processList)) { return $ids; } foreach($processList as $process) { $ids[] = $process['Id']; } return $ids; } /** * @param bool $value */ public function DisableHTMLClearing($value = true) { $this->disablehtmlclearing = $value; } /** * @param bool $value */ public function DisableJSClearing($value = true) { $this->disableclearjs = $value; } /** * @return string */ public function GetVersion() { if(empty($this->connection)) { return ''; } $version_string = mysqli_get_server_info($this->connection); $version_string = substr($version_string,0,3); $version_string = str_replace('.','',$version_string); if($version_string < 57) { $version = $this->Select('SELECT VERSION()'); if(strripos($version, 'maria') !== false && $version[0] === '1' && str_replace('.','', substr($version,0,4)) >= 102) { return '57'; } } return (String)$version_string; } /** * @return array */ public function GetVersionArr() { if(empty($this->connection)) { return ['',0.,'']; } $version = $this->Select('SELECT VERSION()'); $isMaria = strripos($version, 'maria') !== false; if(!$isMaria) { $version_string = mysqli_get_server_info($this->connection); $version_string = substr($version_string,0,3); $version_stringFormat = str_replace('.','',$version_string); return ['mysql', $version_string, $version_stringFormat]; } $mariaVersion = substr($version, 0, 4); $version_stringFormat = str_replace('.','', $mariaVersion); return ['mariadb',$mariaVersion, $version_stringFormat]; } /** * @return bool|null */ public function Close() { if(empty($this->connection)) { return null; } return @mysqli_close($this->connection); } /** * @param string $database * * @return bool|null */ public function SelectDB($database) { if((String)$database === '') { return null; } $this->columnCache[$database] = []; return @mysqli_select_db($this->connection, $database); } /** * @param null|mysqli_result $query */ public function free($query = null){ // Speicher freimachen if($query === null && !empty($this->_result)) { mysqli_free_result($this->_result); return; } if($query !== null){ mysqli_free_result($query); } } /** * @param string $table * @param string $column * * @return int|bool|null */ public function ColumnExists($table, $column) { if(empty($table) || empty($column) || empty($this->connection)){ return false; } $exists = $this->Select("SELECT COUNT(*) FROM information_schema.columns WHERE table_schema = '{$this->dbname}' AND table_name = '$table' AND column_name = '$column'"); return $exists; } /** * @param $sql * * @return array|mixed|string|null */ public function Select($sql) { if(empty($sql) || empty($this->connection) || strlen($sql) > $this->maxAllowedPacket) { return null; } $this->disablehtmlclearing = true; $this->disableclearjs = true;//30.07.18 Bruno kurzfritig eingefuegt um Fehler in Beschreibungstexten zu verhindern $args = func_num_args(); if($args === 1) { if(class_exists('DevTools')){ DevTools::Add('','','Select',$sql); } $this->results = @mysqli_query($this->connection,$sql); if($this->results === false) { return null; } /** * Abbrechen query mit SET beginnt */ if (stripos($sql,'set') === 0) { return ''; } $count = 0; $data = null; if(!$this->results) { return null; } $jsarray = null; if((!$this->disablehtmlclearing || !$this->disableclearjs) && !empty($this->app) && !empty($this->app->stringcleaner)) { $jsarray = $this->app->stringcleaner->CheckSQLHtml($sql); } // Don't process boolean results (e.g. UPDATE successfull) if ($this->results !== true) { while( $row = @mysqli_fetch_array($this->results)) { if($jsarray) { $j = -1; foreach($row as $k => $v) { $j++; $pos1 = strpos($v, '['); $pos2 = strpos($v, '<'); if($pos1 === false && $pos2 === false) { continue; } if($pos1 !== false) { $v = preg_replace('/\[([A-Z]{1}[\_A-Z0-9]*)\]/','$1', $v); } $row[$k] = $v; if($pos2 !== false && !empty($this->app) && !empty($this->app->stringcleaner)) { $dummy = null; if(isset($jsarray[$j]) && !$jsarray[$j]) { if($this->disablehtmlclearing) { $row[$k] = $this->app->stringcleaner->CleanString($row[$k], 'nojs', $dummy); } else { $row[$k] = $this->app->stringcleaner->CleanSQLReturn($v, $k); } } elseif(isset($jsarray[$j]) && 1 == $jsarray[$j] && !empty($this->app->stringcleaner)) { $row[$k] = $this->app->stringcleaner->CleanString($v, 'nojs', $dummy); } } } } $data[$count] = $row; $count++; } @mysqli_free_result($this->results); } if($data === null) { return $data; } if(count($data) === 1){ $data = $data[0][0]; } elseif(count($data) < 1) { $data=''; } return $data; } $arrArgs = func_get_args(); $params=null; foreach($arrArgs as $key=>$arg) { if($key=='0') { $sql = preg_replace('/:(\w+)/i', '?', $arg); $s = str_repeat('s', count($arrArgs)-1); $params[] = &$s; } else { $params[]= &$arrArgs[$key]; } } if(empty($params)) { return null; } $stmt = mysqli_prepare($this->connection,$sql); if($stmt === false) { return null; } try { $bindParamsMethod = new ReflectionMethod('mysqli_stmt', 'bind_param'); $bindParamsMethod->invokeArgs($stmt, $params); } catch(Exception $e) { return null; } $ret = mysqli_stmt_execute($stmt); if($ret === false) { return null; } $resultMetaData = mysqli_stmt_result_metadata($stmt); if($resultMetaData === false) { return null; } $stmtRow = array(); $rowReferences = array(); $firstcol = null; while ($field = mysqli_fetch_field($resultMetaData)) { $rowReferences[] = &$stmtRow[$field->name]; if($firstcol === null) { $firstcol = $field->name; } } mysqli_free_result($resultMetaData); try { $bindResultMethod = new ReflectionMethod('mysqli_stmt', 'bind_result'); $bindResultMethod->invokeArgs($stmt, $rowReferences); } catch(Exception $e) { return null; } $count = 0; $data = null; while(mysqli_stmt_fetch($stmt)) { $row = array(); foreach($stmtRow as $key => $value) { $row[$key] = $value; } $data[] = $row; } mysqli_stmt_free_result($stmt); if($data === null) { return $data; } if(!empty($data) && count($data) === 1) { return $data[0][$firstcol]; } if(empty($data)) { return $data; } return $data; } /** * @param string $sql * @param int $cache * @param string $shortcode * @param null|string $lastTime * * @return array|null */ public function SelectArrCache($sql, $cache = 0, $shortcode = '', &$lastTime = null){ if(empty($sql) || empty($this->connection) || strlen($sql) > $this->maxAllowedPacket) { return null; } if($cache <= 0) { $lastTime = (string)$this->Select('SELECT NOW()'); return $this->SelectArr($sql); } $arr = $this->SelectRow( "SELECT `id`, `ergebnis`, `zeitstempel`, `zeitstempel` < DATE_SUB(NOW(), INTERVAL $cache SECOND) as abgelaufen FROM `sqlcache` WHERE `abfrage` = '".$this->real_escape_string($sql)."' LIMIT 1" ); $isEmpty = empty($arr); if($isEmpty|| $arr['abgelaufen']) { $erg = $this->SelectArr($sql); $lastTime = (string)$this->Select('SELECT NOW()'); if(!$isEmpty) { $this->Update( "UPDATE sqlcache SET zeitstempel = now(), ergebnis = '".base64_encode(json_encode($erg))."',sekunden = '$cache' WHERE id = '".$arr['id']."' LIMIT 1" ); } else{ $this->Insert( "INSERT INTO sqlcache (abfrage, ergebnis, zeitstempel,shortcode,sekunden) VALUES ('".$this->real_escape_string($sql)."','".base64_encode(json_encode($erg))."',now(),'$shortcode','$cache')" ); $arr = []; $arr['id'] = $this->GetInsertID(); } $this->Delete('DELETE FROM sqlcache WHERE zeitstempel < DATE_SUB(NOW(), INTERVAL sekunden SECOND) '); return $erg; } $ret = json_decode(base64_decode($arr['ergebnis']),true); if($ret !== false) { $lastTime = $arr['zeitstempel']; return $ret; } $erg = $this->SelectArr($sql); $this->Update( "UPDATE `sqlcache` SET `zeitstempel` = now(), `ergebnis` = '".base64_encode(json_encode($erg))."', `sekunden` = '$cache' WHERE `id` = '".$arr['id']."' LIMIT 1" ); $lastTime = (string)$this->Select('SELECT NOW()'); return $erg; } /** * @param string $sql * * @return array|null */ public function SelectRow($sql) { if(empty($sql) || empty($this->connection) || strlen($sql) > $this->maxAllowedPacket) { return null; } $this->disablehtmlclearing = true; $this->disableclearjs = true;//30.07.18 Bruno kurzfritig eingefuegt um Fehler in Beschreibungstexten zu verhindern $args = func_num_args(); if($args === 1) { if(class_exists('DevTools')){ DevTools::Add('','','SelectArr',$sql); } if(1) { $this->results = @mysqli_query($this->connection,$sql); if(!$this->results) { return null; } $jsarray = null; if((!$this->disablehtmlclearing || !$this->disableclearjs) && isset($this->app->stringcleaner) && $this->app) { $jsarray = $this->app->stringcleaner->CheckSQLHtml($sql); } $count = 0; $data = null; $nojs = 'nojs'; if($jsarray) { if(strpos($sql,'results)){ if($jsarray) { $j = -1; foreach($row as $k => $v) { if(is_numeric($k)) { continue; } $j++; $pos1 = strpos($v, '['); $pos2 = strpos($v, '<'); if($pos1 === false && $pos2 === false) { continue; } if($pos1 !== false) { $v = preg_replace('/\[([A-Z]{1}[\_A-Z0-9]*)\]/','$1', $v); } if($pos2 !== false && $this->app) { $dummy = null; if(isset($jsarray[$j]) && !$jsarray[$j]) { if($this->disablehtmlclearing) { $row[$k] = $this->app->stringcleaner->CleanString($v, $nojs, $dummy); } else{ $row[$k] = $this->app->stringcleaner->CleanSQLReturn($v, $k, $nojs); } } elseif(isset($jsarray[$j]) && 1 == $jsarray[$j]) { $row[$k] = $this->app->stringcleaner->CleanString($v, $nojs, $dummy); } else { $row[$k] = $v; } } else{ $row[$k] = $v; } } } unset($ArrData); // erstelle datensatz array foreach($row as $key=>$value) { if(!is_numeric($key)) { $ArrData[$key]=$value; } } if(!empty($ArrData)){ $data = $ArrData; } $count++; } @mysqli_free_result($this->results); } if(!empty($data)) { return $data; } return null; } $arrArgs = func_get_args(); $params=null; foreach($arrArgs as $key=>$arg) { if($key=='0') { $sql = preg_replace('/:(\w+)/i', '?', $arg); $s = str_repeat('s', count($arrArgs)-1); $params[] = &$s; } else { $params[]= &$arrArgs[$key]; } } if(empty($params)) { return null; } $stmt = mysqli_prepare($this->connection,$sql); if($stmt === false) { return null; } try { $bindParamsMethod = new ReflectionMethod('mysqli_stmt', 'bind_param'); $bindParamsMethod->invokeArgs($stmt, $params); } catch(Exception $e) { return null; } $ret = mysqli_stmt_execute($stmt); if($ret === false) { return null; } $resultMetaData = mysqli_stmt_result_metadata($stmt); if($resultMetaData === false){ return null; } $stmtRow = array(); $rowReferences = array(); while ($field = mysqli_fetch_field($resultMetaData)) { $rowReferences[] = &$stmtRow[$field->name]; } mysqli_free_result($resultMetaData); try { $bindResultMethod = new ReflectionMethod('mysqli_stmt', 'bind_result'); $bindResultMethod->invokeArgs($stmt, $rowReferences); } catch(Exception $e) { return null; } $count = 0; $data = null; if(mysqli_stmt_fetch($stmt)) { $row = array(); foreach($stmtRow as $key => $value) { $row[$key] = $value; } $data = $row; } mysqli_stmt_free_result($stmt); return $data; } /** * @param string $sql * * @return array */ public function SelectFirstCols($sql) { if(empty($sql)) { return []; } $this->results = @mysqli_query($this->connection,$sql); if(!$this->results) { return []; } $ret = []; while( $row = @mysqli_fetch_assoc($this->results)){ $ret[] = reset($row); } return $ret; } /** * @param string $sql * * @return array */ public function SelectPairs($sql) { $this->results = @mysqli_query($this->connection,$sql); if(!$this->results) { return []; } $ret = []; while( $row = @mysqli_fetch_row($this->results)){ if(count($row) < 2) { mysqli_free_result($this->results); return []; } $ret[$row[0]] = $row[1]; } mysqli_free_result($this->results); return $ret; } /** * @param string $sql * @param int $cache * @param string $shortcode * * @return array|null */ public function SelectArr($sql, $cache = 0, $shortcode = '') { if(empty($sql) || empty($this->connection) || strlen($sql) > $this->maxAllowedPacket) { return null; } $this->disablehtmlclearing = true; $this->disableclearjs = true;//30.07.18 Bruno kurzfritig eingefuegt um Fehler in Beschreibungstexten zu verhindern $args = func_num_args(); if($args === 1) { if(class_exists('DevTools')){ DevTools::Add('','','SelectArr',$sql); } if(1){ $this->results = @mysqli_query($this->connection,$sql); if(!$this->results) { return null; } $jsarray = null; if((!$this->disablehtmlclearing || !$this->disableclearjs) && !empty($this->app) && !empty($this->app->stringcleaner)) { $jsarray = $this->app->stringcleaner->CheckSQLHtml($sql); } $count = 0; $data = null; $nojs = 'nojs'; if($jsarray) { if(strpos($sql,'results)){ if($jsarray) { $j = -1; foreach($row as $k => $v) { if(is_numeric($k)) { continue; } $j++; $pos1 = strpos($v, '['); $pos2 = strpos($v, '<'); if($pos1 === false && $pos2 === false) { continue; } $dummy = null; if($pos1 !== false) { $v = preg_replace('/\[([A-Z]{1}[\_A-Z0-9]*)\]/','$1', $v); } if($pos2 !== false && !empty($this->app)) { if(isset($jsarray[$j]) && !$jsarray[$j] && !empty($this->app->stringcleaner)) { if($this->disablehtmlclearing) { $row[$k] = $this->app->stringcleaner->CleanString($v, $nojs, $dummy); } else{ $row[$k] = $this->app->stringcleaner->CleanSQLReturn($v, $k, $nojs); } } elseif(isset($jsarray[$j]) && 1 == $jsarray[$j] && !empty($this->app->stringcleaner)) { $row[$k] = $this->app->stringcleaner->CleanString($v, $nojs, $dummy); } else { $row[$k] = $v; } } else{ $row[$k] = $v; } } } unset($ArrData); // erstelle datensatz array foreach($row as $key=>$value){ if(!is_numeric($key)) { $ArrData[$key]=$value; } } $data[$count] = $ArrData; $count++; } @mysqli_free_result($this->results); } return $data; } $arrArgs = func_get_args(); $params=null; foreach($arrArgs as $key=>$arg){ if($key=='0') { $sql = preg_replace('/:(\w+)/i', '?', $arg); $s = str_repeat('s', count($arrArgs)-1); $params[] = &$s; } else { $params[]= &$arrArgs[$key]; } } if(empty($params)) { return null; } $stmt = mysqli_prepare($this->connection,$sql); if($stmt === false) { return null; } try { $bindParamsMethod = new ReflectionMethod('mysqli_stmt', 'bind_param'); $bindParamsMethod->invokeArgs($stmt, $params); } catch(Exception $e) { return null; } $ret = mysqli_stmt_execute($stmt); if(empty($ret)) { return null; } $resultMetaData = mysqli_stmt_result_metadata($stmt); if(empty($resultMetaData)) { return null; } $stmtRow = array(); $rowReferences = array(); while ($field = mysqli_fetch_field($resultMetaData)) { $rowReferences[] = &$stmtRow[$field->name]; } mysqli_free_result($resultMetaData); try { $bindResultMethod = new ReflectionMethod('mysqli_stmt', 'bind_result'); $bindResultMethod->invokeArgs($stmt, $rowReferences); } catch(Exception $e) { return null; } //$count = 0; $data = null; while(mysqli_stmt_fetch($stmt)){ $row = array(); foreach($stmtRow as $key => $value){ $row[$key] = $value; } $data[] = $row; } mysqli_stmt_free_result($stmt); return $data; } public function Result($sql){ if(empty($sql) || empty($this->connection)) { return null; } $query = mysqli_query($this->connection,$sql); if(empty($query)) { return null; } return mysqli_result($query, 0); } /** * @return int|string|null */ public function GetInsertID(){ if(empty($this->connection)) { return null; } return mysqli_insert_id($this->connection); } /** * @param string $sql * * @return null|array */ public function GetArray($sql){ $i=0; $result = mysqli_query($this->connection,$sql); $tmp = null; while($row = mysqli_fetch_assoc($result)) { foreach ($row as $key=>$value){ $tmp[$i][$key]=$value; } $i++; } return $tmp; } /** * @param string $sql * * @return bool|mysqli_result|null */ public function Insert($sql){ if(empty($sql) || empty($this->connection) || strlen($sql) > $this->maxAllowedPacket) { return null; } $args = func_num_args(); if($args === 1) { if(class_exists('DevTools')){ DevTools::Add('','','Insert',$sql); } $this->LogSQL($sql,'insert'); $ret = mysqli_query($this->connection,$sql); if(mysqli_errno($this->connection) === 1118) { mysqli_query($this->connection, 'SET innodb_strict_mode = OFF;'); $ret = mysqli_query($this->connection, $sql); if(mysqli_errno($this->connection) === 1118 && !empty($this->app) && !empty($this->app->erp) && method_exists($this->app->erp, 'setSystemHealth')) { $this->app->erp->setSystemHealth('database', 'error','sql_errors', 'Row size to large Error'); $ret = mysqli_query($this->connection, $sql); } } return $ret; } $arrArgs = func_get_args(); $params=null; foreach($arrArgs as $key=>$arg) { if($key=='0') { $sql = preg_replace('/:(\w+)/i', '?', $arg); $s = str_repeat('s', count($arrArgs)-1); $params[] = &$s; } else { $params[]= &$arrArgs[$key]; } } if(empty($params)) { return null; } $stmt = mysqli_prepare($this->connection,$sql); if($stmt === false) { return null; } try { $bindParamsMethod = new ReflectionMethod('mysqli_stmt', 'bind_param'); $bindParamsMethod->invokeArgs($stmt, $params); } catch (Exception $e) { return null; } $ret = mysqli_stmt_execute($stmt); if($ret) { return $ret; } mysqli_stmt_free_result($stmt); return $ret; } /** * @param string $sql * * @return bool|mysqli_result|null */ public function InsertWithoutLog($sql){ if(empty($sql) || empty($this->connection) || strlen($sql) > $this->maxAllowedPacket) { return null; } return mysqli_query($this->connection,$sql); } /** * @param string $sql * * @return bool|mysqli_result|null */ public function Update($sql){ if(empty($sql) || empty($this->connection) || strlen($sql) > $this->maxAllowedPacket) { return null; } $args = func_num_args(); if($args===1) { if(class_exists('DevTools')) { DevTools::Add('','','Update',$sql); } $this->LogSQL($sql,'update'); $query = mysqli_query($this->connection,$sql); if(mysqli_errno($this->connection) === 1118) { mysqli_query($this->connection, 'SET innodb_strict_mode = OFF;'); $query = mysqli_query($this->connection,$sql); if(mysqli_errno($this->connection) === 1118 && !empty($this->app) && !empty($this->app->erp) && method_exists($this->app->erp, 'setSystemHealth')) { $this->app->erp->setSystemHealth('database', 'error','sql_errors', 'Row size to large Error'); try { /** @var Systemhealth $systemhealth */ $systemhealth = $this->app->erp->LoadModul('systemhealth'); if($systemhealth !== null && method_exists($systemhealth, 'createEvent')){ $systemhealth->createEvent('database', 'sql_errors', 'error', '', 0, 'Row size to large Error'); } } catch (Exception $d) { } $query = mysqli_query($this->connection,$sql); } } if(strpos($sql,'firmendaten') !== false && mysqli_errno($this->connection) === 1118) { $this->app->erp->ensureDatabaseUpgradeProperty(); $this->app->DatabaseUpgrade->ChangeFirmendatenToMyIsam(); return mysqli_query($this->connection,$sql); } return $query; } $arrArgs = func_get_args(); $params=null; foreach($arrArgs as $key=>$arg){ if($key=='0') { $sql = preg_replace('/:(\w+)/i', '?', $arg); $s = str_repeat('s', count($arrArgs)-1); $params[] = &$s; } else { $params[]= &$arrArgs[$key]; } } if(empty($params)) { return null; } $stmt = mysqli_prepare($this->connection,$sql); if($stmt === false) { return null; } try { $bindParamsMethod = new ReflectionMethod('mysqli_stmt', 'bind_param'); $bindParamsMethod->invokeArgs($stmt, $params); } catch (Exception $e) { return null; } $ret = mysqli_stmt_execute($stmt); if(!$ret) { return $ret; } mysqli_stmt_free_result($stmt); return $ret; } /** * @param string $sql * * @return bool|mysqli_result|null */ public function UpdateWithoutLog($sql){ if(empty($sql) || empty($this->connection) || strlen($sql) > $this->maxAllowedPacket) { return null; } return mysqli_query($this->connection,$sql); } /** * @param string $sql * * @return bool|mysqli_result|null */ public function Delete($sql){ if(empty($sql) || empty($this->connection)) { return null; } if(class_exists('DevTools')) { DevTools::Add('','','Delete',$sql); } $this->LogSQL($sql,'delete'); return mysqli_query($this->connection,$sql); } /** * @param string $sql * * @return bool|mysqli_result|null */ public function Drop($sql){ if(empty($sql) || empty($this->connection) || strlen($sql) > $this->maxAllowedPacket) { return null; } if(class_exists('DevTools')) { DevTools::Add('','','Drop',$sql); } $this->LogSQL($sql,'drop'); return mysqli_query($this->connection,$sql); } public function LogSQL($sql,$befehl) { /* $name = $this->app->User->GetName(); $sql = base64_encode($sql); $serial = base64_encode(serialize($this->app->Secure)); mysqli_query($this->connection,"INSERT INTO logdatei (id,name,befehl,statement,app,zeit) VALUES ('','$name','$befehl','$sql','$serial',NOW())"); */ } /** * @param string $sql * * @return int */ public function Count($sql){ if(!empty($sql) && !empty($this->connection) && strlen($sql) <= $this->maxAllowedPacket && mysqli_query($this->connection,$sql)) { return mysqli_num_rows(mysqli_query($this->connection,$sql)); } return 0; } /** * @param string $table * * @return bool */ public function CheckTableExistence($table){ if(empty($table)) { return false; } $result = mysqli_query($this->connection,"SELECT * FROM $table LIMIT 1"); if (empty($result)) { return false; } return true; } /** * @param string $table * @param string $col * * @return bool */ public function CheckColExistence($table,$col) { if(!$this->CheckTableExistence($table)) { return false; } $result = mysqli_query($this->connection,"SHOW COLUMNS FROM $table"); if (!$result) { echo 'Could not run query: ' . mysqli_error(); exit; } if (mysqli_num_rows($result) <= 0) { return false; } while ($row = mysqli_fetch_assoc($result)) { if($row['Field']==$col) { @mysqli_free_result($result); return true; } } @mysqli_free_result($result); return false; } /** * @return array */ public function GetTables() { $tables = $this->SelectArr('show tables'); $result = array(); if(empty($tables)) { return $result; } foreach ($tables as $tab) { foreach ($tab as $key => $tabname) { $result[] = $tabname; } } return $result; } /** * @param string $table * * @return array|null */ public function GetColArray($table) { if(!$this->CheckTableExistence($table)){ return null; } $result = mysqli_query($this->connection,"SHOW COLUMNS FROM $table"); if (!$result) { echo 'Could not run query: ' . mysqli_error(); exit; } if (mysqli_num_rows($result) <= 0) { return null; } while ($row = mysqli_fetch_assoc($result)) { $ret[]=$row['Field']; } mysqli_free_result($result); if(empty($ret)) { return null; } return $ret; } /** * @param string $table * * @return null|array */ public function GetColAssocArray($table) { if(!$this->CheckTableExistence($table)){ return null; } $result = mysqli_query($this->connection,"SHOW COLUMNS FROM $table"); if (!$result) { echo 'Could not run query: ' . mysqli_error(); exit; } if (mysqli_num_rows($result) <= 0) { return null; } while ($row = mysqli_fetch_assoc($result)) { $ret[$row['Field']]=''; } mysqli_free_result($result); if(empty($ret)) { return null; } return $ret; } /** * @param string $tablename * @param mixed $pk * @param string $pkname * @param array $ArrCols * @param bool $escape */ public function UpdateArr($tablename,$pk,$pkname,$ArrCols, $escape = false) { if(empty($ArrCols) || empty($tablename) || empty($pk) || empty($this->connection)) { return; } if(empty($pkname)) { $pkname = 'id'; } if(!empty($this->columnCache[$this->dbname][$tablename])) { $zielspalten = $this->columnCache[$this->dbname][$tablename]; } else{ $zielspalten = $this->SelectArr("show columns from `$tablename`"); $this->columnCache[$this->dbname][$tablename] = $zielspalten; } if(!empty($zielspalten)) { foreach($zielspalten as $val) { $ziel[$val['Field']] = true; } } $sql = "UPDATE `$tablename` SET "; foreach($ArrCols as $key=>$value) { if($key!=$pkname && (isset($ziel[$key]) || !$zielspalten)) { $sqla[] = "`".$key."` = '".($escape?$this->real_escape_string($value):$value)."' "; } } if(!empty($sqla)) { $sql .= implode(', ',$sqla)." WHERE `$pkname`='$pk' LIMIT 1"; $this->Update($sql); if(!$this->error()) { return; } } foreach($ArrCols as $key=>$value) { if($key != $pkname){ if($escape) { $value = $this->real_escape_string($value); } $this->Query("UPDATE `$tablename` SET `$key`='$value' WHERE `$pkname`='$pk' LIMIT 1"); } } } /** * @param string $tablename * @param string $pkname * @param array $ArrCols * @param bool $escape * * @return int */ public function InsertArr($tablename,$pkname,$ArrCols, $escape = false) { if(empty($tablename)) { return null; } if(empty($pkname)) { $pkname = 'id'; } // save primary than update $this->Query('INSERT INTO `'.$tablename.'` ('.$pkname.') VALUES (NULL)'); $pk = (int)$this->GetInsertID(); if(empty($pk) || empty($ArrCols)) { return $pk; } $this->UpdateArr($tablename, $pk, $pkname, $ArrCols, $escape); return $pk; } /** * get table content with specified cols * * @param string $tablename * @param null|array $cols * * @return array|null */ public function SelectTable($tablename,$cols){ if(empty($tablename)) { return null; } $firstcol = true; $selection = '*'; if(!empty($cols)) { $selection = ''; foreach($cols as $value) { if(!$firstcol){ $selection .= ','; } $selection .= $value; $firstcol=false; } } $sql = "SELECT $selection FROM $tablename"; return $this->SelectArr($sql); } /** * @param string $query * @param bool $async * * @return bool|mysqli_result|null */ public function Query($query, $async = false) { if(stripos($query,'ALTER TABLE') !== false) { $this->columnCache[$this->dbname] = []; } if(empty($query) || empty($this->connection)){ return null; } if(class_exists('DevTools')){ DevTools::Add('','','Query',$query); } if($async) { return mysqli_query($this->connection, $query, MYSQLI_ASYNC); } $ret = mysqli_query($this->connection,$query); if(mysqli_errno($this->connection) === 1118 && stripos($query,'ALTER TABLE') !== false) { mysqli_query($this->connection, 'SET innodb_strict_mode = OFF;'); $ret = mysqli_query($this->connection,$query); } return $ret; } /** * @deprecated Use Fetch_Assoc OR Fetch_Row insteed (can causes Problem with some PHP/MySQL-Versions) * @see DB::Fetch_Assoc() * @see DB::Fetch_Row() * @param mysqli_result $query SQL-Queryresult * * @return array|null return Next result as an associative, a numeric array, or both */ public function Fetch_Array($query) { if(empty($query)) { return null; } return mysqli_fetch_array($query); } /** * @param mysqli_result $query SQL-Queryresult * * @return array|null return next result as an associative array */ public function Fetch_Assoc($query) { if(empty($query)) { return null; } return mysqli_fetch_assoc($query); } /** * @param mysqli_result $query SQL-Queryresult * * @return array|null return next result as an enumerated array */ public function Fetch_Row($query) { if(empty($query)) { return null; } return mysqli_fetch_row($query); } /** * Get Rowinformation of a Query-Result even if empty * * @param mysqli_result $query SQL-Queryresult * * @return array|null Row-Information */ public function Fetch_Fields($query) { if(empty($query)) { return null; } return $query->fetch_fields(); } /** * @param mysqli_result $sql * @param int $offset * * @return bool|null */ public function Data_Seek($sql,$offset=0) { if(empty($sql)) { return null; } return mysqli_data_seek($sql,$offset); } /** * @param string $TableName * @param string $IDFieldName * @param int $IDToDuplicate * * @return int|null */ public function MysqlCopyRow($TableName, $IDFieldName, $IDToDuplicate) { if(empty($TableName) || empty($IDFieldName) || empty($IDToDuplicate)) { return null; } /* $sql = "SELECT * FROM $TableName WHERE $IDFieldName = $IDToDuplicate"; $result = @mysqli_query($this->connection,$sql); if(empty($result)) { return null; } $sql = "INSERT INTO $TableName SET "; $row = mysqli_fetch_array($result); $RowKeys = array_keys($row); $RowValues = array_values($row); $cRowKeys = $RowKeys?count($RowKeys):0; for ($i=3;$i<$cRowKeys;$i+=2) { if ($i!==3) { $sql .= ', '; } $sql .= $RowKeys[$i] . " = '" . $this->real_escape_string($RowValues[$i]) . "'"; } @mysqli_query($this->connection,$sql); */ $sql = "INSERT INTO ".$TableName." SELECT "; $fields = $this->GetColAssocArray($TableName); $comma = ""; foreach ($fields as $field => $value) { if ($field != $IDFieldName) { $sql .= $comma."`".$field."`"; } else { $sql .= "NULL"; } $comma = ", "; } $sql .= " FROM ".$TableName." WHERE id = ".$IDToDuplicate; @mysqli_query($this->connection,$sql); $id = $this->GetInsertID(); if(empty($id)) { return null; } return $id; } /** * @param mixed $value * * @return string */ public function real_escape_string($value) { return mysqli_real_escape_string($this->connection, $value); } /** * @return int */ public function affected_rows() { return mysqli_affected_rows($this->connection); } /** * @return string */ public function error() { return mysqli_error($this->connection); } /** * @return int */ public function errno() { return mysqli_errno($this->connection); } /** * @param int $pid * * @return bool|mysqli_result */ public function kill($pid) { if($pid <= 0) { return false; } // Get list of processes $list_of_processes = mysqli_query($this->connection, "select id from information_schema.processlist where id=$pid"); if (get_class($list_of_processes) == 'mysqli') { if (mysqli_num_rows($list_of_processes) > 0) { $result = mysqli_query($this->connection, 'KILL QUERY '.$pid); return($result); } } return(false); } /** * @param bool $echo * * @return bool */ public function LogIfError($echo = false) { $error = $this->error(); if(!$error) { return false; } if(!empty($this->app)) { $this->app->erp->LogFile(mysqli_real_escape_string($this->connection, $error)); } if($echo) { echo $error; } return true; } }