sql >> Databasteknik >  >> RDS >> Mysql

PDO anslutningsklass / kod och klassdesign

Det är ungefär så jag gör. Jag är inte säker på om detta är det bästa sättet att göra det på, men det fungerar för mig.

Min fabriksklass är KÄRNAN i min kod. Härifrån genererar jag alla klasser jag arbetar med. Min fabriksklass sparas i en separat fil factory.class.php .

Genom att ha en fabriksklass behöver jag bara inkludera klassfiler en gång. Om jag inte hade detta, skulle jag behöva inkludera mina klassfiler för varje fil som måste använda den. Om jag behöver uppdatera ett klassfilnamn senare behöver jag bara göra uppdateringen i fabriksklassfilen.

Ett annat skäl till att skapa ett fabriksobjekt var att minska antalet DB-anslutningar.

Jag sparar varje klass som en separat fil

Fabriksklass

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

Anslutningsklass

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

Olika klassobjekt

Det här är dina klasser. Det är här du jobbar med din data. I min egen kod använder jag tri-tier arkitektur, separerar presentation, från affärslager och dataobjektlager.

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 samma sak för dina andra klasser.

Sammanfogar allt

Observera att vi bara inkluderar en fil, fabriksfilerna. Alla andra klassfiler ingår i Factory class-filen.

// 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. Finns det någon prestandaskillnad mellan BETWEEN och IN med MySQL eller i SQL i allmänhet?

  2. En översikt över volymnivåreplikering för PostgreSQL med DRBD

  3. T-SQL SET Operatörer del 2:KORS och UTOM

  4. bind_param() endast nödvändig för användarinmatade värden eller alla?