CakePHP:在控制器中向查询添加变量

CakePHP:在控制器中向查询添加变量,php,sql,cakephp,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 = tag

我有一个使用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将您的查询修改为:

$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
                     );
它将起作用。

将您的查询修改为:

$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
                     );
在php中有一个。。。基本上,单引号不计算变量。。。改用双引号 我认为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注入。。而且需要给角色换上替身。。。这是另一个问题=)

祝你好运

在php中有一个。。。基本上,单引号不计算变量。。。改用双引号 我认为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注入。。而且需要给角色换上替身。。。这是另一个问题=)


祝你好运

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


阅读手册第节。

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


阅读手册,章节。

< P>我至少要考虑如果用户源代码,在标签字符串上使用CaKEPHP消毒功能。请参阅或使用MySQL作为数据库,至少考虑使用或做一些过滤您的用户输入。但最好的办法是使用CAKEPHP ORM的东西。

< P>我至少要考虑如果用户源代码,在你的标签字符串上使用CaKEPHP消毒功能。请参阅或使用MySQL作为数据库,至少考虑使用或做一些过滤您的用户输入。但最好的方法是使用CakePHP orm工具。

如果您想使用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'));

如果要使用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'));

目前,回避SQL注入是不可能的。不过你至少应该注意到这一点,OP似乎并不太关心它。按原样使用代码是不好的。我不需要注意。你已经做到了。(顺便说一句,不是“我的代码”,而是OP的一个更正代码)谢谢,我要防止sql注入,不过谢谢你提出了它。目前避免sql注入是不可能的。不过你至少应该注意一下,OP似乎不太关心它。按原样使用代码是不好的。我不需要注意。你已经做到了。(顺便说一句,不是“我的代码”,而是一个经过修改的OP代码)谢谢,我将保护您不受sql注入的影响,不过谢谢您提出了这一点。我打算留出一些时间学习蛋糕。但主要优势是什么?为什么它们比原始sql查询好得多?主要好处是内置的sql注入保护、与数据源的松散耦合、更好的可移植性、通常改进的可读性和可维护性、支持模型回调和查询缓存。这只是用于读取操作。Cake的ORM并不是世界上最伟大的,但它确实比原始SQL提供了显著的改进。我打算留出一些时间学习蛋糕。但主要优势是什么?为什么它们比原始sql查询好得多?主要好处是内置的sql注入保护、与数据源的松散耦合、更好的可移植性、通常改进的可读性和可维护性、支持模型回调和查询缓存。这只是用于读取操作。Cake的ORM并不是世界上最伟大的,但它确实比原始SQL提供了显著的改进。