我希望有人向我解释为什么第一种方法只在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()
中,您创建了一个查询,但从未实际使用它。