ACC SHELL

Path : /srv/www/vhosts/profias/inc/
File Upload :
Current File : /srv/www/vhosts/profias/inc/db.php

<?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