2012-08-31 2 views
0

그래서 저는 PDO를 사용하여 DB 클래스를 만드는 방법을 배우려하고 있습니다. 저는 PDO와 좀 더 복잡한 수업 개발을 처음 접했고 너무 어려워지기 전에 커뮤니티에서 약간의 지침을 얻고 싶었습니다. 부분적으로 빌드 된 클래스가 있지만 이것을 수행하는 더/더 논리적 인 방법이 있어야한다는 것을 알고 있습니다.연습 DB 클래스 생성, 약간의 지침이 필요합니다.

DB 클래스에서 거의 모든 것을 처리 할 수 ​​있도록 단일 쿼리 메서드가 있어야합니다. 이것이 잘못된 생각이라면 저에게 이유를 알려주십시오.

현재 DB 상수가 정의되어 있고 DB라는 클래스가있는 config.php 파일이 있습니다. 내가 여기서 뭔가를 놓치고 알고

 public $dbh; 


public function __construct(){ 

    $dbh = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME, DB_USER, DB_PASSWORD); 

}//end __construct 


public function build_query($args){ 

    $defaults = array(
         'type' => 'SELECT', 
         'fields' => '*', 
         'table' => '', 
         'where' => '', 
         'orderby' => 'id', 
         'order' => 'DESC' 
         'offset' => '0', 
         'limit' => '' 
        ); 

    $params = array_merge($defaults, $args); 

    $sql = $params['type']; 

    $sql .= ' '.$params['fields'].' FROM '.$params['table']; 

    if($params['where']) 
     $sql .= ' WHERE '.$params['where']; 

    $sql .= ' ORDER BY '$params['orderby'].' '.$params['order']; 

    if($limit) 
     $sql .= ' LIMIT '.$params['offset'].', '.$params['offset']; 

    return $sql;  

}//end build_query 


public function dbq($args){ 

    $sql = $this->build_query($args); 

    $this->$dbh->prepare($sql); 

    return $this->$dbh->execute(); 

:

의 index.php에서 :

require_once 'config.php';  
    require_once '_inc/class.db.php'; 
    $db = new DB(); 

그리고 내 수업 여기 내 코드입니다. 더 나은 PHP 개발자가되기 위해 정말로 배우고 싶기 때문에 올바른 방향으로 나를 밀어주십시오. 나는 싱글 톤 패턴을 사용하는 것을 조금 보았다.하지만 실제로 어떻게 작동하고 함께 맞는지를 아는 사람들로부터 조금 더 많은 정보를 얻고 싶었다.

미리 감사드립니다.

+0

다음 질문은 당신에게 흥미로울 것 같아요 : [PHP의 MySQL 확장에서 PDO로 전환. 코드 줄을 줄이기 위해 클래스 확장] (http://stackoverflow.com/questions/12183695/switching-from-phps-mysql-extension-to-pdo-extend-class-to-reduce-lines-of-cod) - 싱글 톤 패턴도 잊어 버리십시오. 귀하의 경우 도움이되지 않습니다. [싱글 톤이 필요한 분은 누구입니까?] (http://stackoverflow.com/questions/4595964/who-needs-singletons?lq=1) – hakre

+0

왜 당신에게 충분하지 않은 모든 것을 쿼리 할 수있는 기존 쿼리 함수? – hakre

답변

2

질문을 올바르게 읽으면 쿼리 작성기가 필요합니다. 쿼리 작성기는 일부 매개 변수가 있고 매개 변수를 기반으로 쿼리를 반환 할 수있는 클래스입니다.

실제로 위의 예가 필요한 경우 실제로는 더 이상 아무것도 필요하지 않습니다. 데이터베이스 계층의 나머지 부분은 할 일이 많기 때문에이 클래스를 자신의 클래스에 넣기 만하면됩니다.

그런 다음 쿼리 개체를 해당 개체가 속한 위치로 전달할 수 있습니다. 일반적으로 일부 클래스에서는 내부적으로 사용합니다. 그래서 당신은 실제로 (냄새 BTW 것) 일반 DB 신 클래스를 만드는 방법에 대해 물어되지 않습니다,하지만 당신은 단지 자신의 클래스로 SQL 쿼리 문자열 작성기를 포장 할 : 실제로

/** 
* SQL Query 
*/ 
class SqlQuery 
{ 
    public 
     $type = 'SELECT', 
     $fields = '*', 
     $table, 
     $where, 
     $orderby = 'id', 
     $order = 'DESC', 
     $offset, 
     $limit; 

    /** 
    * @return string 
    */ 
    public function getQuery() { 

     $sql = sprintf('%s %s FROM %s', $this->type, $this->fields, $this->table); 

     $this->where 
      && $sql .= sprintf(' WHERE %s', $this->where) 
     ; 

     $sql .= sprintf(' ORDER BY %s %s', $this->orderby, $this->order); 

     $this->limit 
      && $sql .= sprintf(' LIMIT %s, %s', $this->offset, $this->limit) 
     ; 

     $sql .= ';'; ### not strictly necessary but nice for debugging ### 

     return $sql; 
    } 

    public function __toString() { 
     return $this->getQuery(); 
    } 
} 

### Usage: ### 

$query = new SqlQuery; 
$query->table = 'TABLE1'; 
echo $query; // SELECT * FROM TABLE1 ORDER BY id DESC; 

이 예 지금까지 가지고있는 모든 것을 다루지 만 정의 된 인터페이스를 제공합니다. 따라서 기본 속성 값을 가지며 빌드 함수가 있습니다. 그런 다음 필요에 따라 SqlQuery을 전달하면됩니다.

+0

실제로 둘 다를 할 수 있습니다. SQL 쿼리를 PDO에 직접 전달하거나 더 많은 직접 전달을하고 다른 클래스에 전달한 다음 PDO로 전달하십시오. 뭐든간에 당신에게 더 이해가됩니다. 이 예제의'SqlQuery' 클래스는 문자열 문맥이있는 매개 변수 안에서 SQL 쿼리를 문자열로 반환합니다. 또는 문자열을'cast '할 수도있다 :'(string) $ query'. – hakre

+0

굉장! 통찰력과 설명에 감사드립니다. 그리고 지금은 PDO 래퍼 클래스를 만드는 방법 :) – dkmojo

관련 문제