PDO动态查询构建


PDO Dynamic Query Building

我以前一直使用mysql_query,现在开始使用PDO。这太棒了!

但在我的旧脚本中,我必须构建一个动态查询生成器,并且我很难使用PDO来移植它。

如果有人能给我一些指导,那就太好了!

这是它的理论。

  1. 我有一个数组
  2. DB字段和值(插入时)
  3. 创建查询字符串以生成有效的PDO事务

以下是我想做的一部分。

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

我知道这是一个很高的要求,我希望它在我尝试做的事情中是有意义的,但如果能为构建这些查询提供任何帮助,我们将不胜感激。

您的select方法需要一个单独的$params参数。我随意提供了方法参数的默认值。就像@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是"字段加值"是什么意思。你能解释一下吗

[编辑]

您可能想看看PDOStatement::execute的文档/示例,因为这似乎是您的困惑的根源——特别是$input_parameters方法参数。

这个怎么样?

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

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