0

そのため、私はPDOを使用して独自のDBクラスを作成する方法を学ぶ使命を帯びています。私はPDOとより複雑なクラス開発にかなり慣れていないので、コミュニティに深く入り込む前に、コミュニティから少しガイダンスをもらいたいと思っていました。私は部分的にクラスを構築していますが、これを行うにはより良い/より論理的な方法が必要であることを知っています。

DBクラスでほとんど何でも実行できるように、単一のクエリメソッドを使用できるようにしたいと考えています。これが間違った考えである場合は、理由を教えてください。

現在、DB定数が定義されたconfig.phpファイルとDBというクラスがあります。これが私のコードです:

index.phpの場合:

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

そして私のクラス:

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

私はここで何かが欠けていることを知っています。より良いPHP開発者になるためにこれを本当に学びたいので、私を正しい方向に押してください。私はシングルトンパターンの使用について少し調べましたが、それがどのように機能し、どのように組み合わされているかを本当に知っている人々からもう少し情報を得たいと思いました。

前もって感謝します!

4

1 に答える 1

2

私があなたの質問を正しく読んだ場合、あなたはいわゆるクエリビルダーを探しています。クエリビルダーは、いくつかのパラメーターを持ち、パラメーターに基づいてクエリを返すことができるクラスです。

上記の例が必要なものである場合、実際にはこれ以上もそれ以下も必要ありません。データベース層の残りの部分には他にやるべきことがあるので、それを独自のクラスに入れる必要があるだけです。

次に、Queryオブジェクトをそれが属する場所に渡すことができます。通常、それをあるクラスの内部で使用します。したがって、実際には一般的なDB godクラスの作成について質問しているわけではありませんが(これは臭いです)、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ます。

于 2012-08-31T19:10:31.997 に答える