PDO预处理语句-在两个相似的方法中有不同的行为


PDO Prepared Statement - Different behavior inside 2 similar methods

我希望有人向我解释为什么第一种方法只在WHERE子句中引用占位符':cat_id'之后有效,并且需要$this->db->query($query);,否则会抛出致命错误:

"SQLSTATE[HY093]: Invalid parameter number:绑定变量的个数与…中的令牌数量不匹配。"

而第二种方法既不需要引用也不需要$this->db->query()方法?

public function getAllPosts($cat_id = null)
{   
    // Query build
    $query = "SELECT posts.*, users.username, categories.title FROM posts "
            . "INNER JOIN users "
            . "ON posts.user_id = users.id "
            . "INNER JOIN categories "
            . "ON posts.category_id = categories.id ";
    // Filter
    if (!is_null($cat_id))
    {
        $query .= "WHERE category_id = ':cat_id' ";
        // Order query
        $query .= "ORDER BY create_date DESC";
        $this->db->bind(':cat_id', $cat_id);
    }
    else
    {
        $query .= "ORDER BY create_date DESC";
    }
    $this->db->query($query);
    // Run the query

    // Assign Result Set
    $results = $this->db->resultset();
    return $results;
}

public function getCategoryPosts($cat_id)
{   
    $query = "SELECT posts.*, users.username, categories.title FROM posts "
            . "INNER JOIN users "
            . "ON posts.user_id = users.id "
            . "INNER JOIN categories "
            . "ON posts.category_id = categories.id "
            . "WHERE posts.category_id = :cat_id "
            . "ORDER BY create_date DESC";
    $this->db->bind(':cat_id', $cat_id);
    $results = $this->db->resultset();
    return $results;
}

更新:

下面是第一个方法查询的回显输出:

1。引用:

SELECT posts.*, users.username, categories.title FROM posts 
INNER JOIN users ON posts.user_id = users.id
INNER JOIN categories ON posts.category_id = categories.id 
WHERE category_id = ':cat_id' ORDER BY create_date DESC

2。非挂牌:

SELECT posts.*, users.username, categories.title FROM posts 
INNER JOIN users ON posts.user_id = users.id 
INNER JOIN categories ON posts.category_id = categories.id 
WHERE category_id = :cat_id ORDER BY create_date DESC

下面的字符串

缺少一个尾随空格
$query .= "WHERE category_id = ':cat_id'";

所以你要将它连接成:

WHERE category_id = ':cat_id'ORDER BY create_date DESC

如果你删除',你会得到:

WHERE category_id = :cat_idORDER BY create_date DESC

所以PDO期望:cat_idORDER的绑定值

同样在getCategoryPosts()中,您创建了一个查询,但从未实际使用它。