【问题标题】:How can I search for strings and integers in the same way in N1QL?如何在 N1QL 中以相同的方式搜索字符串和整数?
【发布时间】:2016-07-08 11:44:07
【问题描述】:

所以我有这个 PHP 函数:

public static function findByPageAndFieldContains($recordsPerPage, $page, $field, $searchterm) {
    $query = CouchbaseN1qlQuery::fromString('SELECT * FROM `public_portal` WHERE `collection`=$collection AND `'.$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;
}

此查询容易受到 n1ql 注入的影响。我知道。为什么?当我使用占位符(现在已评论)时,它没有给我任何结果。如果我不能解决它,我会发布第二个问题。

我想在这里问的问题是: 当用户搜索文档时,此功能会成功找到文档。但是当字段是整数时,不会给出结果。我尝试用“=”替换 LIKE 并删除了引号和 %。然后用户可以成功地在整数字段中搜索数字。但随后用户无法再搜索字符串字段。 有什么想法吗?

【问题讨论】:

  • 你可以检查$searchterm 看它是否是一个int,然后根据它改变查询。
  • 在n1ql中不能这样做吗?喜欢一些适用于两者的特殊报价? ATM 我正在​​将所有整数转换为字符串(这是一个测试数据库)并且它可以工作,但你的解决方法听起来更好,我稍后会尝试。
  • PHP 本身没有。使用is_int($searchterm) 并根据该条件更改原始查询字符串。

标签: php couchbase n1ql


【解决方案1】:

我明白了。 我刚刚在 n1ql 语句中添加了一个 TOSTRING(),它现在适用于字符串和 int。

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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-04
    • 1970-01-01
    • 2015-03-10
    • 1970-01-01
    • 2015-11-02
    • 2021-02-08
    相关资源
    最近更新 更多