2017-02-28 40 views
0

我是新來的類和PDO。我想寫具有獨立功能的一類用於連接到數據庫和關閉,這樣的連接,在一個頁面中,我可以:檢索頁面內部的連接:PDO和PHP類

  1. 打開與$db->connOpen
  2. 連接執行所有查詢我需要的頁面
  3. 內關閉在腳本的末尾用$db->connClose

    class database 
    { 
        private $host  = ''; 
        private $db_name = ''; 
        private $charset = ''; 
        private $username = ''; 
        private $password = ''; 
    
    
        public function setHost($host) { 
         $this->host = $host; 
        } 
    
        public function setDbName($db_name) { 
         $this->db_name = $db_name; 
        } 
    
        public function setUser($username, $password) { 
         $this->username = $username; 
         $this->password = $password; 
        } 
    
    
        public function connOpen() { 
         try { 
          $dsn = "mysql:host=$this->host;dbname=$this->db_name;charset=$this->charset"; 
          $db  = new PDO($dsn, $this->username, $this->password, array(PDO::ATTR_PERSISTENT => true)); 
          $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
         } catch (PDOException $e) { 
          echo $e->getMessage(); 
         } 
        } 
    
        public function connClose() { 
         $db = null; 
        } 
    } 
    

我猜的連接問題在於更多的類語法比PDO,因爲要發出一個像下面這樣的查詢到頁面,我需要再次實例化類PDO,加倍連接到數據庫。

$stmt = $dbo->prepare('SELECT * FROM products WHERE id=:id'); 
$stmt->execute(array(':id' => $id)); 
$res = $stmt->fetchAll(PDO::FETCH_ASSOC); 

我的問題是:

  1. 如何能實現我想用一個類像上面的是什麼?
  2. 這是正確的,在這種情況下,使用持續連接

感謝

+2

這裏的問題在於,你的類本質上是無用的。不要爲了它而編寫類。寫一個只能做一些有用的課程。 –

回答

1

出於某種原因,誰願意學OOP大多數人查詢開始與實現單和錯誤處理干擾數據庫包裝。

我的技巧是,你把數據庫連接任何其他變量:

class Post { 
    function getByUserId(PDO $connection, $user_id) { 
    } 
} 

$database = new PDO(...); 
$post->getByUserId($database, 123); 

這就是所謂的依賴注入。

不要浪費時間和精力編寫代碼,以避免有用的功能,如:

  • 集中的錯誤處理
  • 能夠連接到多個數據庫

只有當你確實有真正的功能添加到PDO的頂部時,請關心編寫數據庫包裝器。我能想到的:

  • 轉換日期自動DateTime對象
  • 通過所有的查詢日誌中記錄的有趣的活動,如重複的指標違反

  • 擲自定義異常...即使這時,要非常小心,不要讓PDO變得更糟;-)

  • +1

    我遵循了將PDO連接作爲變量處理的建議,並將其從'conn()'函數返回,並且工作正常。感謝所有其他提示Álvaro! – Brigo

    1

    我用這一個singlton類給我分貝ojbect然後我使用該對象在其他類別進行查詢;

    <?php 
        class db{ 
        /*** Declare instance ***/ 
        private static $instance = NULL; 
        /** 
        * 
        * the constructor is set to private so 
        * so nobody can create a new instance using new 
        * 
        */ 
        private function __construct() { 
         /*** maybe set the db name here later ***/ 
        } 
        /** 
        * 
        * Return DB instance or create intitial connection 
        * 
        * @return object (PDO) 
        * 
        * @access public 
        * 
        */ 
        public static function getInstance() { 
         if (!self::$instance) 
         { 
          self::$instance = new \PDO("mysql:host=".databaseHost.";dbname=".databaseName."", databaseUserName,databasePassword);; 
          self::$instance-> setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); 
          self::$instance-> setAttribute(\PDO::ATTR_EMULATE_PREPARES, false); 
         } 
         return self::$instance; 
        } 
        /** 
        * 
        * Like the constructor, we make __clone private 
        * so nobody can clone the instance 
        * 
        */ 
        private function __clone(){ 
        } 
    } /*** end of class ***/ 
    ?> 
    

    課堂,我使用db對象

    <?php 
    class posts { 
    
        public function getPostOfUserId($userId,$offset=0,$limit=NULL){ 
         $helperString=" "; 
         if(!empty($limit)) 
          $helperString=" LIMIT $offset, $limit "; 
         $executor= db::getInstance()->prepare("SELECT posts.*,users.facebook_id, users.first_name as post_by FROM posts JOIN tagged_friends ON posts.id = tagged_friends.post_id JOIN users ON posts.user_id = users.id WHERE tagged_friends.user_id = :user_id ORDER BY posts.id DESC ".$helperString, array(\PDO::ATTR_CURSOR => \PDO::CURSOR_FWDONLY)); 
         $executor->execute(array(':user_id'=>$userId)); 
         $posts=$executor->fetchAll(\PDO::FETCH_ASSOC); 
         if(!empty($posts)) 
          return $posts; 
         else 
          return ; 
        } 
    } 
    
    +0

    你的課程寫得很好!但我實際上需要學習更多關於類的知識,以便充分理解它:\ – Brigo