【问题标题】:N1QL prepared statement not working 100%N1QL 准备好的语句不能 100% 工作
【发布时间】:2016-07-08 13:58:31
【问题描述】:

我有一个问题,有些变量可能(我不能确定)没有插入到最终语句中。这是我的例子:

作品:

public static function findByPageAndFieldContains($recordsPerPage, $page, $field, $searchterm) {
    $query = CouchbaseN1qlQuery::fromString('SELECT * FROM `public_portal` WHERE `collection`=$collection AND TOSTRING('.$field.') LIKE "%'.$searchterm.'%" ORDER BY `_id` limit $limit offset $offset');
    $query->options['$collection'] = static::COLLECTION_NAME;
    //$query->options['$field'] = $field;
    $query->options['$limit'] = $recordsPerPage;
    $query->options['$offset'] = $recordsPerPage*($page-1);
    //$query->options['$searchterm'] = $searchterm;

    $result = DB::getDB()->query($query);
    var_dump($query);
    var_dump($result);
    $objects = array();
    foreach($result as $row) {
        $object = new static($row->{"public_portal"});
        $object->setId($row->{"public_portal"}->{"_id"});
        $objects[] = $object;
    }
    //var_dump($objects);
    return $objects;
    return $result;
}

调试输出: debug01

不起作用:

public static function findByPageAndFieldContains($recordsPerPage, $page, $field, $searchterm) {
    $query = CouchbaseN1qlQuery::fromString('SELECT * FROM `public_portal` WHERE `collection`=$collection AND TOSTRING($field) LIKE "%$searchterm%" ORDER BY `_id` limit $limit offset $offset');
    $query->options['$collection'] = static::COLLECTION_NAME;
    $query->options['$field'] = $field;
    $query->options['$limit'] = $recordsPerPage;
    $query->options['$offset'] = $recordsPerPage*($page-1);
    $query->options['$searchterm'] = $searchterm;

    $result = DB::getDB()->query($query);
    var_dump($query);
    var_dump($result);
    $objects = array();
    foreach($result as $row) {
        $object = new static($row->{"public_portal"});
        $object->setId($row->{"public_portal"}->{"_id"});
        $objects[] = $object;
    }
    //var_dump($objects);
    return $objects;
    return $result;
}

调试输出: debug02

基本上第二个例子没有返回结果,而第一个例子工作得很好。

知道为什么吗?

【问题讨论】:

    标签: php prepared-statement couchbase n1ql


    【解决方案1】:

    您没有正确使用 N1QL 参数。您必须决定是在 PHP 中还是在 N1QL 中评估参数。

    字段名不能是N1QL参数,所以用PHP求值:

    TOSTRING('.$field.') LIKE ...
    

    搜索词应该是 N1QL 参数,所以你在 PHP 中添加通配符,然后将其作为参数传递给 N1QL:

    $searchterm = '%'.$searchterm.'%'
    
    TOSTRING('.$field.') LIKE $searchterm ...
    

    【讨论】:

    • 好的,$searchterm 现在可以使用了。谢谢。但是对于 $field,正在删除“;”并在其上使用 addlashes() 就足够了,还是像其他 RDBMS 一样为 couchbase 提供特殊功能?
    • 像这样:$field = addlashes(str_replace(";", "", $field));
    • 我刚刚意识到你不能用 ` \ ` 转义字符,所以没有addslashes()。 ATM 我正在​​使用$field = str_replace([";", "'", '"', "´", "`"], "", $field); 这是一个好的解决方案还是您知道更好的解决方案?
    • 这是一个 PHP 问题,而不是 N1QL 问题,所以我不能说。请记住,N1QL 看不到 $field。它必须在您的 PHP 中进行预处理并发送到非参数化的 N1QL。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-08
    • 2015-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多