2021-05-21 08:49:41 +02:00
|
|
|
<?php
|
2022-05-16 14:13:07 +02:00
|
|
|
/*
|
|
|
|
**** COPYRIGHT & LICENSE NOTICE *** DO NOT REMOVE ****
|
|
|
|
*
|
|
|
|
* Xentral (c) Xentral ERP Sorftware GmbH, Fuggerstrasse 11, D-86150 Augsburg, * Germany 2019
|
|
|
|
*
|
|
|
|
* This file is licensed under the Embedded Projects General Public License *Version 3.1.
|
|
|
|
*
|
|
|
|
* You should have received a copy of this license from your vendor and/or *along with this file; If not, please visit www.wawision.de/Lizenzhinweis
|
|
|
|
* to obtain the text of the corresponding license version.
|
|
|
|
*
|
|
|
|
**** END OF COPYRIGHT & LICENSE NOTICE *** DO NOT REMOVE ****
|
2021-05-21 08:49:41 +02:00
|
|
|
*/
|
|
|
|
?>
|
2022-05-16 14:13:07 +02:00
|
|
|
<?php
|
|
|
|
/// Interface for communication with a MySQL Database
|
|
|
|
class DB{
|
|
|
|
/** @var string */
|
|
|
|
public $dbname;
|
|
|
|
/** @var false|mysqli */
|
|
|
|
public $connection;
|
|
|
|
/** @var bool */
|
|
|
|
public $Log = false;
|
|
|
|
/** @var mysqli_result|null|bool */
|
|
|
|
public $results;
|
|
|
|
/** @var Application|null */
|
|
|
|
public $app;
|
|
|
|
//public $pdo; // Removed in 19.2; Use $this->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);
|
|
|
|
}
|
2022-05-17 14:52:01 +02:00
|
|
|
|
|
|
|
// Don't process boolean results (e.g. UPDATE successfull)
|
|
|
|
if ($this->results !== true) {
|
|
|
|
while( $row = @mysqli_fetch_array($this->results)) {
|
2022-05-16 14:13:07 +02:00
|
|
|
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++;
|
2022-05-17 14:52:01 +02:00
|
|
|
}
|
|
|
|
@mysqli_free_result($this->results);
|
2022-05-16 14:13:07 +02:00
|
|
|
}
|
2022-05-17 14:52:01 +02:00
|
|
|
|
2022-05-16 14:13:07 +02:00
|
|
|
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,'<input') || strpos($sql,'<select')) {
|
|
|
|
$nojs = 'xss_clean';
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if( $row = @mysqli_fetch_array($this->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,'<input') || strpos($sql,'<select')) {
|
|
|
|
$nojs = 'xss_clean';
|
|
|
|
}
|
|
|
|
}
|
|
|
|
while( $row = @mysqli_fetch_array($this->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)) {
|
2023-12-15 01:53:52 +01:00
|
|
|
$sqla[] = "`".$key."` = '".($escape?$this->real_escape_string($value):$value)."' ";
|
2022-05-16 14:13:07 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
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;
|
|
|
|
}
|
2023-08-07 13:12:57 +02:00
|
|
|
/*
|
2022-05-16 14:13:07 +02:00
|
|
|
$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]) . "'";
|
|
|
|
}
|
2023-08-07 13:12:57 +02:00
|
|
|
|
|
|
|
@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;
|
|
|
|
|
2022-05-16 14:13:07 +02:00
|
|
|
@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;
|
|
|
|
}
|
2022-05-23 12:49:54 +02:00
|
|
|
|
|
|
|
// 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);
|
2022-05-16 14:13:07 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @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;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|