Mysql
 sql >> база данни >  >> RDS >> Mysql

PDO клас на свързване / код и дизайн на клас

Горе-долу така го правя. Не съм сигурен дали това е най-добрият начин да го направя, но работи за мен.

Моят фабричен клас е Ядрото на моя код. От тук генерирам всички класове, с които работя. Моят фабричен клас е записан в отделен файл factory.class.php .

Като имам фабричен клас, трябва само веднъж да включа файловете на класа. Ако нямах това, бих трябвало да включа моите файлове на класа за всеки файл, който трябва да го използва. Ако трябва да актуализирам името на файла на класа по-късно, трябва да направя актуализацията само във фабричния файл на класа.

Друга причина за създаване на фабричен обект беше намаляването на броя на 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;
  }  
}

Различни обекти от клас

Това са вашите класове. Това е мястото, където работите с вашите данни. В моя собствен код използвам тристепенна архитектура, разделяща презентацията от бизнес слоя и слоя на обекта с данни.

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

Направете същото и за другите си класове.

Сглобяване на всичко

Забележете, че включваме само един файл, фабричните файлове. Всички други файлове с клас са включени във фабричния файл на класа.

// 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. Изпълнявате mysql_upgrade в Docker?

  2. Как ClusterControl конфигурира виртуален IP и какво да очаквате по време на отказ

  3. Кога да използвате SQL_NO_CACHE

  4. Запитване на MySQL за координати на географска ширина и дължина, които са в рамките на даден радиус на миля

  5. Присъединяване – полетата в таблица 2 отменят тези в таблица 1