CakePHP:在控制器中向查询添加变量
我有一个使用sql查询的控制器操作: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
$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提供了显著的改进。