2015-04-15 4 views
0

Ниже приведено решение моего вопроса. У меня не было написано что-то плохое. Я случайно использовал функцию «die» внутри моего основного класса DB, из-за чего все мои запросы терпят неудачу. Я искал неправильную проблему.PHP, расширяющий мастер-класс MySQL TWICE

Надеюсь, вы, ребята, найдете этот классный пример полезным. Он чист и очень полезен для переноса вызовов SQL в одном месте для нескольких баз данных. Предоставляя расширение, вы можете легче отслеживать свои вызовы для моего имени var.

class A extends DB { 

    protected $connection; 

    function __construct() 
    { 
     $this->db_host  = "server.com:3327"; 
     $this->db_name  = "db_name_one"; 
     $this->db_username = "root"; 
     $this->db_password = 'pw'; 

     // .. equals all the setup vars 
     parent::__construct(); 
    } 

} 

class B extends DB { 

    function __construct() 
    { 
     $this->db_host  = "server.com:3327"; 
     $this->db_name  = "db_name_two"; 
     $this->db_username = "root"; 
     $this->db_password = 'pw'; 

     // .. equals all the setup vars 
     parent::__construct(); 
    } 

} 

class DB { 

    function __construct() 
    { 
     $this->connect() 
    } 
    public function connect() 
     if (!$connection = @ mysql_connect ($this->db_host,$this->db_username,$this->db_password,$this->second_flag)) 
      die ('I cannot connect to the database because: ' . mysql_error()); 

     if (!mysql_selectdb($this->db_name,$connection)) 
      $this->showerror(); 

     return $connection; 
    } 
    public function executeSQL($query) 
    { 
     $results = mysql_query($query,$this->connection); 

     if (!$results) { 
      die(...); 
     } 

     return $results; 
    } 
} 

$db1 = new A(); 
$db2 = new B(); 

$db1->executeSQL("select * from table"); 
+0

Извините, я не понимаю вашу проблему. Можете ли вы опубликовать минимальный пример, показывающий, где происходит ошибка? – user4035

+0

'mysql_connect' возвращает ресурс, который вы можете использовать во всех других функциях mysql_ *. Вот как вы можете иметь сразу несколько подключений; вам просто нужно следить за этим ресурсом. Как бы то ни было, за этим мы мало что можем сказать, потому что ваши вопросы не содержат кода и слишком абстрактны для ответа. – deceze

+0

Добавлен псевдокод. Предположим, что под-классы создают и правильно используют __construct. –

ответ

0

Я не знаю, есть ли законные основания для расширения DB класса здесь. Если только эти расширяющиеся классы не добавят к DB (например, они адаптируют его к другой базе данных), то они не имеют никакого отношения к тому, чтобы быть DB как таковой. Просто потому, что они использовать a DB не означает, что они должны extend один.

Простейший способ сделать это: создать один класс, который обрабатывает взаимодействие с базой данных. Когда вы создаете новый экземпляр этого класса, он устанавливает новое соединение с базой данных. Таким образом, вы можете иметь столько независимых подключений, сколько хотите. Затем вы просто передаете эти экземпляры тем, кто в них нуждается:

class DB { 

    protected $connection; 

    public function __construct() { 
     $this->connection = mysql_connect(..); 
     if (!$this->connection) { 
      throw new Exception(..); 
     } 
    } 

    .. 

} 


class A { 

    protected $db; 

    public function __construct(DB $db) { 
     $this->db = $db; 
    } 

    .. 

} 


$db = new DB; 
$a = new A($db); 
+0

Спасибо. Я должен был немного разобраться. Я использую класс-помощник для выполнения специальных вызовов sql. Я переношу каждый тип вызова. Это позволяет мне быстро менять mysql_ с помощью mysqli_ и любых других методов подключения, которые отображаются. Я также обрабатываю всю мою отладку в центральном классе. Это просто устраняет необходимость дублировать все. Я попробую несколько вещей и отчитаюсь. –

+0

Правильно, вот для чего должен быть ваш класс «DB». Он абстрагирует вызовы 'mysql_', вы можете поменять их на все, что вам нравится. В идеале вы должны использовать «интерфейс» или абстрактный класс, чтобы определять все возможные вызовы базы данных, которые вы хотите создать из своего приложения, а затем реализовать это в конкретном классе для 'mysql_' или всего, что вам нравится. – deceze

+0

Я нашел свою проблему. Я исправил классы выше с моим оригинальным вопросом, который не имел никакого отношения к моей проблеме. –