Класс коннекта к БД

153
15 декабря 2016, 15:42

Есть такой вот класс коннекта к базе и выполнения запросов. Проблема в том, что при создании второго объекта класса для 2-го соединения с другой БД, возникает конфликт, каким-то образом один коннект перебивается другим.

$db=new DBMysql(); 
$db_second=new DBMysql(); // перебивает коннект  $db

У кого какие предположения? Сам класс:

<?
class DBMysql{
        var $connected;
        // версия файла
        public $version = array(
        '0'=>'2',
        '1'=>'0',
        '2'=>'1'
        );
        function DBMysql(){
                global $mysql_host, $mysql_port, $mysql_user, $mysql_password, $mysql_database;
                $mysql_port = ($mysql_port) ? ":$mysql_port" : '';
                $this->connected=FALSE;
                if(mysql_connect("$mysql_host$mysql_port",$mysql_user,$mysql_password)){
                        if(mysql_select_db($mysql_database)){
        @mysql_query("SET NAMES 'UTF8'");
        //@mysql_query("SET CHARACTER SET 'UTF8'");
                                $connected=TRUE;
                        }
                } else { echo mysql_error();}
        }
        function Close(){
                mysql_close();
        }
        function Query($query, $cache='cache'){
                // запрашиваем закэшированные данные
                if ( ($res=file_cache::read( 'query', 'mysql', md5($query) )) && $cache!='no_cache')
                    return $res;
                $res=mysql_query($query);
                if(!$res){
                        $this->ReportError($query);
                }
                if ($cache!='no_cache')
                    // заносим данные в кэш
                    file_cache::add( 'query', 'mysql', md5($query), $res );
                return $res;
        }
        function QueryRow($query, $cache='cache'){
                // запрашиваем закэшированные данные
                if ( ($res=file_cache::read( 'query_row', 'mysql', md5($query) )) && $cache!='no_cache')
                    return $res;
                $res=$this->Query($query);
                $rec=$this->Fetch($res);
                if ($cache!='no_cache')
                    // заносим данные в кэш
                    file_cache::add( 'query_row', 'mysql', md5($query), $rec );
                return $rec;
        }
        function Run($query, $cache='cache'){
                if(!$res=mysql_query($query)){
                        $this->ReportError($query);
                };
                if ($cache!='no_cache')
                    // удаляем закэшированные данные
                    file_cache::delete(NULL, 'mysql');
                return $res;
        }
        function Fetch($res){
                $rec=@mysql_fetch_array($res);
                return $rec;
        }
        function RetID(){
                $rec=@mysql_insert_id();
                return $rec;
        }
        function ReportError($query){
                        echo "Error '".mysql_error()."'in '$query'";
                die();
        }
    // генерирует запрос добавления
    function InsertRow($table, $data, $cache='cache'){
        if (!$table)
            return array ('result'=>FALSE, 'message'=>'Ошибка изменения поля в БД. Не передано название таблицы! Обратитесь к разработчикам.');
        if ( !is_array($data) )
            return array ('result'=>FALSE, 'message'=>'Ошибка добавления в таблицу "'.$table.'".Нет данных или тип переданных данных не соответствует. Обратитесь к разработчикам.');
        $script='INSERT INTO `'.TextToDB($table).'` ';
        $variables='(';
        $values='(';
        foreach ($data as $key=>$value) {
            if ($flag) {
                $variables.=',';
                $values.=',';
            }
            $variables.='`'.$key.'`';
            $values.='\''.TextToDB($value).'\'';
            $flag=TRUE;
        }
        $script.=$variables.') VALUES '.$values.')';
        //var_dump($script);
        if ( $res=$this->Run($script) ) {
            if ($cache!='no_cache')
                // удаляем закэшированные данные
                file_cache::delete(NULL, 'mysql');
            return TRUE;
        } else
            return array ('result'=>FALSE, 'message'=>'Ошибка добавлении строки в БД. Обратитесь к разработчикам.');    
        }
    // обновление указанного поля в указанной таблице
    function UpdateField($table, $field, $value, $id=NULL, $id_field='ID', $cache='cache', $big_id=false){
        if (!$table)
            return array ('result'=>FALSE, 'message'=>'Ошибка изменения поля в БД. Не передано название таблицы! Обратитесь к разработчикам.');
        if (!$field)
            return array ('result'=>FALSE, 'message'=>'Ошибка изменения поля в БД. Не передано название столбца! Обратитесь к разработчикам.');
        $script='UPDATE `'.TextToDB($table).'` SET `'.TextToDB($field).'`=\''.TextToDB($value).'\'';
        if ($big_id==true)
            $script.=(!$id) ? '' : ' WHERE `'.TextToDB($id_field).'`=\''.$id.'\'';
        else
            $script.=(!$id) ? '' : ' WHERE `'.TextToDB($id_field).'`='.(int)$id;
//      var_dump($script);
        if ( $res=$this->Run($script) ) {
            if ($cache!='no_cache')
                // удаляем закэшированные данные
                file_cache::delete(NULL, 'mysql');
            return TRUE;
        } else
            return array ('result'=>FALSE, 'message'=>'Ошибка изменения поля в БД. Обратитесь к разработчикам.');
        }
    // обновление указанного поля в указанной таблице
    function UpdateDate($table, $field, $value, $id=NULL, $id_field='ID', $cache='cache'){
        if (!$table)
            return array ('result'=>FALSE, 'message'=>'Ошибка изменения поля в БД. Не передано название таблицы! Обратитесь к разработчикам.');
        if (!$field)
            return array ('result'=>FALSE, 'message'=>'Ошибка изменения поля в БД. Не передано название столбца! Обратитесь к разработчикам.');
        $script='UPDATE `'.TextToDB($table).'` SET `'.TextToDB($field).'`='.TextToDB($value).'';
        $script.=(!$id) ? '' : ' WHERE `'.TextToDB($id_field).'`='.(int)$id;
        //var_dump($script);
        if ( $res=$this->Run($script) ) {
            if ($cache!='no_cache')
                // удаляем закэшированные данные
                file_cache::delete(NULL, 'mysql');
            return TRUE;
        } else
            return array ('result'=>FALSE, 'message'=>'Ошибка изменения поля в БД. Обратитесь к разработчикам.');
        }
    // удаление указанной строки в указанной таблице
    function DeleteRow($table, $id=NULL, $id_field='ID', $cache='cache'){
        if (!$table)
            return array ('result'=>FALSE, 'message'=>'Ошибка удаления строки в БД. Не передано название таблицы! Обратитесь к разработчикам.');
        if ( is_array($res = $this->check_lock($table, 'lock', $id, 'ID')) ) {
            return $res;
        }
        $script='DELETE FROM `'.TextToDB($table).'`';
        $script.=(!$id) ? '' : ' WHERE `'.TextToDB($id_field).'`='.(int)$id;
        if ( $res=$this->Run($script) ) {
            if ($cache!='no_cache')
                // удаляем закэшированные данные
                file_cache::delete(NULL, 'mysql');
            return TRUE;
        } else
            return array ('result'=>FALSE, 'message'=>'Ошибка удаления поля в БД. Обратитесь к разработчикам.');
        }
    // чтение списка в массив
    function QueryFetch($script){
        $res=$this->Query($script);
        while ($data=$this->Fetch($res))
            $return[]=$data;
        return $return;
        }
    // чтение списка в список
    function QueryFetchList($script){
        $res=$this->Query($script);
        while ($data=$this->Fetch($res))
            $return[$data[0]]=$data[0];
        return $return;
        }
        // проверка существования колонки в указанной таблице
    function check_col($col, $table){
        if ($res=$this->QueryRow('show columns from `'.$table.'` like \''.$col.'\''))       
            return TRUE;
        else
            return FALSE;
        }
    // выборка данных из нужного поля таблицы
    function get_field($table_name, $col_name, $row_id, $id_field='ID', $type_id="string") {
        // Прведение типов и эскейпирование переменных
        $table_name = TextToDB($table_name);
        $col_name = TextToDB($col_name);
        $row_id = TextToDB($row_id);
        if ($id_field!='ID')
            $id_field = TextToDB($id_field);
        if ($type_id=='string')
              $row_id = '\''.$row_id.'\'';
        // Скрипт выборки данных из конкретной ячейки
        $script = 'SELECT `'.$col_name.'` FROM `'.$table_name.'` WHERE `'.$id_field.'`='.$row_id ;
        if ($return=$this->QueryRow($script))       
            return $return[$col_name];
        else
            return FALSE;
    }
    // выборка данных из нужной строки таблицы
    function get_row($table_name, $cols_name, $row_id, $id_field='ID', $type_id='integer') {
        // Прведение типов и эскейпирование переменных
        $table_name = TextToDB($table_name);
        $cols_name = TextToDB($cols_name);
        $row_id = TextToDB($row_id);
        $type_id = TextToDB($type_id);
        if ($id_field!='ID')
            $id_field = TextToDB($id_field);
        if ($cols_name == '*') {
            $cols = '*';
        } else {
            $cols_name = explode(',', $cols_name);
            $cols = '';
            foreach($cols_name as $name)
                $cols .= '`'.trim($name).'`,';
            $cols = substr($cols, 0, -1);
        }
        if ($type_id=='string')
              $row_id = '\''.$row_id.'\'';
        // Скрипт выборки данных из конкретной строки
        $script = 'SELECT '.$cols.' FROM `'.$table_name.'` WHERE `'.$id_field.'`='.$row_id ;
        if ($return=$this->QueryRow($script))       
            return $return;
        else
            return FALSE;
    }
    function check_lock($table, $field, $id, $id_field='ID') {
        if ($this->check_col($field, $table)) {
            if($res = $this->get_field($table, $field, $id, $id_field)) {
                if($res[$field]==1) {
                    return array ('result'=>FALSE, 'message'=>'Невозможно удалить эту запись. Она заблокированна для удаления.');
                } else {
                    return TRUE;
                } 
            } else {
                return $res;
            }
        }
    }
}
$db=new DBMysql();
$db_second=new DBMysql(); // перебивает коннект  $db
?>
Answer 1

