sql >> Database teknologi >  >> RDS >> Mysql

PDO forbindelsesklasse / kode og klassedesign

Det er mere eller mindre sådan jeg gør det. Jeg er ikke sikker på, om dette er den bedste måde at gøre det på, men det virker for mig.

Min fabriksklasse er kernen i min kode. Herfra genererer jeg alle klasser, jeg arbejder med. Min fabriksklasse er gemt i en separat fil factory.class.php .

Ved at have en fabriksklasse behøver jeg kun at inkludere klassefiler én gang. Hvis jeg ikke havde dette, skulle jeg inkludere mine klassefiler for hver fil, der skulle bruge den. Hvis jeg skal opdatere et klassefilnavn senere, skal jeg kun lave opdateringen i fabriksklassefilen.

En anden grund til at oprette et fabriksobjekt var at reducere antallet af DB-forbindelser.

Jeg gemmer hver klasse som en separat fil

Fabriksklasse

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

Forbindelsesklasse

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

Forskellige klasseobjekter

Dette er dine klasser. Det er her, du arbejder med dine data. I min egen kode bruger jeg tri-tier-arkitektur, der adskiller præsentation fra virksomhedslag og dataobjektlag.

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

Gør det samme for dine andre klasser.

Sæt det hele sammen

Bemærk, at vi kun inkluderer én fil, fabriksfilerne. Alle andre klassefiler er inkluderet i fabriksklassefilen.

// 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. Postgresql UUID understøttet af Hibernate?

  2. Automatisk db-forbindelse tæt i php?

  3. datagrip Kan ikke anvende ændringer Denne tabel er skrivebeskyttet. Ændringer i celleeditoren kan ikke anvendes

  4. MySQL:Sådan indsætter du flere poster med samme ID autoincrement