sql >> データベース >  >> RDS >> Mysql

PDO接続クラス/コードおよびクラス設計

    これは多かれ少なかれ私がそれをする方法です。これが最善の方法かどうかはわかりませんが、私にとってはうまくいきます。

    私のファクトリクラスは私のコードのコアです。ここから、使用するすべてのクラスを生成します。私のファクトリクラスは別のファイルfactory.class.phpに保存されています 。

    ファクトリクラスを持つことで、クラスファイルを1回だけ含める必要があります。これがなかった場合は、それを使用する必要のあるファイルごとにクラスファイルを含める必要があります。後でクラスファイル名を更新する必要がある場合は、ファクトリクラスファイルで更新するだけで済みます。

    ファクトリオブジェクトを作成するもう1つの理由は、DB接続の数を減らすことでした。

    各クラスを個別のファイルとして保存します

    ファクトリクラス

    include_once('person.class.php');
    include_once('tracking.class.php');
    include_once('costAnalyzis.class.php');
    include_once('activity.class.php');
    
    class Factory {
      function new_person_obj($id = NULL) { return new Person(Conn::get_conn(), $id); }  
      function new_tracking_obj($id = NULL) { return new Tracking(Conn::get_conn(), $id); }
      function new_costAnalyzis_obj() { return new CostAnalyzis(Conn::get_conn()); }
      function new_activity_obj() { return new Activity(Conn::get_conn()); }
    }    
    

    接続クラス

    // I have this class in the same file as Factory class
    // This creates DB connection and returns any error messages
    class Conn {
      private static $conn = NULL;
    
      private function __construct() {}
    
      private static function init() {
          $conf = self::config();
          try { 
            self::$conn = new PDO($conf['dsn'], $conf['user'], $conf['pass'], array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
          } 
          catch (PDOException $e) {
            // We remove the username if we get [1045] Access denied
            if (preg_match("/\b1045\b/i", $e->getMessage())) 
              echo "SQLSTATE[28000] [1045] Access denied for user 'name removed' @ 'localhost' (using password: YES)";
            else
              echo $e->getMessage();  
          }
      }
    
      public static function get_conn() {
        if (!self::$conn) { self::init(); }
        return self::$conn;
      }
    
      // I used to get login info from config file. Now I use Wordpress constants
      private static function config() {
        $conf = array();
    
        $conf['user']    = DB_USER; //$config['db_user'];
        $conf['pass']    = DB_PASSWORD; //$config['db_password'];
        $conf['dsn']     = 'mysql:dbname='.DB_NAME.';host='.DB_HOST;
    
        return $conf;
      }  
    }
    

    さまざまなクラスオブジェクト

    これらはあなたのクラスです。ここでデータを操作します。私自身のコードでは、プレゼンテーションをビジネスレイヤーとデータオブジェクトレイヤーから分離する3層アーキテクチャを使用しています。

    class Person extends PersonDAO {
    
      function getPersonData($id) {
        $result = parent::getPersonData($id);
    
        // Here you can work with your data. If you do not need to handle data, just return result
        return $result;
      }
    }
    
    
    // I only have SQL queries in this class and I only return RAW results.
    class PersonDAO {
    
      // This variable is also available from you mother class Person 
      private $db;
    
        // Constructor. It is automatically fired when calling the function.
        // It must have the same name as the class - unless you define 
        // the constructor in your mother class.
        // The &$db variable is the connection passed from the Factory class.
        function PersonDAO (&$db) {
          $this->db = &$db;
        }
    
    
      public function get_data($id) {
         $sql ="SELECT a, b, c
              FROM my_table
              WHERE id = :id";
    
         $stmt = $this->db->prepare($sql);
         $stmt->execute(array(':id'=> $id));
         $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
    
         return $result;
      }
    
      public function get_some_other_data() {
        $sql ="SELECT a, b, c
              FROM my_table_b";
    
        $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
    
        return $result;      
      }
    }
    

    他のクラスについても同じようにします。

    すべてをまとめる

    ファクトリファイルという1つのファイルのみが含まれていることに注意してください。他のすべてのクラスファイルは、Factoryクラスファイルに含まれています。

    // Include factory file
    include_once('factory.class.php');
    
    //Create your factory object
    $person = Factory::new_person_obj();
    
    //Get person data
    $data = $person->getPersonData('12');
    
    // output data
    print_r($data);
    


    1. MySQL:相互に関連付けられている2つのテーブルから最新のメッセージを取得します

    2. Workbenchを使用してSSHトンネル経由でリモートMySQLサーバーに接続する

    3. テーブル内のクエリデータに関する問題

    4. SQLServerのデータベース内のすべてのテーブルのAddColumnステートメントを生成する方法-SQLServer/T-SQLチュートリアルパート49