CakePHP:在控制器中添加变量以进行查询

时间:2010-10-22 09:29:24

标签: php sql cakephp

我有一个使用sql查询的控制器操作:

    $tag = $this->params['tag'];

    $this->set('projects', $this->Project->query('SELECT * FROM projects INNER JOIN projects_tags ON projects.id = projects_tags.project_id INNER JOIN tags on projects_tags.tag_id = tags.id WHERE tags.tag LIKE $tag'));

正如你在最后看到的那样,我想在$ tag变量中使用where子句,但我不确定语法是怎样的。因为我收到了错误

Unknown column '$tag' in 'where clause'

有人能引导我朝着正确的方向前进吗?

的Ta,

Jonesy

5 个答案:

答案 0 :(得分:4)

我强烈建议您使用Cake ORM而不是原始查询,特别是如果您要将URL参数插入其中。 HABTM表的条件可能很棘手,但您也可以使用Cake的ORM语法构建连接!

阅读手册,3.7.6.9 Joining tables部分。

答案 1 :(得分:3)

如果您想使用Cake的ORM,以下代码应提供与原始SQL查询等效的结果:

$this->loadModel('ProjectsTag'); // Load the joining table as pseudo-model

// Define temporary belongsTo relationships between the pseudo-model and the two real models
$this->ProjectsTag->bindModel(array(
    'belongsTo' => array('Project','Tag')
));

// Retrieve all the join-table records with matching Tag.tag values
$result_set = $this->ProjectsTag->find('all',array(
    'conditions' => array('Tag.tag LIKE' => "%{$tag}%")
));

// Extract the associated Project records from the result-set
$projects = Set::extract('/Project', $result_set);

// Make the set of Project records available to the view
$this->set(compact('projects'));

答案 2 :(得分:1)

在php中有一个difference between single and double quotes ...基本上,单引号不评估变量...使用双引号代替 我认为LIKE也需要单引号..我不太确定

"SELECT * FROM projects INNER JOIN projects_tags ON projects.id = projects_tags.project_id INNER JOIN tags on projects_tags.tag_id = tags.id WHERE tags.tag LIKE '$tag'"

我知道..我知道..人们会开始谈论关于sql注入......以及需要挖掘字符...这是另一个问题=)

祝你好运!

答案 3 :(得分:1)

如果用户来源,我至少会考虑在你的标签字符串上使用cakephp sanitize函数。请参阅http://book.cakephp.org/view/1183/Data-Sanitization或者使用mysql作为数据库,至少考虑使用http://www.php.net/manual/en/function.mysql-escape-string.php或者做一些事情来过滤用户输入。但最好的方法是使用CakePHP orm的东西。

答案 4 :(得分:-3)

将您的查询修改为:

$this->set('projects',
$this->Project->query("SELECT * FROM projects
                       INNER JOIN projects_tags
                       ON projects.id = projects_tags.project_id
                       INNER JOIN tags ON projects_tags.tag_id = tags.id
                       WHERE tags.tag LIKE '" . $tag . "'") //problem was here
                     );

它会起作用。