Mysql
 sql >> Datenbank >  >> RDS >> Mysql

PDO-Verbindungsklasse / Code und Klassendesign

So mache ich es mehr oder weniger. Ich bin mir nicht sicher, ob dies der beste Weg ist, aber es funktioniert für mich.

Meine Factory-Klasse ist der KERN meines Codes. Von hier aus generiere ich alle Klassen, mit denen ich arbeite. Meine Factory-Klasse wird in einer separaten Datei factory.class.php gespeichert .

Da ich eine Factory-Klasse habe, muss ich die Klassendateien nur einmal einbinden. Wenn ich dies nicht hätte, müsste ich meine Klassendateien für jede Datei einschließen, die sie verwenden muss. Wenn ich später einen Klassendateinamen aktualisieren muss, muss ich die Aktualisierung nur in der Factory-Klassendatei vornehmen.

Ein weiterer Grund für die Erstellung eines Factory-Objekts bestand darin, die Anzahl der DB-Verbindungen zu reduzieren.

Ich speichere jede Klasse als separate Datei

Werksklasse

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

Verbindungsklasse

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

Verschiedene Klassenobjekte

Das sind deine Klassen. Hier arbeiten Sie mit Ihren Daten. In meinem eigenen Code verwende ich eine dreistufige Architektur, die die Präsentation von der Geschäftsschicht und der Datenobjektschicht trennt.

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

Machen Sie dasselbe für Ihre anderen Klassen.

Alles zusammen

Beachten Sie, dass wir nur eine Datei enthalten, die Factory-Dateien. Alle anderen Klassendateien sind in der Factory-Klassendatei enthalten.

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