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-Builder。查询构建器是一个具有一些参数并且可以根据参数返回查询的类。

实际上,如果您上面的示例是您所需要的,那么这不需要更多,也不需要更少。您只需要将其放入它自己的类中,因为数据库层的其余部分还有其他事情要做。

然后,您可以将 Query 对象传递到它所属的位置。通常你在某个类内部使用它。所以你实际上并不是在问创建一个通用的 DB 神类(这将是一种气味),但你只是想将 SQL Query String Builder 包装到它自己的类中:

/**
 * 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 回答