Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Класс для работы с несколькими mysql


Автор: Zmiuko 31.5.2010, 14:19
Вопрос такой.

Работаю с mysql базой. Написал собственный класс. 
Код

    class Sql {
          
            var $conn; 
            var $host;
            var $user;
            var $pass;
            var $db;
            var $code;
            var $result;
            var $lastid;

            // Constructor
            function Sql($host, $user, $pass, $db, $code='utf8') {
    
                    $this->host=$host;
                    $this->user=$user;
                    $this->pass=$pass;
                    $this->db=$db;
                    $this->conn = @mysql_connect($this->host, $this->user, $this->pass);
                    @mysql_select_db($this->db, $this->conn);
                    mysql_query("SET NAMES '".$code."'");
    
                } 

            // Perform query
            function query($query) {
    
                    if(!$this->result = @mysql_query($query, $this->conn)) {
                            return false;
                        } else { return true; }
                }

            // Perform count_
            function count_($result) {
                    return @mysql_result($this->result, 0);
                }

            // Count rows
            function count_rows($result) {
                    return @mysql_num_rows($this->result);
                }

            // Fetch row
            function fetch_row() {
                    return @mysql_fetch_array($this->result, MYSQL_ASSOC);
                }
    
            // Get the id for the last inserted row
            function get_id() {
                    $this->lastid = @mysql_insert_id($this->conn);
                    return  $this->lastid;
                }

            function dbarray($result) {
                    return @mysql_fetch_assoc($this->result);
                }
                
            function disconnect($result) {
                    return @mysql_close($this->result);
                }

            //End of the class
        }


Проблема в следующем.

1 скрипт
$_a = new Sql('localhost', 'root', '',  'table1', 'utf8');
много-много циклов - работает идеально

2 скрипт
$_w = new Sql('localhost', 'root', '',  'table2', 'cp1251');
много-много циклов - работает идеально

НО!

Работаю к примеру с $_a, произвожу выборку из таблицы. Затем мне необходимо сверить данные из нее с данными в таблице table2.

и тут выходит, что в одном скрипте 

$_a = new Sql('localhost', 'root', '',  'table1', 'utf8');
$_w = new Sql('localhost', 'root', '',  'table2', 'cp1251');

не работает...

В чем тут может быть дело?

Автор: Zmiuko 31.5.2010, 14:39
Имею ввиду что начиная работу с $_a = new Sql('localhost', 'root', '',  'table1', 'utf8'); - все ок.

Внутри скрипта делаю $_w = new Sql('localhost', 'root', '',  'table2', 'cp1251'); чтобы к примеру вывести потом выборку из $_w по $row из $_a , то скрипт даже $_a не показывает. Не могу понять отчего класс себя так ведет.

Добавлено через 8 минут и 48 секунд
Изменил скрипт:
Код

    class Sql {
          
            private $conn; 
            private $host;
            private $user;
            private $pass;
            private $db;
            private $code;
            private $result;
            private $lastid;

            // Constructor
            public function __construct ($host, $user, $pass, $db, $code='utf8') {
    
                    $this->host=$host;
                    $this->user=$user;
                    $this->pass=$pass;
                    $this->db=$db;
                    $this->conn = @mysql_connect($this->host, $this->user, $this->pass);
                    @mysql_select_db($this->db, $this->conn);
                    mysql_query("SET NAMES '".$code."'");
    
                } 

            // Perform query
            public function query($query) {
    
                    if(!$this->result = @mysql_query($query, $this->conn)) {
                            return false;
                        } else { return true; }
                }

            // Perform count_
            public function count_($result) {
                    return @mysql_result($this->result, 0);
                }

            // Count rows
            public function count_rows($result) {
                    return @mysql_num_rows($this->result);
                }

            // Fetch row
            public function fetch_row() {
                    return @mysql_fetch_array($this->result, MYSQL_ASSOC);
                }
    
            // Get the id for the last inserted row
            public function get_id() {
                    $this->lastid = @mysql_insert_id($this->conn);
                    return  $this->lastid;
                }

            public function dbarray($result) {
                    return @mysql_fetch_assoc($this->result);
                }
                
            public function disconnect($result) {
                    return @mysql_close($this->result);
                }

            //End of the class
        }



