2013-08-22 4 views
2

Я пытаюсь поместить часто используемый метод (opendb) в том же классе, и файл в моем файле конфигурации подключения (connect.php) Смотрите рисунок AМетоды класса над различными файлами

class qcon{ 

public static $conn; 

    function dbcon() 
    { 


     if (empty($conn)) 
     { 
      $host = 'x'; 
      $username = 'x'; 
      $password = 'x'; 
      $dbname = 'x'; 
      $conn = mysqli_connect($host , $username , $password ,$dbname) or die("Oops! Please check SQL connection settings"); 
     } 

     return $conn; 
    } 


     function openDB($conn) 
    { 

    if (!$conn) 
    { 
     $this->error_msg = "connection error could not connect to the database:! "; 
     return false; 
    } 
    $this->conn = $conn; 
    return true; 
    } 

Теперь я хочу быть в состоянии передать вывод соединения на рисунке A, чтобы я мог правильно использовать методы в другом файле класса. Назовите его class.php. Вот одна примерная функция на class.php для просмотра записей. См. Рис. B

require_once("assets/configs/connect.php"); 

    class dbcats { 

var $conn; 

     function getResult(){ 

       $result = mysqli_query($this->conn , "SELECT * from felines"); 
       if ($result) { 
        return $result; 
       } 
       else { 
        die("SQL Retrieve Error: " . mysqli_error($this->conn)); 
       } 
      } 

      function closeDB() { 
              mysqli_close($this->conn); 
            } 

Теперь, чтобы получить звонок на работу, рис. C ниже, где я нахожусь. Я немного застрял.

$db1 = new qcon(); 
$helper = new dbcats(); 
$db1->openDB(); 
$helper = $db1; 
$result = $helper->getResult(); 

Итак, вот мы и находимся. Логика достаточно проста (я обновлю вопрос, если я не совсем понятен). Так кто-нибудь посоветует, какие поправки мне нужно, чтобы вызвать звонок?

+0

Вы пытаетесь сделать '$ conn' из' qcon-> openDB ($ conn) 'доступным для области звонящего? – Cypher

+0

Только некоторые подсказки: используйте интерфейс объекта mysqli, это избавит вас от некоторых строк и слов кода. И установите режим ошибок mysqli для исключения исключений, тогда вам не нужно писать столько кода обработки ошибок. - По твоему вопросу я должен признать, что не понял, что ты имеешь в виду. – hakre

+0

@cypher Да, я хочу, чтобы переменная соединения ($ conn) была доступна для области другого класса (class.php), поэтому я могу использовать методы. –

ответ

2

решения Orangepill является тонким и более чем вероятно получить вы собираетесь быстро. Однако я бы рекомендовал внести некоторые незначительные изменения в ваши классы, чтобы вы могли более легко использовать их функциональные возможности в своих программах.

Здесь qcon содержит информацию и функциональные возможности подключения к базе данных. Он имеет метод getter, getConn(), который позволяет вам получить и передать это соединение по мере необходимости.

class qcon 
{ 
    protected $conn; 

    public function __construct() { ... } 
    public function dbcon()  { ... } 
    public function openDB()  { ... } 
    public function closeDB()  { ... } 

    public function getConn() { return $this->conn; } 
} 

Вот пример альтернативного dbcats класса. Он занимает в вашем классе qcon часть его конструкции и удерживает его как защищенную переменную-член, которую он может использовать, когда ему это нужно. Он также имеет приемники и сеттеры, чтобы вы могли в любое время изменить или восстановить соединение с базой данных для этого класса через getQConn() и setQConn().

class dbcats 
{ 
    protected $qcon; 

    public function __construct(qcon $q) { $this->qcon = $q; } 
    public function getResult()   { ... } 
    public function getQConn()   { return $this->qcon; } 
    public function setQCon(qcon $q)  { $this->qcon = $q; } 
} 

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

0

Из того, что я вижу, вам не хватает конечной фигурной скобки} на обоих ваших классах. Все было бы намного проще, если бы вы правильно отпечатали. То есть, каждый раз, когда у вас есть левая фигурная скобка (следующие строки будут отступы с одной вкладкой. Например:

class qcon { 

    public static $conn; 

    function dbcon() 
    { 
     if (empty($conn)) 
     { 
      $host = 'x'; 
      $username = 'x'; 
      $password = 'x'; 
      $dbname = 'x'; 
      $conn = mysqli_connect($host , $username , $password ,$dbname) or die("Oops! Please check SQL connection settings"); 
     } 

     return $conn; 
    } 


    function openDB($conn) 
    { 
     if (!$conn) 
     { 
      $this->error_msg = "connection error could not connect to the database:! "; 
      return false; 
     } 
     $this->conn = $conn; 
     return true; 
    } 
} <<< Missing this one 



class dbcats { 

    var $conn; 

    function getResult(){ 
     $result = mysqli_query($this->conn , "SELECT * from felines"); 
     if ($result) { 
      return $result; 
     } 
     else { 
      die("SQL Retrieve Error: " . mysqli_error($this->conn)); 
     } 
    } 

    function closeDB() { 
     mysqli_close($this->conn); 
    } 
} <<< Missing this one 
+0

Извините, это была неправильная пачка. Керли скобки в порядке Я просто вырезал код прямо из моих классов. –

+0

Хорошо, но что здесь делает функция openDB? Он принимает параметр.Вы устанавливаете переменную экземпляра в этот параметр ($ this-> conn = $ conn), но вы никогда не вызываете эту функцию с параметром? dbconn() никогда не вызывается так, чтобы вы никогда не подключались к серверу SQL. –

0

Вам нужно ввести экземпляр класса qcon в класс dbcats.

require_once("assets/configs/connect.php"); 

class dbcats { 
    var $conn; 
    public function __construct(qcon $dbconn){ 
     $this->conn = $dbconn; 
    } 
    function getResult(){ 
      $result = mysqli_query($this->conn , "SELECT * from felines"); 
      if ($result) { 
       return $result; 
      } 
      else { 
       die("SQL Retrieve Error: " . mysqli_error($this->conn)); 
      } 
     } 

     function closeDB() { 
             mysqli_close($this->conn); 
     } 
    } 

Тогда при создании экземпляра dbcats передать экземпляр свя как ...

$db1 = new qcon(); 
$db1->openDB(); 
$helper = new dbcats($db1); 
$result = $helper->getResult(); 
+0

Дал этот снимок, но в итоге он не сработал. Попробовал настроить его. Это была либо неопределенная переменная ошибка в openDB() нормально, достаточно, так как эта функция избыточна. Используется только dbcon(), но теперь я нажимаю на объекты mysqli_query, ожидающие ошибки ... Мне может потребоваться открыть другой вопрос. –

+0

@CoolXestaog Я бы пошел с решением вроде Cypher's ... Он определяет гораздо более чистый API – Orangepill