2014-09-25 5 views
0

меня есть некоторая путаница я думаюПодключение к базе данных доступны для всех классов файлов

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

(упрощенный) У меня есть 3 файлов

подключение файлов 1.) баз данных (с использованием PDO)

2.) файла класс с все мои соответствующие функции

3.) файл, который будет главным образом файлом HTML, который включает необходимые соединения класса и базы данных и запускает необходимые экземпляры.

My (упрощенный/вырубить) файл класса

<?php 
class SPD_Products { 

    // varaibales 


    // start category variables 
    public $CategoryID; 
    public $CategoryName; 
    public $CategoryDescription; 
    public $CategoryActive; 
    public $CategoryDateAdded; 
    public $CategoryDateModified; 


    /* 
    * public function to set category varaiables 
    * @param int $categoryID 
    * @return true/false 
    */ 
    public function setCategory($CategoryID){ 
     try { 
      if(isset($CategoryID) && is_int($CategoryID)){ 
       if($result = $this->getCategoryByCategoryID($CategoryID)){ 

        $this->CategoryID = intval($result->CategoryID); 
        $this->CategoryName = htmlentities($result->CategoryName); 
        $this->CategoryDescription = htmlentities($result->CategoryDescription); 
        $this->CategoryActive = intval($result->CategoryActive); 
        $this->CategoryDateAdded = intval($result->CategoryDateAdded); 
        $this->CategoryDateModified = intval($result->CategoryDateModified); 

       } 
       else { 
        return 'No Category'; 
       }   
      } 
      else { 
       return false;  
      } 
     } 
     catch (Exception $e){  
      error_log('file = '.__FILE__.'.php class = '.get_class($this).' - function = '.__FUNCTION__.' - Exception caught: '.$e->getMessage()); 
      return false; 
     } 

    } 




    /* ================================================================ */ 
    /* ======================== SQL Queries =========================== */ 
    /* ================================================================ */ 


    /* 
    * public function to get all category details by CategoryID 
    * @param int $CategoryID 
    * @return array of results 
    */ 
    public function getCategoryByCategoryID($CategoryID) { 
     try{ 
      global $db; 

      $query = "SELECT c.CategoryID, c.CategoryName, c.CategoryDescription, c.CategoryActive, c.CategoryDateAdded, c.CategoryDateModified, c.CategoryShopAvailable 
         FROM tCategories c      
        WHERE c.CategoryID = ? 
        AND c.CategoryActive = 1 
        AND c.CategoryShopAvailable = 1"; 
      $stmt = $db->prepare($query); 
      $stmt->execute(array($CategoryID));    
      return $stmt->Fetch(PDO::FETCH_OBJ); 
     } 
     catch (PDOException $ex){ 
      error_log('file = '.__FILE__.'.php class = '.get_class($this).' - function = '.__FUNCTION__.' - Exception caught: '.$ex->getMessage()); 
      echo 'file = '.__FILE__.'.php class = '.get_class($this).' - function = '.__FUNCTION__.' - Exception caught: '.$ex->getMessage(); 
      return false;  
     } 
    } 

} 
?> 

Мой файл подключения к базе данных

// database login details 
//* Define these so that they can't be changed 
DEFINE ('DBUSER', 'xxxxx'); 
DEFINE ('DBPASS', 'xxxxx'); 
DEFINE ('DBHOST', '192.168.0.99'); 
DEFINE ('DBPORT', '3999'); 
DEFINE ('DBNAME', 'xxxxx'); 

try { 
    $db = new PDO('mysql:host='.DBHOST.'; port='.DBPORT.'; dbname='.DBNAME.'; charset=utf8', DBUSER, DBPASS);  
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 


} 
catch(PDOException $ex) { 
    echo 'An Error occured! '.$ex->getMessage(); //user friendly message  
    error_log('dbconn.php failed to connect to db - Exception caught: '.$ex->getMessage()); 
    return false; 
} 
?> 

моя тестовая страница

<?php 
require_once('functions/dbconn.php'); 
require_once('class/products.class.php'); 

//$db = new Database(); // failed test 
$products_obj = new SPD_Products(); 

$products_obj->setCategory($CategoryID = 1); 
echo $products_obj->CategoryName; 

?> 

Я пробовал различные способы получения базы данных соединение в классе, но работает только глобальный метод (который я не думаю, что это хорошая или аккуратная идея ...) , Вышеописанное работает, но я хочу лучше ... В конечном итоге у меня будет много отдельных файлов классов, поэтому не хочу создавать новое соединение в каждом файле класса, так как я уверен, что могу сделать это только один раз, не используя глобальный и без необходимости продолжать вводить его и передавать его от функции к функции.

Любой совет будет очень благодарен!

ответ

1

насчет этого, поместите ваш логин верительных в PHP файл:

<?php 
// database login details 
$config = array('DBUSER'=>'xxxxx', 
       'DBPASS'=>'xxxxx', 
       'DBHOST'=>'192.168.0.99', 
       'DBPORT'=>'3999' 
       'DBNAME'=> 'xxxxx'); 

?> 

затем превратить dbconn.php в класс, это будет сделать проще:

<?php 
class DB { 

    function __construct() { 
     //some config here 
     require_once('functions/config.php'); 
    } 

    function get_connection() { 
    try { 
    $db = new PDO('mysql:host='.$config['DBHOST'].'; port='.$config['DBPORT'].'; dbname='.$config['DBNAME'].'; charset=utf8' 
        , $config['DBUSER'], $config['DBPASS']);   
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    } 
    catch(PDOException $ex) { 
     echo 'An Error occured! '.$ex->getMessage(); //user friendly message  
     error_log('dbconn.php failed to connect to db - Exception caught: '.$ex->getMessage()); 
     return false; 
    } 

    return $db; 
    } 
} 
?> 

Пример:

<?php 
class SPD_Products { 

    require_once('functions/dbconn.php'); 
    private $conn; 
    .... 
    function __construct() { 
     $db = new DB(); 
     $this->conn = $db->get_connection(); 
    } 

    public function getCategoryByCategoryID($CategoryID) { 
     try{ 
      $query = "...."; 
      $stmt = $this->conn->prepare($query);//here 
     ....... 
     } 
     catch (PDOException $ex){ 
      ..... 
      return false;  
     } 
    } 

} 
?> 

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

+0

Спасибо! Я пробовал это, и попробовал очень похожего раньше, но я продолжаю получать эту ошибку. Неустранимая ошибка: вызвать функцию-член.() Я все-таки имею соединение с БД в $ this-> conn (я думаю) – Ford

+0

Ой, я забыл чтобы добавить $ this в конструкторе, проверьте его снова – meda

+0

хорошо заметили! работает отлично !!! БЛАГОДАРЯ! – Ford

Смежные вопросы