Да, перебивает, потому что вы устанавливаете соединение и не присваиваете его никакой переменной, а функции mysql_select_db, mysql_query используют текущее подключение, если другое не передано в качестве аргумента.

Вот очень краткий пример, который только суть передает:

Class DB {
  private $link;
  public function __construct($host, $port, $user, $pass, $db) {
     $this->link = mysql_connect($host.':'.$port, $user, $pass, true);
     mysql_select_db($db, $this->link);
  }
  function __desctruct() {
     mysql_close($this->link);
  }
  public function Query($query) {
     mysql_query($query, $this->link);
  }
}
$db1 = new DB($mysql_host, $mysql_port, $mysql_user, $mysql_pass, $mysql_dbname);
$db2 = new DB($mysql_host, $mysql_port, $mysql_user, $mysql_pass, $mysql_dbname);
READ ALSO
Выбрать все теги для новости

Выбрать все теги для новости

Есть таблица с новостями и есть таблица с тегами, которая имеет Id новости и имя тегаКак мне выбрать новость и ее теги одним запросом, отдельно...

116
Node-Webkit о железе

Node-Webkit о железе

ЗдравствуйтеПодскажите, пожалуйста, как можно средствами node-webkit узнать такие параметры, как название ноутбука (acer, asus, lenovo etc и т

229
Вызов события onmouseover

Вызов события onmouseover

У меня есть событие, при котором, когда наводишь курсор на изображение, оно меняется поочередно на другие (указан путь к папке, где эти изображения)Помогите,...

260