PDO动态查询构建

时间:2012-08-07 01:18:10

标签: php mysql database pdo abstract-class

我使用mysql_query进入旧学校,现在开始使用PDO。哪个好极了!

但在我的旧脚本中,我构建了一个动态查询构建器,并且我很难将其移植到使用PDO上。

如果有人能给我一些很棒的方向!

这是它的理论。

  1. 我有一个
  2. 数组
  3. 数据库字段和值(插入时)。
  4. 创建查询字符串以生成有效的PDO事务
  5. 这是我正在尝试做的一部分。

    public $dbFields; // This is an array of the fields plus VALUES
    
    public function select($where, $limit) {
        // This is what I **had** before
        $query = "SELECT ". implode(", ", $this->dbFields) ." FROM ". $this->table." WHERE ". $where ." ". $limit."";
    
        // Now i need to convert that to PDO
        $this->connection->beginTransaction();
    
        # START Query
        $select = $this->connection->prepare("SELECT {$this->fieldNames} FROM {$this->table}");
    
        // I need to BIND my params and values, but i'm not sure the best route to take when I have a WHERE clause that includes, "AND" / "OR" operators.
    
        # EXECUTE the query
        $select->execute();
    
        $this->connection->commit();
    }
    

    这是我 HAD 之前的

    $results = $db->select("userId = 111 OR userId = 222");
    

    但我思考我需要做的是使用更像

    的东西
    $results = $db->select(array("userId"=>111, "userId"=>222));
    

    我知道这是一个很高的命令,我希望它在我想要做的事情上是有意义的,但是在尝试构建这些查询时的任何帮助都将非常感激。

2 个答案:

答案 0 :(得分:2)

您的$params方法需要单独的select参数。我冒昧地为方法参数提供默认值。与@userXxxx笔记一样,您只需要执行SELECT

<?php

class db {

    public $connection; //PDO
    public $dbFields; // This is an array of the fields plus VALUES

    public function select($where = '1', $params = array(), $limit = '', $fetchStyle = PDO::FETCH_ASSOC) { //fetchArgs, etc
        $fields = implode(', ', $this->dbFields);

        //create query
        $query = "SELECT $fields FROM {$this->table} WHERE $where $limit";

        //prepare statement
        $stmt = $this->connection->query($query);

        $stmt->execute($params);

        return $stmt->fetchAll($fetchStyle);
    }

    //...
}


$where = 'userId IN(:userId1, :userId2)';
$params = array(':userId1' => 111, ':userId2' => 2222);
$db->select($where, $params);

注意:

  • 如果您真的需要,可以添加其他方法参数以配合PDOStatement::fetchAll的所有灵活性。
  • 我不确定你对$dbFields是“字段加VALUES”的意思。你能解释一下吗?

[编辑]

您可能需要查看PDOStatement::execute的文档/示例,因为这似乎是您的混淆根源所在 - 特别是$input_parameters方法参数。

答案 1 :(得分:-1)

这个怎么样?

public function select($where, $limit) {
    $query = "SELECT ". implode(", ", $this->dbFields) ." FROM ". $this->table." WHERE ". $where ." ". $limit."";
    $this->connection->query($query);
}

//Use what you had before:
$results = $db->select("userId = 111 OR userId = 222");

不确定为什么要使用事务(全有或全无或捕获异常和回滚)或准备好的查询(用于发送多个查询)......