我有一个位置数据库,用户可以通过输入和自动完成来选择。在我的CakePHP控制器中,我这样做:
$locations = $this->Location->find('all', array(
'conditions' => array('Location.name like' => '%'.$term.'%'),
'fields' => array('Location.id', 'Location.name', 'Region.name'),
'order' => array(
array('Location.name = "'.mysql_real_escape_string($term).'"'
=> 'desc'),
'Location.name'
),
'limit' => 10,
'recursive' => 1,
));
它工作得非常好,但感觉就像一个黑客,而且我宁愿不自己逃避SQL文字。
需要第一个order by子句,因为完美匹配可能无法使其成为按字母顺序排序的列表的顶部。
我考虑将等同测试移到虚拟领域,但是当$ term是动态的时候,我觉得这不是一个非常优雅的解决方案。
如何以更好的方式实现这一目标?
答案 0 :(得分:0)
就编写查询的结构而言,这很好。
关于必须自己逃避SQL,这是from the Cookbook:
CakePHP已经保护你免受攻击 如果您使用CakePHP的ORM,则使用SQL注入 方法(例如find()和save()) 和正确的数组符号(即。 array('field'=> $ value))而不是 原始SQL。用于对XSS进行消毒 它通常更好地保存原始HTML 在数据库中没有修改和 在当时消毒 输出/显示。