sql >> Databáze >  >> RDS >> Mysql

Třída připojení PDO / kód a provedení třídy

Takto to víceméně dělám já. Nejsem si jistý, jestli je to nejlepší způsob, jak to udělat, ale pro mě to funguje.

Moje tovární třída je JÁDREM mého kódu. Odtud generuji všechny třídy, se kterými pracuji. Moje tovární třída je uložena v samostatném souboru factory.class.php .

Tím, že mám tovární třídu, potřebuji zahrnout soubory třídy pouze jednou. Pokud bych to neměl, musel bych zahrnout své soubory třídy pro každý soubor, který jej musím použít. Pokud potřebuji později aktualizovat název souboru třídy, potřebuji provést aktualizaci pouze v souboru tovární třídy.

Dalším důvodem pro vytvoření továrního objektu bylo snížení počtu DB připojení.

Každou třídu ukládám jako samostatný soubor

Tovární třída

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

Třída připojení

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

Objekty různých tříd

Toto jsou vaše třídy. Zde pracujete se svými daty Ve svém vlastním kódu používám třívrstvou architekturu oddělující prezentaci od obchodní vrstvy a vrstvy datových objektů.

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

Udělejte totéž pro ostatní třídy.

Dáme vše dohromady

Všimněte si, že zahrnujeme pouze jeden soubor, tovární soubory. Všechny ostatní soubory třídy jsou zahrnuty v souboru třídy 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. Jak zapsat UPDATE SQL s aliasem tabulky v SQL Server 2008?

  2. Vytvářejte drobky kategorií uložených v MySQL

  3. Gem Ruby mysql2 zkompilován pro špatnou verzi klientské knihovny mysql

  4. Jaký je nejlepší způsob ukládání souřadnic (zeměpisná délka/šířka, z Map Google) na serveru SQL?