Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Lớp / mã kết nối PDO và thiết kế lớp

Đây ít nhiều là cách tôi làm điều đó. Tôi không chắc liệu đây có phải là cách tốt nhất hay không, nhưng nó phù hợp với tôi.

Lớp nhà máy của tôi là CỐT LÕI của mã của tôi. Từ đây tôi tạo ra tất cả các lớp tôi làm việc cùng. Lớp nhà máy của tôi được lưu trong một tệp riêng factory.class.php .

Bằng cách có một lớp nhà máy, tôi chỉ cần đưa vào các tệp lớp một lần duy nhất. Nếu tôi không có cái này, tôi sẽ phải bao gồm các tệp lớp của mình cho mỗi tệp phải sử dụng nó. Nếu tôi cần cập nhật tên tệp lớp sau này, tôi chỉ cần thực hiện cập nhật trong tệp lớp gốc.

Một lý do khác để tạo đối tượng gốc là giảm số lượng kết nối DB.

Tôi lưu mỗi lớp thành một tệp riêng biệt

Lớp nhà máy

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()); }
}    

Lớp kết nối

// 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;
  }  
}

Đối tượng lớp khác nhau

Đây là các lớp học của bạn. Đây là nơi bạn làm việc với dữ liệu của mình Trong mã của riêng tôi, tôi đang sử dụng kiến ​​trúc ba tầng, tách bản trình bày, khỏi lớp nghiệp vụ và lớp đối tượng dữ liệu.

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;      
  }
}

Làm tương tự cho các lớp khác của bạn.

Kết hợp tất cả lại với nhau

Lưu ý rằng chúng tôi chỉ bao gồm một tệp, các tệp gốc. Tất cả các tệp lớp khác đều có trong tệp lớp 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tại sao TRANSACTION / COMMIT lại cải thiện hiệu suất rất nhiều với PHP / MySQL (InnoDB)?

  2. Đặt tùy chọn mặc định trong menu thả xuống php và giữ lại khi truy vấn được gửi

  3. Thêm kết quả cơ sở dữ liệu vào mảng

  4. NULL trong MySQL (Hiệu suất &Lưu trữ)

  5. cách tạo lược đồ mysql trong nodejs