2016-11-20 1 views
1

Ich versuche, einfache Suchfunktion zu machen, aber es gibt einen Fehler, den ich nicht warum finden kann.PDO, kann nicht finden, was in meiner vorbereiteten Aussage falsch ist

Ich überprüfte das Ergebnis SQL-Abfrage wird ordnungsgemäß generiert. Führen Sie diese vorbereitete Anweisung jedoch aus, um einen unbekannten Fehler zu verursachen. Warum gibt execute() false zurück?

public function searchConcept(string $cplx = '', string $name = '', string $desc = '', int $page = 0) 
{ 
    $SQL = 'select * from concept '; 
    $SQL_criteria = array(); 

    // Criteria 
    if($cplx) { $SQL_criteria[] = 'cplx:cplx'; } 
    if($name) { $SQL_criteria[] = 'name like :name'; } 
    if($desc) { $SQL_criteria[] = 'description like :desc'; } 
    if($SQL_criteria) { $SQL .= 'where '.implode(' and ', $SQL_criteria).' '; } 

    $SQL .= 'limit :page, 15'; 

    $stmt = $this->db->prepare($SQL); 

    if($cplx) { $stmt->bindValue(':cplx', $cplx); } 
    if($name) { $stmt->bindValue(':name', '%'.$name.'%'); } 
    if($desc) { $stmt->bindValue(':desc', '%'.$desc.'%'); } 

    $stmt->bindValue(':page', $page*15); 

    if($stmt->execute()) { 
     $rst = $stmt->fetchAll(\PDO::FETCH_OBJ); 
     return $rst; 
    } else { 
     throw new DBRFError(); 
    } 
} 

DBRFError ist benutzerdefinierte Fehlerklasse, die ich gemacht habe.

#

hinzufügen 1. #### Ich denke cplx:cplx keine Rolle spielt. $cplx nimmt seinen Wert etwas wie "> 5". Ich habe diese bestimmte Situation nicht wirklich getestet, aber ich habe gerade ohne cplx Block getestet und auch einen Fehler verursacht.

#

Hinzufügen 2. #### Ich finde nur den Ursprung des Problems. $SQL .= 'limit :page, 15'; es verursacht den Fehler. Ich mache das für die Pagenation. Ohne diesen Block funktioniert Code gut. Ich kann jedoch nicht verstehen warum.

+0

Was ist, wenn Sie Ihre resultierende SQL drucken und manuell ausführen? – krasipenkov

+0

tat ich. und ich denke, ich habe einen Ursprung des Problems gefunden. – GatesPlan

Antwort

2

Sie haben '=' in Ihrer WHERE-Klausel fehlt. Dies ist der feste Code:

if($cplx) { $SQL_criteria[] = 'cplx=:cplx'; }