Итак, у меня есть эта функция 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 на «=» и удалил кавычки и%. Тогда пользователи смогут успешно искать числа в целочисленных полях. Но тогда пользователи больше не могут искать строковые поля.
Есть идеи?
Я понял.
Я просто добавил TOSTRING () в оператор n1ql, и теперь он работает как для строки, так и для 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;
}
Других решений пока нет …