msd Backup hinzugefügt
This commit is contained in:
543
msd/inc/mysqli.php
Normal file
543
msd/inc/mysqli.php
Normal file
@ -0,0 +1,543 @@
|
||||
<?php
|
||||
/* ----------------------------------------------------------------------
|
||||
|
||||
MyOOS [Dumper]
|
||||
http://www.oos-shop.de/
|
||||
|
||||
Copyright (c) 2013 - 2022 by the MyOOS Development Team.
|
||||
----------------------------------------------------------------------
|
||||
Based on:
|
||||
|
||||
MySqlDumper
|
||||
http://www.mysqldumper.de
|
||||
|
||||
Copyright (C)2004-2011 Daniel Schlichtholz (admin@mysqldumper.de)
|
||||
----------------------------------------------------------------------
|
||||
Released under the GNU General Public License
|
||||
---------------------------------------------------------------------- */
|
||||
|
||||
if (!defined('MOD_VERSION')) {
|
||||
exit('No direct access.');
|
||||
}
|
||||
|
||||
//Feldspezifikationen
|
||||
$feldtypen = [
|
||||
'VARCHAR',
|
||||
'TINYINT',
|
||||
'TEXT',
|
||||
'DATE',
|
||||
'SMALLINT',
|
||||
'MEDIUMINT',
|
||||
'INT',
|
||||
'BIGINT',
|
||||
'FLOAT',
|
||||
'DOUBLE',
|
||||
'DECIMAL',
|
||||
'DATETIME',
|
||||
'TIMESTAMP',
|
||||
'TIME',
|
||||
'YEAR',
|
||||
'CHAR',
|
||||
'TINYBLOB',
|
||||
'TINYTEXT',
|
||||
'BLOB',
|
||||
'MEDIUMBLOB',
|
||||
'MEDIUMTEXT',
|
||||
'LONGBLOB',
|
||||
'LONGTEXT',
|
||||
'ENUM',
|
||||
'SET',
|
||||
];
|
||||
$feldattribute = [
|
||||
'',
|
||||
'BINARY',
|
||||
'UNSIGNED',
|
||||
'UNSIGNED ZEROFILL',
|
||||
];
|
||||
$feldnulls = [
|
||||
'NOT NULL',
|
||||
'NULL',
|
||||
];
|
||||
$feldextras = [
|
||||
'',
|
||||
'AUTO_INCREMENT',
|
||||
];
|
||||
$feldkeys = [
|
||||
'',
|
||||
'PRIMARY KEY',
|
||||
'UNIQUE KEY',
|
||||
'FULLTEXT',
|
||||
];
|
||||
$feldrowformat = [
|
||||
'',
|
||||
'FIXED',
|
||||
'DYNAMIC',
|
||||
'COMPRESSED',
|
||||
];
|
||||
|
||||
$rechte_daten = [
|
||||
'SELECT',
|
||||
'INSERT',
|
||||
'UPDATE',
|
||||
'DELETE',
|
||||
'FILE',
|
||||
];
|
||||
$rechte_struktur = [
|
||||
'CREATE',
|
||||
'ALTER',
|
||||
'INDEX',
|
||||
'DROP',
|
||||
'CREATE TEMPORARY TABLES',
|
||||
];
|
||||
$rechte_admin = [
|
||||
'GRANT',
|
||||
'SUPER',
|
||||
'PROCESS',
|
||||
'RELOAD',
|
||||
'SHUTDOWN',
|
||||
'SHOW DATABASES',
|
||||
'LOCK TABLES',
|
||||
'REFERENCES',
|
||||
'EXECUTE',
|
||||
'REPLICATION CLIENT',
|
||||
'REPLICATION SLAVE',
|
||||
];
|
||||
$rechte_resourcen = [
|
||||
'MAX QUERIES PER HOUR',
|
||||
'MAX UPDATES PER HOUR',
|
||||
'MAX CONNECTIONS PER HOUR',
|
||||
];
|
||||
|
||||
$sql_keywords = [
|
||||
'ALTER',
|
||||
'AND',
|
||||
'ADD',
|
||||
'AUTO_INCREMENT',
|
||||
'BETWEEN',
|
||||
'BINARY',
|
||||
'BOTH',
|
||||
'BY',
|
||||
'BOOLEAN',
|
||||
'CHANGE',
|
||||
'CHARSET',
|
||||
'CHECK',
|
||||
'COLLATE',
|
||||
'COLUMNS',
|
||||
'COLUMN',
|
||||
'CROSS',
|
||||
'CREATE',
|
||||
'DATABASES',
|
||||
'DATABASE',
|
||||
'DATA',
|
||||
'DELAYED',
|
||||
'DESCRIBE',
|
||||
'DESC',
|
||||
'DISTINCT',
|
||||
'DELETE',
|
||||
'DROP',
|
||||
'DEFAULT',
|
||||
'ENCLOSED',
|
||||
'ENGINE',
|
||||
'ESCAPED',
|
||||
'EXISTS',
|
||||
'EXPLAIN',
|
||||
'FIELDS',
|
||||
'FIELD',
|
||||
'FLUSH',
|
||||
'FOR',
|
||||
'FOREIGN',
|
||||
'FUNCTION',
|
||||
'FROM',
|
||||
'GROUP',
|
||||
'GRANT',
|
||||
'HAVING',
|
||||
'IGNORE',
|
||||
'INDEX',
|
||||
'INFILE',
|
||||
'INSERT',
|
||||
'INNER',
|
||||
'INTO',
|
||||
'IDENTIFIED',
|
||||
'JOIN',
|
||||
'KEYS',
|
||||
'KILL',
|
||||
'KEY',
|
||||
'LEADING',
|
||||
'LIKE',
|
||||
'LIMIT',
|
||||
'LINES',
|
||||
'LOAD',
|
||||
'LOCAL',
|
||||
'LOCK',
|
||||
'LOW_PRIORITY',
|
||||
'LEFT',
|
||||
'LANGUAGE',
|
||||
'MEDIUMINT',
|
||||
'MODIFY',
|
||||
'MyISAM',
|
||||
'NATURAL',
|
||||
'NOT',
|
||||
'NULL',
|
||||
'NEXTVAL',
|
||||
'OPTIMIZE',
|
||||
'OPTION',
|
||||
'OPTIONALLY',
|
||||
'ORDER',
|
||||
'OUTFILE',
|
||||
'OR',
|
||||
'OUTER',
|
||||
'ON',
|
||||
'PROCEEDURE',
|
||||
'PROCEDURAL',
|
||||
'PRIMARY',
|
||||
'READ',
|
||||
'REFERENCES',
|
||||
'REGEXP',
|
||||
'RENAME',
|
||||
'REPLACE',
|
||||
'RETURN',
|
||||
'REVOKE',
|
||||
'RLIKE',
|
||||
'RIGHT',
|
||||
'SHOW',
|
||||
'SONAME',
|
||||
'STATUS',
|
||||
'STRAIGHT_JOIN',
|
||||
'SELECT',
|
||||
'SETVAL',
|
||||
'TABLES',
|
||||
'TEMINATED',
|
||||
'TO',
|
||||
'TRAILING',
|
||||
'TRUNCATE',
|
||||
'TABLE',
|
||||
'TEMPORARY',
|
||||
'TRIGGER',
|
||||
'TRUSTED',
|
||||
'UNIQUE',
|
||||
'UNLOCK',
|
||||
'USE',
|
||||
'USING',
|
||||
'UPDATE',
|
||||
'UNSIGNED',
|
||||
'VALUES',
|
||||
'VARIABLES',
|
||||
'VIEW',
|
||||
'WITH',
|
||||
'WRITE',
|
||||
'WHERE',
|
||||
'ZEROFILL',
|
||||
'XOR',
|
||||
'ALL',
|
||||
'ASC',
|
||||
'AS',
|
||||
'SET',
|
||||
'IN',
|
||||
'IS',
|
||||
'IF',
|
||||
];
|
||||
$mysql_doc = [
|
||||
'Feldtypen' => 'http://dev.mysql.com/doc/mysql/de/Column_types.html',
|
||||
];
|
||||
$mysql_string_types = [
|
||||
'char',
|
||||
'varchar',
|
||||
'tinytext',
|
||||
'text',
|
||||
'mediumtext',
|
||||
'longtext',
|
||||
'binary',
|
||||
'varbinary',
|
||||
'tinyblob',
|
||||
'mediumblob',
|
||||
'blob',
|
||||
'longblob',
|
||||
'enum',
|
||||
'set',
|
||||
];
|
||||
$mysql_SQLhasRecords = [
|
||||
'SELECT',
|
||||
'SHOW',
|
||||
'EXPLAIN',
|
||||
'DESCRIBE',
|
||||
'DESC',
|
||||
];
|
||||
|
||||
function mod_mysqli_connect($encoding = 'utf8mb4', $keycheck_off = false, $actual_table = '')
|
||||
{
|
||||
global $config, $databases;
|
||||
|
||||
if (isset($config['dbconnection']) && is_resource($config['dbconnection'])) {
|
||||
return $config['dbconnection'];
|
||||
}
|
||||
|
||||
$port = (isset($config['dbport']) && !empty($config['dbport'])) ? ':'.$config['dbport'] : '';
|
||||
$socket = (isset($config['dbsocket']) && !empty($config['dbsocket'])) ? ':'.$config['dbsocket'] : '';
|
||||
|
||||
// Forcing error reporting mode to OFF, which is no longer the default
|
||||
// starting with PHP 8.1
|
||||
@mysqli_report(MYSQLI_REPORT_OFF);
|
||||
|
||||
$config['dbconnection'] = @mysqli_connect($config['dbhost'].$port.$socket, $config['dbuser'], $config['dbpass']);
|
||||
|
||||
if (!$config['dbconnection']) {
|
||||
exit(SQLError('Error establishing a database connection!', mysqli_connect_error()));
|
||||
}
|
||||
if (!defined('MOD_MYSQL_VERSION')) {
|
||||
GetMySQLVersion();
|
||||
}
|
||||
|
||||
if (!isset($config['mysql_standard_character_set']) || '' == $config['mysql_standard_character_set']) {
|
||||
get_sql_encodings();
|
||||
}
|
||||
|
||||
if ($config['mysql_standard_character_set'] != $encoding) {
|
||||
$set_encoding = mysqli_query($config['dbconnection'], 'SET NAMES \''.$encoding.'\'');
|
||||
if (false === $set_encoding) {
|
||||
$config['mysql_can_change_encoding'] = false;
|
||||
} else {
|
||||
$config['mysql_can_change_encoding'] = true;
|
||||
}
|
||||
}
|
||||
if ($keycheck_off) {
|
||||
// only called with this param when restoring
|
||||
mysqli_query($config['dbconnection'], 'SET FOREIGN_KEY_CHECKS=0');
|
||||
// also set SQL-Mode NO_AUTO_VALUE_ON_ZERO for magento users
|
||||
mysqli_query($config['dbconnection'], 'SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"');
|
||||
}
|
||||
|
||||
return $config['dbconnection'];
|
||||
}
|
||||
|
||||
function GetMySQLVersion()
|
||||
{
|
||||
global $config;
|
||||
if (!isset($config['dbconnection'])) {
|
||||
mod_mysqli_connect();
|
||||
}
|
||||
|
||||
$res = mod_query('SELECT VERSION()');
|
||||
$row = mysqli_fetch_array($res);
|
||||
$str = $row[0];
|
||||
$version = str_replace(':', '--', $str);
|
||||
if (!defined('MOD_MYSQL_VERSION')) {
|
||||
define('MOD_MYSQL_VERSION', $version);
|
||||
}
|
||||
$versions = explode('.', $version);
|
||||
$new = false;
|
||||
if (4 == $versions[0] && $versions[1] >= 1) {
|
||||
$new = true;
|
||||
}
|
||||
if ($versions[0] > 4) {
|
||||
$new = true;
|
||||
}
|
||||
if (!defined('MOD_NEW_VERSION')) {
|
||||
define('MOD_NEW_VERSION', $new);
|
||||
}
|
||||
|
||||
return $version;
|
||||
}
|
||||
|
||||
function mod_query($query, $error_output = true)
|
||||
{
|
||||
global $config;
|
||||
// print_mem();
|
||||
if (!isset($config['dbconnection'])) {
|
||||
mod_mysqli_connect();
|
||||
}
|
||||
// echo "<br>Query: ".htmlspecialchars($query).'<br>';
|
||||
$res = mysqli_query($config['dbconnection'], $query);
|
||||
// print_mem();
|
||||
if (false === $res && $error_output) {
|
||||
SQLError($query, mysqli_error($config['dbconnection']));
|
||||
}
|
||||
return $res;
|
||||
}
|
||||
|
||||
function print_mem()
|
||||
{
|
||||
/* Currently used memory */
|
||||
$mem_usage = memory_get_usage();
|
||||
|
||||
/* Peak memory usage */
|
||||
$mem_peak = memory_get_peak_usage();
|
||||
|
||||
echo 'The script is now using: <strong>'.round($mem_usage / 1024).' KB</strong> of memory.<br>';
|
||||
echo 'Peak usage: <strong>'.round($mem_peak / 1024).' KB</strong> of memory.<br><br>';
|
||||
}
|
||||
|
||||
function SQLError($sql, $error, $return_output = false)
|
||||
{
|
||||
global $lang;
|
||||
|
||||
$ret = '<div align="center"><table style="border:1px solid #ff0000" cellspacing="0">
|
||||
<tr bgcolor="#ff0000"><td style="color:white;font-size:16px;"><strong>MySQL-ERROR</strong></td></tr>
|
||||
<tr><td style="width:80%;overflow: auto;">'.$lang['L_SQL_ERROR2'].'<br><span style="color:red;">'.$error.'</span></td></tr>
|
||||
<tr><td width="600"><br>'.$lang['L_SQL_ERROR1'].'<br>'.Highlight_SQL($sql).'</td></tr>
|
||||
</table></div><br />';
|
||||
if ($return_output) {
|
||||
return $ret;
|
||||
} else {
|
||||
echo $ret;
|
||||
}
|
||||
}
|
||||
|
||||
function Highlight_SQL($sql)
|
||||
{
|
||||
global $sql_keywords;
|
||||
|
||||
$end = '';
|
||||
$tickstart = false;
|
||||
if (function_exists('token_get_all')) {
|
||||
$a = @token_get_all("<?php $sql?>");
|
||||
} else {
|
||||
return $sql;
|
||||
}
|
||||
foreach ($a as $token) {
|
||||
if (!is_array($token)) {
|
||||
if ('`' == $token) {
|
||||
$tickstart = !$tickstart;
|
||||
}
|
||||
$end .= $token;
|
||||
} else {
|
||||
if ($tickstart) {
|
||||
$end .= $token[1];
|
||||
} else {
|
||||
switch (token_name($token[0])) {
|
||||
case 'T_STRING':
|
||||
case 'T_AS':
|
||||
case 'T_FOR':
|
||||
$end .= (in_array(strtoupper($token[1]), $sql_keywords)) ? '<span style="color:#990099;font-weight:bold;">'.$token[1].'</span>' : $token[1];
|
||||
break;
|
||||
case 'T_IF':
|
||||
case 'T_LOGICAL_AND':
|
||||
case 'T_LOGICAL_OR':
|
||||
case 'T_LOGICAL_XOR':
|
||||
$end .= (in_array(strtoupper($token[1]), $sql_keywords)) ? '<span style="color:#0000ff;font-weight:bold;">'.$token[1].'</span>' : $token[1];
|
||||
break;
|
||||
case 'T_CLOSE_TAG':
|
||||
case 'T_OPEN_TAG':
|
||||
break;
|
||||
default:
|
||||
$end .= $token[1];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
$end = preg_replace('/`(.*?)`/si', '<span style="color:red;">`$1`</span>', $end);
|
||||
return $end;
|
||||
}
|
||||
|
||||
function Fieldlist($db, $tbl)
|
||||
{
|
||||
$fl = '';
|
||||
$res = mod_query("SHOW FIELDS FROM `$db`.`$tbl`;");
|
||||
if ($res) {
|
||||
$fl = '(';
|
||||
for ($i = 0; $i < mysqli_num_rows($res); ++$i) {
|
||||
$row = mysqli_fetch_row($res);
|
||||
$fl .= '`'.$row[0].'`,';
|
||||
}
|
||||
$fl = substr($fl, 0, strlen($fl) - 1).')';
|
||||
}
|
||||
return $fl;
|
||||
}
|
||||
|
||||
// reads all Tableinfos and place them in $dump-Array
|
||||
function getDBInfos()
|
||||
{
|
||||
global $databases, $dump, $config, $tbl_sel, $flipped;
|
||||
for ($ii = 0; $ii < count($databases['multi']); ++$ii) {
|
||||
$dump['dbindex'] = $flipped[$databases['multi'][$ii]];
|
||||
$tabellen = mysqli_query($config['dbconnection'], 'SHOW TABLE STATUS FROM `'.$databases['Name'][$dump['dbindex']].'`') or exit('getDBInfos: '.mysqli_error($config['dbconnection']));
|
||||
$num_tables = mysqli_num_rows($tabellen);
|
||||
// Array mit den gewünschten Tabellen zusammenstellen... wenn Präfix angegeben, werden die anderen einfach nicht übernommen
|
||||
if ($num_tables > 0) {
|
||||
for ($i = 0; $i < $num_tables; ++$i) {
|
||||
$row = mysqli_fetch_array($tabellen);
|
||||
if (isset($row['Type'])) {
|
||||
$row['Engine'] = $row['Type'];
|
||||
}
|
||||
if (isset($row['Comment']) && 'VIEW' == substr(strtoupper($row['Comment']), 0, 4)) {
|
||||
$dump['table_types'][] = 'VIEW';
|
||||
} else {
|
||||
$dump['table_types'][] = strtoupper($row['Engine']);
|
||||
}
|
||||
// check if data needs to be backed up
|
||||
if ('VIEW' == strtoupper($row['Comment']) || (isset($row['Engine']) && in_array(strtoupper($row['Engine']), [
|
||||
'MEMORY',
|
||||
]))) {
|
||||
$dump['skip_data'][] = $databases['Name'][$dump['dbindex']].'|'.$row['Name'];
|
||||
}
|
||||
if ((isset($config['optimize_tables_beforedump']) && (1 == $config['optimize_tables_beforedump'])) && -1 == $dump['table_offset']
|
||||
&& 'information_schema' != $databases['Name'][$dump['dbindex']]) {
|
||||
mysqli_select_db($config['dbconnection'], $databases['Name'][$dump['dbindex']]);
|
||||
$opt = 'OPTIMIZE TABLE `'.$row['Name'].'`';
|
||||
$res = mysqli_query($config['dbconnection'], 'OPTIMIZE TABLE `'.$row['Name'].'`');
|
||||
if (false === $res) {
|
||||
exit('Error in '.$opt.' -> '.mysqli_error($config['dbconnection']));
|
||||
}
|
||||
}
|
||||
|
||||
if (isset($tbl_sel)) {
|
||||
if (in_array($row['Name'], $dump['tblArray'])) {
|
||||
$dump['tables'][] = $databases['Name'][$dump['dbindex']].'|'.$row['Name'];
|
||||
$dump['records'][] = $databases['Name'][$dump['dbindex']].'|'.$row['Rows'];
|
||||
$dump['totalrecords'] += $row['Rows'];
|
||||
}
|
||||
} elseif ('' != $databases['praefix'][$dump['dbindex']] && !isset($tbl_sel)) {
|
||||
if (substr($row['Name'], 0, strlen($databases['praefix'][$dump['dbindex']])) == $databases['praefix'][$dump['dbindex']]) {
|
||||
$dump['tables'][] = $databases['Name'][$dump['dbindex']].'|'.$row['Name'];
|
||||
$dump['records'][] = $databases['Name'][$dump['dbindex']].'|'.$row['Rows'];
|
||||
$dump['totalrecords'] += $row['Rows'];
|
||||
}
|
||||
} else {
|
||||
$dump['tables'][] = $databases['Name'][$dump['dbindex']].'|'.$row['Name'];
|
||||
$dump['records'][] = $databases['Name'][$dump['dbindex']].'|'.$row['Rows'];
|
||||
|
||||
// Get nr of records -> need to do it this way because of incorrect returns when using InnoDBs
|
||||
$sql_2 = 'SELECT count(*) as `count_records` FROM `'.$databases['Name'][$dump['dbindex']].'`.`'.$row['Name'].'`';
|
||||
$res2 = mysqli_query($config['dbconnection'], $sql_2);
|
||||
if (false === $res2) {
|
||||
$read_error = mysqli_error($config['dbconnection']);
|
||||
SQLError($read_error, $sql_2);
|
||||
WriteLog($read_error);
|
||||
if ($config['stop_with_error'] > 0) {
|
||||
exit($read_error);
|
||||
}
|
||||
} else {
|
||||
$row2 = mysqli_fetch_array($res2);
|
||||
$row['Rows'] = $row2['count_records'];
|
||||
$dump['totalrecords'] += $row['Rows'];
|
||||
}
|
||||
}
|
||||
}
|
||||
// Correct total number of records; substract skipped data
|
||||
foreach ($dump['skip_data'] as $skip_data) {
|
||||
$index = false;
|
||||
$records_to_skip = 0;
|
||||
//find index of table to get the nr of records
|
||||
$count = sizeof($dump['tables']);
|
||||
for ($a = 0; $a < $count; ++$a) {
|
||||
if ($dump['tables'][$a] == $skip_data) {
|
||||
$index = $a;
|
||||
$t = explode('|', $dump['records'][$a]);
|
||||
$rekords_to_skip = $t[1];
|
||||
break;
|
||||
}
|
||||
}
|
||||
if ($index) {
|
||||
$dump['totalrecords'] -= intval($rekords_to_skip);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// gets the numeric index in dump-array and returns it
|
||||
function getDBIndex($db, $table)
|
||||
{
|
||||
global $dump;
|
||||
$index = array_keys($dump['tables'], $db.'|'.$table);
|
||||
return $index[0];
|
||||
}
|
Reference in New Issue
Block a user