练习创建DB类,需要一些指导

时间:2012-08-31 15:30:41

标签: php class pdo

所以我的任务是学习如何使用PDO创建自己的DB类。我对PDO和更复杂的类开发相当新,并希望在我深入研究之前从社区获得一些指导。我有一个部分构建的类,但我知道必须有一个更好/更合理的方法来做到这一点。

我真的希望能够有一个查询方法,所以我可以在我的数据库类中几乎任何东西。如果这是错误的想法,请告诉我原因。

目前我有一个config.php文件,其中定义了DB常量,并且有一个名为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开发人员。我确实看了一下使用单例模式,但希望从那些真正知道它们如何工作和组合在一起的人那里获得更多信息。

提前致谢!

1 个答案:

答案 0 :(得分:2)

如果我正确地阅读了您的问题,那么您正在寻找一个所谓的Query-Builder。查询构建器是一个具有一些参数的类,可以根据参数返回查询。

实际上,如果你上面的例子就是你所需要的,那就不需要了。您只需要将它放入它自己的类中,因为数据库层的其余部分还有其他事情要做。

然后,您可以将Query对象传递到它所属的位置。通常你在某些类中使用它。所以你实际上并没有要求创建一个通用的DB神类(这将是一个气味btw),但你只是想将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传递到您需要的地方。