2014-04-08 202 views
0

我终于得到了jQuery AutoComplete与CakePHP一起工作。我最初的计划是建立一个分组/分类清单,如果用户输入了学校的名称,它将显示该学校的所有节目,如果他们输入节目的名称,它会向学校显示它来自哪个学校。CakePHP SQL准备语句

我发现使用Cake语法非常难以实现,所以我决定连接学校的名称和节目的名称,然后将该字符串与$项进行比较。我意识到VirtualFields不会跨多个模型工作中使用准备好的语句,语法本身评估细所以通过,但我得到这个SQL错误:

"Column not found: 1054 Unknown column 'romeo and juliet' in 'where clause'" 

所以它似乎通过长期优良而是将其比作列名比纪录。这里是我的自动完成功能与准备语句的语法:

public function autoComplete() { 
    $this->autoRender = false; 
    $term = $_GET['term']; 
    $shownames = $this->Order->Show->query(
     'SELECT CONCAT(sm_schools.title, " - ", sm_shows.title) 
     FROM sm_shows 
     LEFT JOIN sm_schools 
     ON sm_shows.school_id = sm_schools.id 
     WHERE CONCAT(sm_schools.title, " - ", sm_shows.title) LIKE ' .$term 
    ); 
    echo json_encode($this->_encode($shownames)); 
} 

任何帮助将是伟大的。 谢谢

+3

您发布的代码不是准备好的声明。请参阅http://book.cakephp.org/2.0/en/models/retrieving-your-data.html#prepared-statements您正在使用的内容易受SQL注入攻击。查看错误时生成的MySQL查询是什么? – Kai

+0

以下是生成的查询(对可怕的格式化表示歉意) SQL查询:SELECT CONCAT(sm_schools.title,“ - ”,sm_shows.title)FROM sm_showsLEFT JOIN sm_schoolson sm_shows.school_id = sm_schools.idWHERE CONCAT(sm_schools.title ,“ - ”,sm_shows.title)LIKE罗密欧与朱丽叶 – iKettles

回答

2

罗密欧和朱丽叶没有引号,这可能是错误来自哪里。但是,您应该使用实际准备的语句来完成此操作。

$db = $this->Order->getDataSource(); 
$shownames = $db->fetchAll(
    'SELECT CONCAT(sm_schools.title, " - ", sm_shows.title) 
    FROM sm_shows 
    LEFT JOIN sm_schools 
    ON sm_shows.school_id = sm_schools.id 
    WHERE CONCAT(sm_schools.title, " - ", sm_shows.title) LIKE ?', 
    array($term) 
); 
+0

道歉,我已经关闭了几周!我尝试了你提供的代码,它不会导致任何SQL错误,只是返回一个空集。我开始认为这不可能使用预先准备的语句?我已经恢复使用Cake语法来提取数据,但我真的很努力得到一个分组选择字段。 – iKettles

+0

正确答案。虽然我总是发现“fetchAll”方法的名称可能更直观,因为它可以用于多种用途(插入,更新等) –