ACC SHELL
<?php
// trida Db - databaze
class Db
{
var $tables, $tableTypes, $columnTypes, $columns;
// konstruktor, pripoji se automaticky k databazi
function Db()
{
include('config.php');
// echo '<strong>web je momentalne ve vystavbe, v nejblizsich dnech bude zprovoznen</strong><br /><br />';
mysql_connect($mysql_host, $mysql_login, $mysql_passwd) or die(mysql_error());
mysql_select_db($mysql_db);
mysql_query("SET NAMES utf8");
$this->checkMysqlError('');
$this->getTables();
$this->getTableTypes();
$this->getColumnTypes();
}
function getTableSysName($id)
{
$data=mysql_query('SELECT sys_name FROM sys_db_tables WHERE id='.(int)$id.';');
}
// zkontroluje mysql_error(), pokud dojde k chybe, skript ukonci
function checkMysqlError($sql)
{
if (TRUE==mysql_error())
{
// die('Chyba databáze. Omlouváme se, zkuste stránku nav‘tívit později.');
die(mysql_error().'<br /><br />'.nl2br($sql));
}
else
{
return 0;
}
}
// provede sql dotaz a vrati pole vysledku
function query($sql)
{
$result=array();
$query=mysql_query($sql);
$this->checkMysqlError($sql);
while ($data=mysql_fetch_array($query))
{
$result[]=$data;
}
return $result;
}
// provede sql dotaz bez vraceni pole vysledku
function queryN($sql)
{
//$sql = str_replace($GLOBALS["http_root"],'*http_root*',$sql);
$query=mysql_query($sql);
// die(mysql_error().'<br /><br />'.nl2br($sql));
$this->checkMysqlError($sql);
}
// ziska nazvy vsech tabulek v databazi (jako pole)
function getTables()
{
$this->tables=array();
$data=$this->query('SELECT sys_name, id FROM sys_db_tables;');
for ($i=0; $i<count($data); $i++)
{
$this->tables[$data[$i]['sys_name']]=$data[$i]['id'];
}
}
function getColumns($table)
{
$this->tables=array();
$data=$this->query('SELECT c.sys_name, c.id FROM sys_db_columns AS c LEFT JOIN sys_db_tables AS t ON (c.table_id=t.id) WHERE t.name=\''.$table.'\';');
for ($i=0; $i<count($data); $i++)
{
$this->columns[$data[$i]['sys_name']]=$data[$i]['id'];
}
}
function getTableTypes()
{
$this->tableTypes=array();
$data=$this->query('SELECT type, id FROM sys_db_table_types;');
for ($i=0; $i<count($data); $i++)
{
$this->tableTypes[$data[$i]['type']]=$data[$i]['id'];
}
}
function getColumnTypes()
{
$this->columnTypes=array();
$data=$this->query('SELECT type, id, sql_type FROM sys_db_column_types;');
for ($i=0; $i<count($data); $i++)
{
$this->columnTypes[strtolower($data[$i]['type'])]['id']=$data[$i]['id'];
$this->columnTypes[strtolower($data[$i]['type'])]['sql_type']=$data[$i]['sql_type'];
}
}
// vytvoreni tabulky (uzivatelske jmeni, nazev typu), vraci nazev tabulky v DB
function createTable($name, $type, $alt_name='')
{
// pokud dany typ neexistuje, zemri
if (FALSE==isset($this->tableTypes[$type]))
{
die('Error: Unknown table type: \''.$type.'\'');
}
//uprava nazvu tabulky (pridavej na konec specialni znak, dukud tabulka pod danym nazvem v databazi neexistuje)
$sys_name=strtolower(sys_name($name));
if (TRUE==$alt_name)
{
$name=$alt_name;
}
// pokud se jedna o systemovou tabulku, pridej prefix 'sys'
if ('system'==$type)
{
$sys_name='sys_'.$sys_name;
}
while (TRUE==isset($this->tables['sys_name']))
{
$sys_name.='_';
}
// konec: uprava tabulky
// pridani tabulky ze zakladnimi sloupcy do databaze
$sql='
CREATE TABLE
'.$sys_name.'
(
id int(11) NOT NULL auto_increment,
create_time int(11) NOT NULL default \'0\',
active enum(\'Y\',\'N\') NOT NULL default \'Y\',
list int(11) NOT NULL default \'0\',
PRIMARY KEY (id),
UNIQUE KEY list (list)
) DEFAULT CHARSET utf8;;
';
$this->queryN($sql);
// pridani tabulky do sys_db_tables
$sql='
SELECT max(list) AS max
FROM sys_db_tables
';
$max=mysql_fetch_array(mysql_query($sql));
$sql='
INSERT INTO sys_db_tables
(create_time, list, name, sys_name, type)
VALUES
(
'.(int)time().',
'.((int)$max[0]+1).',
\''.addslashes($name).'\',
\''.addslashes($sys_name).'\',
'.$this->tableTypes[$type].'
);
';
$this->queryN($sql);
}
// smazani tabulky (systemovy nazev tabulky)
function dropTable($sys_name)
{
$this->queryN('DROP TABLE '.addslashes($sys_name));
$sql='
DELETE FROM sys_db_tables
WHERE
sys_name=\''.addslashes($sys_name).'\';
';
$this->queryN($sql);
$this->getTables();
}
// pridani sloupce do tabulky (systemovy nazev, nazev sloupce, typ)
function createColumn($table, $name, $type, $alt_name='', $reference_table_id=0, $reference_field_id=0)
{
$type=strtolower($type);
if ('reference'==$type)
{
if (FALSE==isset($this->tables[$reference_table]))
{
// die('Error: Reference table \''.$reference_table.'\' does not exist.');
}
// $reference_table_id=$this->tables[$reference_table];
}
else
{
$reference_table_id=0;
}
// pokud dany typ neexistuje, zemri
if (FALSE==isset($this->columnTypes[$type]))
{
die('Error: Unknown column type: \''.$type.'\'');
}
//ALTER TABLE `testovaci_tabulka` ADD `a` INT
//uprava nazvu sloupce (pridavej na konec specialni znak, dokud sloupec pod danym nazvem v tabulce neexistuje)
$sys_name=strtolower(sys_name($name));
if (TRUE==$alt_name)
{
$name=$alt_name;
}
// zikani sloupcu v dane tabule
$sql='
SELECT
*
FROM
'.$table.'
LIMIT 1
;
';
$query=mysql_query($sql);
$fields=array();
while ($field=mysql_fetch_field($query))
{
$fields[]=$field->name;
}
while (TRUE==in_array($sys_name, $fields))
{
return FALSE;
$sys_name.='_';
}
// konec: uprava sloupce
// pridani sloupce do tabulky
$sql='
ALTER TABLE
`'.$table.'`
ADD
`'.addslashes($sys_name).'` '.addslashes($this->columnTypes[$type]['sql_type']).'
;
';
$this->queryN($sql);
// pridani sloupce do tabulky sloupcu
$sql='
SELECT max(list) AS max
FROM sys_db_columns
';
$max=mysql_fetch_array(mysql_query($sql));
$sql='
INSERT INTO sys_db_columns
(create_time, list, table_id, name, sys_name, type, ref_table, ref_field)
VALUES
(
'.(int)time().',
'.((int)$max[0]+1).',
'.(int)$this->tables[$table].',
\''.addslashes($name).'\',
\''.addslashes($sys_name).'\',
'.(int)$this->columnTypes[$type]['id'].',
'.(int)$reference_table_id.',
'.(int)$reference_field_id.'
);
';
$this->queryN($sql);
return addslashes($sys_name);
}
// smazani sloupce (systemovy nazev sloupce)
function dropColumn($table, $sys_name)
{
$this->queryN('ALTER TABLE `'.addslashes($table).'` DROP `'.addslashes($sys_name).'`;');
$sql='
DELETE FROM sys_db_columns
WHERE
sys_name=\''.addslashes($sys_name).'\'
AND
table_id='.(int)$this->tables[$table].'
';
$this->queryN($sql);
}
// vrati maximalni hodnotu sloupce v tabulce
function max($table, $column)
{
$sql='
SELECT max('.addslashes($column).') AS max
FROM '.addslashes($table).';
';
$data=mysql_fetch_array(mysql_query($sql));
return $data['max'];
}
// provede insert (systemovy nazev tabulky, pole dat)
function insert($table_sys_name, $data)
{
$keys=array_keys($data);
$fields_string='create_time, list';
$values_string=time().', '.($this->max($table_sys_name, 'list')+1);
$separator=', ';
for ($i=0; $i<count($keys); $i++)
{
$fields_string.=$separator.$keys[$i];
$values_string.=$separator.'\''.addslashes($data[$keys[$i]]).'\'';
}
$sql='
INSERT INTO
'.addslashes($table_sys_name).'
('.addslashes($fields_string).')
VALUES
('.$values_string.');
';
$this->queryN($sql);
//echo nl2br($sql).mysql_error();
}
// vrati id daneho sloupce v dane tabulce
function getColumnId($table_sys_name, $column_sys_name)
{
$sql='
SELECT
id
FROM
sys_db_columns
WHERE
table_id='.(int)$this->tables[$table_sys_name].'
AND
sys_name=\''.addslashes($column_sys_name).'\'
LIMIT 1
;
';
$query=mysql_query($sql);
$this->checkMysqlError($sql);
if (FALSE==($data=mysql_fetch_array($query)))
{
die('Error: Column '.$table_sys_name.'.'.$column_sys_name.' does not exist.');
}
else
{
return $data['id'];
}
}
// provede select
function select($fields, $from, $where='', $limit='', $order='', $suffix='')
{
if (TRUE==$where)
{
$where='WHERE
'.$where.'
';
}
if (TRUE==$order)
{
$order='ORDER BY '.$order.'
';
}
if (TRUE==$limit)
{
$limit='LIMIT '.$limit;
}
$sql='
SELECT
'.$fields.'
FROM
'.$from.'
'.$where.'
'.$order.'
'.$limit.'
'.$suffix.'
;
';
$data=$this->query($sql);
if ('LIMIT 1'==$limit)
{
return $data[0];
}
else
{
return $data;
}
}
} //end: class Db
?>
ACC SHELL 2018