2016-07-08 11 views
1

Ich habe ein Problem, wo einige Variablen sind wahrscheinlich (ich kann nicht sicher wissen) nicht in die endgültige Anweisung eingefügt. Hier ist mein Beispiel ist:N1QL vorbereitete Anweisung funktioniert nicht 100%

Works:

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-Ausgabe: debug01

funktioniert nicht:

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-Ausgabe: debug02

Grundsätzlich gibt das zweite Beispiel kein Ergebnis zurück, während das erste nur gut funktioniert.

Irgendeine Idee warum?

Antwort

0

Sie verwenden N1QL-Parameter nicht korrekt. Sie müssen entscheiden, ob Sie Ihre Parameter in PHP oder in N1QL bewerten.

Der Name darf kein N1QL Parameter sein, so dass Sie es in PHP auswerten:

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

Der Suchbegriff sollte ein N1QL Parameter, so dass Sie Platzhalter in PHP hinzufügen und geben es dann zu N1QL als Parameter:

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

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

Ok, $ Suchbegriff funktioniert jetzt. Vielen Dank. Aber für das Feld $, entfernt ";" und mit addslashes() darauf genug oder gibt es eine spezielle Funktion für Couchbase wie es für andere RDBMS gibt? –

+0

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

+0

Ich habe gerade festgestellt, dass du keine Zeichen mit '\' so no 'addslashes()' entgehen kannst. ATM Ich benutze '$ field = str_replace (["; "," '",'" ', "'", "\" "]," ", $ field);' Ist das eine gute Lösung oder tust du? eine bessere Lösung? –