2014-09-30 119 views
0

我想在php中使用PDO進行mysql連接。我需要有PDO連接對象,它必須在多個文件中可用。數據庫連接也必須是一個類。在這裏找到許多答案並不令人滿意。請解釋實現它的正確方法。如何訪問跨多個類的PDO連接對象?[php + mysql]

我遵循目前的方法是: 文件名:connectClass.php

<?php 
ini_set('display_errors',1); 
ini_set('display_startup_errors',1); 
error_reporting(-1); 
class connect 
{ 
    public $db; 
    public $isConnected; 
    public function __construct() 
    { 
     $this->isConnected = true; 
     try { 
      $this->db=new PDO('mysql:host=localhost;dbname=dbname','root','rootpass'); 
      $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
      $this->db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 
     } 
     catch(PDOException $e) { 
      $this->isConnected = false; 
      throw new Exception($e->getMessage()); 
     } 
    } 
} 
$obj=new connect(); 
?> 

的連接對象是在文件名 訪問:addContentClass.php

<?php 
include_once 'class/connectClass.php'; 
class addContent extends connect 
{ 
    public function insertContent($title, $content, $page_title, $meta_tags) { 
     try { 
      $qry = $this->db->prepare("INSERT INTO tblPageContents (PageName, PageTitle, PageMeta, PageKeyWords, PageContents, PageFooter, PageShortName) VALUES (?, ?, ?, ?, ?, ?, ?)"); 
      $data = array($title, $content, $page_title, $meta_tags); 
      $qry->execute($data); 
      echo "<div id=\"dialog-ci\" title=\"Content updation success\" style=\"color:green\">Content insertion success</div>"; 
     } 
     catch(PDOException $e) 
     { 
      echo 'Query failed'.$e->getMessage(); 
     } 
    } 
} 
?> 

與此代碼的問題是我需要使用延伸每次。

+2

U總是可以使用單例方法。這樣,你可以從任何地方訪問對象,請注意這不是最合適的方法。依賴注射是更好的... – DarkBee 2014-09-30 11:27:17

+0

@DarkBee感謝您的快速響應。你能否提供兩個文件的例子。 – 2014-09-30 11:29:06

+0

在另一個類的構造函數中給出你的連接變量(實例)。 – Daan 2014-09-30 11:31:14

回答

0

單例的形式給出可以這樣

<?php 
class Connect { 
    public $db; 
    public $isConnected; 
    public static $instance = null; 

    public static function getInstance() { 
     if (self::$instance == null) self::$instance = new static(); 
     return self::$instance; 
    } 

    private function __construct() { 
     $this->isConnected = true; 
     try { 
      $this->db = new PDO('mysql:host=localhost;dbname=dbname','root','rootpass'); 
      $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
      $this->db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 
     }catch(PDOException $e) { 
      $this->isConnected = false; 
      throw new Exception($e->getMessage()); 
     } 
    } 
} 

class AddContent { 
    public function insertContent($title, $content, $page_title, $meta_tags) { 
     try { 
      $qry = Connect::getInstance()->db->prepare("INSERT INTO tblPageContents (PageName, PageTitle, PageMeta, PageKeyWords, PageContents, PageFooter, PageShortName) VALUES (?, ?, ?, ?, ?, ?, ?)"); 
      $data = array($title, $content, $page_title, $meta_tags); 
      $qry->execute($data); 
      echo "<div id=\"dialog-ci\" title=\"Content updation success\" style=\"color:green\">Content insertion success</div>"; 
     } 
     catch(PDOException $e) 
     { 
      echo 'Query failed'.$e->getMessage(); 
     } 
    } 
} 

達到千萬注意,這是不是最好的形式給出,因爲它不是通過其他情況下一個transmutable解決方案。更好的辦法是使用depency注入和connect類的實例傳遞給你的其他類

interface DatabaseImplementation { 
    public function connect(); 
    public function execute(); 
    public function bar(); 
} 

class Connect implements DatabaseImplementation { 
    public function connect() { 
     // Logic A... 
     // ex. Connect to mysql with PDO 
    } 
    public function execute() { 
     // logic A... 
    } 
    public function bar() {  
     return 'bar'; 
    } 
} 

class AlternativeConnect implements DatabaseImplementation { 
    public function connect() { 
     // Logic B... 
     // ex. Connect to mongoDB 
    } 
    public function execute() { 
     // logic B... 
    } 
    public function bar() {  
     return 'foo'; 
    } 
} 

class Controller { 
    public function __construct() { 
     $database_pdo = new Connect(); 
     $database_json = new AlternativeConnect(); 

     $pdo_content = new AddContent($database_pdo); 
     $json_content = new AddContent($database_json); 
    } 
} 

class AddContent { 
    private $db; 

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

使用DI的優點是thatthe類並不需要知道哪個實現是用來存儲它的數據,無論是與PDO或使用MongoDB。它只需要知道它可以使用哪些功能(例如連接/執行/ ...)

+0

看這個'self :: $ static = new static();返回self :: $ instance' – 2014-09-30 11:45:42

+0

我對依賴注入非常困惑。不知道如何在PDO類中實現它。如果可能的話,你也可以提供一個DI的例子。 – 2014-09-30 11:46:25

+0

這是DI:'public function __construct(PDO $ db)' - 當您將依賴的類(PDO)插入類中時。 – DanFromGermany 2014-09-30 16:39:10