2017-02-28 2 views
0

私はクラスとPDOを初めて使いました。私は私ができる、ページで、DBへの接続となるように、接続を閉じるための独立した機能を持つクラスを作成しようとしています:ページ内の接続の取得:PDOとPHPクラス

  1. オープン$db->connOpen
  2. との接続は、すべてのクエリを実行しますIページ内で必要
  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よりも呼び出すために、データベースへの接続を2倍にして、クラス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

を使用して照会しています

<?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 ***/ 
?> 

クラスはシングルトンを実装し、エラー処理を妨げるデータベースラッパーで始まります。

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

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

これは、依存性注入と呼ばれる:

私の先端はあなたが他の変数とデータベース接続を扱うということです。

そしてなどの便利な機能を、避けるために時間とエネルギーの書き込みコードを無駄にしてはいけない:

  • つ以上のデータベースに接続することができること
  • 取り扱い一元エラー

のみ実際にPDOの上に追加する本当の機能を備えている場合は、データベースラッパーを作成することに注意してください。ロガーへのすべてのクエリなどの重複インデックス違反などの興味深いイベント、

  • スローカスタム例外
  • 自動的DateTimeオブジェクトへのパスを日付に変換

    • ...:私は考えることができますPDOを悪化させないように非常に注意してください;-)

  • +1

    PDO接続を変数として扱い、conn()関数から返すというあなたの提案に従っていました。他のすべてのヒントÁlvaroをありがとう! – Brigo

    1

    私は私のデシベルojbectを与える1つのsingltonクラスでこれを使用していますし、私は他のクラスに照会し、そのオブジェクトを使用しています。私はOOPを学びたい何らかの理由で、ほとんどの人にとって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

    関連する問題