ZF:查询错误 SQLSTATE[HY093]

发布于 2024-10-21 23:10:31 字数 618 浏览 5 评论 0原文

我在这个函数上遇到错误:

public function getCountCategoryByUrl($url, $root = 0)
{
    $url = strtolower($url);


    $select = $this->select()
                   ->from($this->_name, array('count(*) as cnt'))
                   ->where("LOWER(catalog_url) LIKE :url " . ($root > 0 ? " AND `type` = :type" : ""));

    return $this->getAdapter()->fetchOne($select, array('url' => $url, 'type' => $root));
}

错误:

Message: SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens 

我做错了什么?

I have error on this function:

public function getCountCategoryByUrl($url, $root = 0)
{
    $url = strtolower($url);


    $select = $this->select()
                   ->from($this->_name, array('count(*) as cnt'))
                   ->where("LOWER(catalog_url) LIKE :url " . ($root > 0 ? " AND `type` = :type" : ""));

    return $this->getAdapter()->fetchOne($select, array('url' => $url, 'type' => $root));
}

Error:

Message: SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens 

What I'm doing wrong?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

挽梦忆笙歌 2024-10-28 23:10:32

当您有 $root <= 0 时就会出现问题。在这种情况下,您的 SQL 语句仅包含一个标记 (:url),而您绑定两个变量(:url :类型)。

您必须有条件地设置绑定参数:

$select = $this->select()
               ->from($this->_name, array('count(*) as cnt'))
               ->where("LOWER(catalog_url) LIKE :url ");
$params = array(':url' => $url);
if ($root > 0) {
    $select->where("`type` = :type");
    $params[':type'] = $root;
}

return $this->getAdapter()->fetchOne($select, $params);

编辑:我忽略了一些非常重要的事情。变量必须使用与 SQL 语句中定义的相同标记进行绑定。这意味着您必须使用 :url:type 作为绑定变量(而不是 urltype) 。

The problem arises when you have $root <= 0. In this case your SQL statement contains only one token (:url) while you're binding two variables (:url and :type).

You have to set the bound parameters conditionally:

$select = $this->select()
               ->from($this->_name, array('count(*) as cnt'))
               ->where("LOWER(catalog_url) LIKE :url ");
$params = array(':url' => $url);
if ($root > 0) {
    $select->where("`type` = :type");
    $params[':type'] = $root;
}

return $this->getAdapter()->fetchOne($select, $params);

EDIT: I've overlooked something very important. Variables must be bound with the same token as defined in the SQL statement. This means that you have to use :url and :type for the bound variables (not url and type).

内心荒芜 2024-10-28 23:10:32

否则,您可以执行die($select)来查看生成了哪些SQL语句。

Else, you can do die($select) to view what SQL statement is generated.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文