2016-12-15 3 views
1

これはPDO永続的な接続を介してMySQLを接続するために、私のデータベースクラスである:永続的なPDO接続が各要求に対して新しい接続を行うのはなぜですか?

class database{ 
    private $_db; 
    public function conn() 
    { 
     $user = 'xxx'; 
     $pass = 'xxxxxxx'; 
     try 
     { 
      $this->_db = new PDO('mysql:dbname=x;host=x.x.x.x',$user,$pass,array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',PDO::ATTR_PERSISTENT => true)); 
      $this->_db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
      $this->_db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 
      return $this->_db; 
     } 

     catch(PDOException $e) 
     { 
      return "-1"; 
     } 
    } 

} 

私は、データベースを照会するために別の関数で、このクラスを呼び出します。関数を呼び出すたびに、新しい接続がデータベースに作成されます。永続的なpdo接続が要求ごとに新しい接続を行う理由

+2

$ db = new database(); $ db-> conn();新しいオブジェクトを作成し、毎回新しい接続を定義します – MacBooc

+0

'conn()'メソッドは、新しい '$ _db'を作成する前にプライベート' $ _db'がnullかどうかをチェックしませんデータベースへの接続。 – WillardSolutions

答えて

0

私はプロジェクトの始めに定義している静的クラスを使用していますが、これは唯一悪い点は複数のデータベースを作成できないことです。

<?php 

/** 
* 
************************************************ 
*     PlainFramework    * 
************************************************ 
* 
* Created by Niels Hamelink 
* File: class.database.php 
* Created at: 14-11-2016 02:08 
**/ 
class Database 
{ 
    private static $_db; 

    public static function connect($dsn, $username, $password, $debug) 
    { 
     try 
     { 
      $_db = new PDO($dsn, $username, $password); 
     } catch(PDOException $e) 
     { 
      if($debug) 
       Application::throw_error($e->getMessage()); 
     } 
    } 

    public static function close() 
    { 
     $_db = null; 
    } 

    public static function isConnected() 
    { 
     return isset($_db) 
      && $_db != null; 
    } 

    public static function getPDO() 
    { 
     if(!isset($_db)) 
      $_db = null; 

     return $_db; 
    } 

    public static function executeQuery(Query $query) 
    { 
     try 
     { 
      return Database::getPDO()->query($query->toString()); 
     } catch(PDOException $ex) 
     { 
      Application::throw_error($ex->getMessage()); 
     } 
    } 

} 
+0

なぜ、executeQuery()はクエリの代わりにprepare/executeを使用しないのですか? –

+0

また、私は不思議です、そのクエリクラスは何ですか? –

+0

@YourCommonSense PDOクエリー機能では不可能な名前付きパラメーターを使用しています。 QueryクラスはカスタムのQuery Builder(文字列ビルダー)なので、クエリを書く必要はありません。 – DevNiels

1

再接続する前に接続が確立されているかどうかを確認する必要があります。

class database{ 
    private $_db; 

    private function isConnected() 
    { 
     return ($this->_db) ? TRUE : FALSE; 
    } 

    public function conn() 
    { 

     if ($this->isConnected()) 
     { 
      return $this->_db; 
     } else { 

      $user = 'xxx'; 
      $pass = 'xxxxxxx'; 
      try 
      { 
       $this->_db = new PDO('mysql:dbname=x;host=x.x.x.x',$user,$pass,array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',PDO::ATTR_PERSISTENT => true)); 
       $this->_db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
       $this->_db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 
       return $this->_db; 
      } 

      catch(PDOException $e) 
      { 
       return "-1"; 
      } 
     } 
    } 

} 

そうでない場合は、このコードは、それが存在する場合、既存の接続を返すか、新しいものになる - これは、あなたがconn()メソッド内で呼び出すクラスへの迅速なメソッドを追加することによって達成することができます。

関連する問題