2016-07-08 3 views
1

У меня проблема, когда некоторые переменные, вероятно (я не знаю точно), не вставлены в заключительный оператор. Вот мой пример: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; 
} 

Debug Output: 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; 
} 

Debug: debug02

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

Любая идея, почему?

ответ

0

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

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

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

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

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

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

ОК, $ searchterm работает сейчас. Благодарю. Но для поля $ удаляет ";" и с помощью addslashes() на нем достаточно или есть специальная функция для couchbase, например, для других СУБД? –

+0

: $ field = addslashes (str_replace (";", "", $ field)); –

+0

Я просто понял, что вы не можете избежать символов с '\', поэтому никаких 'addslashes()'. ATM Я использую '$ field = str_replace (["; "," '"," "," "," \ "]," ", $ field);' Это хорошее решение или вы знаете, лучшее решение? –

Смежные вопросы