1

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

作品:

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

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

知道为什么吗?

4

1 回答 1

0

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

字段名称不能是 N1QL 参数,因此您在 PHP 中对其进行评估:

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

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

$searchterm = '%'.$searchterm.'%'

TOSTRING('.$field.') LIKE $searchterm ...
于 2016-07-08T16:59:46.913 回答