N1QL подготовленное заявление не работает 100%

У меня есть проблема, когда некоторые переменные, вероятно, (я не могу знать наверняка) не вставлены в окончательное утверждение. Вот мой пример:

Работает:

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

По сути, второй пример не возвращает результата, тогда как первый работает просто отлично.

Есть идеи почему?

1

Решение

Вы не используете параметры N1QL правильно. Вы должны решить, оцениваете ли вы свои параметры в PHP или в N1QL.

Имя поля не может быть параметром N1QL, поэтому вы оцениваете его в PHP:

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

Термин поиска должен быть параметром N1QL, поэтому вы добавляете символы подстановки в PHP, а затем передаете его в N1QL в качестве параметра:

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

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]