Один фиг, второй экземпляр класса "гасится"...

Автор: нуп 31.5.2010, 15:14
А зачем столько объектов вызывать? Сделай 1 глобальный, и думаю твоя проблема решиться  smile 

Автор: Zmiuko 31.5.2010, 15:16
Кода больно много. Пытаюсь засунуть несколько подключений по экземплярам данного класса. Хз... не панацея... просто как мне быть?

Добавлено через 2 минуты и 41 секунду
Ну даже допустим $_a - глобальный объект

делаем $_w = $_a->sql('localhost', 'root', '', 'table2', 'cp1251');

и опять нифига не работает.

Добавлено через 5 минут и 33 секунды
Вопрос даже немного по-другому звучит. Куда теряется второй экземпляр, да еще съедает первый...? Процедурно решать проблему не хотелось бы.

Автор: patap 31.5.2010, 15:37
ну как я понял у тебя тут проблема в том, что когда ты создаешь второй объект $_w, то соединение с БД в объекте $_a пропадает, ну точнее не пропадает, а заменяется на соединением которое использует объект $_w. 

на стадии разработки, стоит избегать подавление ворнингов и т.д @


сделай такой тест

Код

.....
public function query($query) {  // поменяй код этого метода
  $this->result = mysql_query($query, $this->conn) or die(mysql_error());                            
}
.......

$_a = new Sql('localhost', 'root', '',  'db1', 'utf8');
$_w = new Sql('localhost', 'root', '',  'db2', 'utf8');

                                                                 
$res1 = $_a->query("SELECT * FROM tabel_from_db_1"); //  

Автор: Zmiuko 31.5.2010, 15:41
Ну да, получается так.

Автор: Zmiuko 31.5.2010, 16:01
Выводит Table 'table2.table1' doesn't exist

Добавлено через 5 минут и 3 секунды
    $mmmmmmmm = new Sql('localhost', 'root', '', 'table1');
    $nnnnnnnnnn = new Sql('localhost', 'root', '', 'table2');
    
    $res2 = $mmmmmmmm->query("SELECT * FROM `pole123_table1` WHERE `type`='mount'");
    $res1 = $nnnnnnnnnn->query("SELECT * FROM `pole125_table2` where entry='11729' "); // 


Table 'table2.table1' doesn't exist 

Автор: Zmiuko 31.5.2010, 16:25
Не могу никак понять в чем дело... первый указанный класс верен. Отчего не второй экземпляр цепляет первый, понять не могу.

Автор: Zmiuko 31.5.2010, 16:48
Прошу помощи в написании класса, чтобы в двух и более объектах шли разные подключения к разным базам. ((

Автор: gcc 31.5.2010, 16:54
отсоединится с одной, а потом подключится к другой...

Добавлено @ 16:55
тем более только 2 запроса SELECT

Автор: Zmiuko 31.5.2010, 16:58
Но если тоже самое повторить процедурно, то дисконнекта не требуется, все работает. Может я допускаю в классе какую оплошность?

Автор: patap 31.5.2010, 17:08
вот должно помочь

Код

$this->conn = mysql_connect($this->host, $this->user, $this->pass, true);



http://ua.php.net/mysql_connect - там почитай про new_link

Автор: gcc 31.5.2010, 17:09
может быть поставить в не конструктор, а в метод... конструктор загружается самый первый во всех классах... может быть проблема в этом

типо:
Код

$db = new Sql();

$con1 = $db->con('bla');


а тебе все равно нужно будет отсоединятся, почему ты не можешь отсоединится, а потом переподключится?

Автор: Zmiuko 31.5.2010, 17:12
И правда, помогло!..  smile 
 smile  smile  smile  smile  smile

Добавлено через 2 минуты и 16 секунд
resource mysql_connect ([string server [, string username [, string password [, bool new_link]]]])

bool new_link - верно все, не обращал никогда внимания, спасибо smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)