我做了一个查询,我有语法错误。但对我来说,我做得很好。
哪里有错误?
谢谢!
$str = "Moscow";
$data = $ci->crud_model->query(
'select * from "Cities" where "defaultName" ilike %'.$str.'%'
);
查询是:select * from "Cities" where "defaultName" ilike %Moscow%
答案 0 :(得分:3)
LIKE
/ ILIKE
运算符将两个字符串作为其参数。也就是说,模式必须是带引号的字符串,而不仅仅是直接在SQL查询中。
所以而不是:
"defaultName" ilike %Moscow%
你需要:
"defaultName" ilike '%Moscow%'
在PHP中,您应该(至少)转义输入以避免SQL注入。可能CodeIgniter有转发或使用参数化查询的工具,但至少你应该这样做:
$str = "Moscow";
$data = $ci->crud_model->query(
'select * from "Cities" where "defaultName" ilike \'%'.pg_escape_string($str).'%\''
);
编辑根据Craig Ringer的评论,使用CodeIgniter逃避或构建安全查询的正确方法是covered in this answer。
这可能是最简单的(请注意,查询参数自动为字符串,不需要额外的引号):
$str = "Moscow";
$data = $ci->crud_model->query(
'select * from "Cities" where "defaultName" ilike ?',
array('%' . $str . '%')
);
答案 1 :(得分:1)
你需要用引号括起%moscow%:
从“城市”中选择*,其中“defaultName”ilike'%Moscow%'
答案 2 :(得分:-1)
可以使用关键字ILIKE而不是LIKE来根据活动区域设置使匹配不区分大小写。这不是SQL标准。 用它代替ilike
$str = "Moscow";
$data = $ci->crud_model->query('select * from Cities where defaultName LIKE %$str%');
然后你的查询将是
select * from Cities where defaultName LIKE '%Moscow%';
对于ILIKE: 示例 -
SELECT first_name,last_name FROM customer WHERE first_name ILIKE 'BAR%';
这里它会按照这个条件返回行:
BAR%模式匹配任何以BAR,Bar,BaR等开头的字符串。如果使用LIKE运算符,查询将不返回任何行。 参考:http://www.postgresqltutorial.com/postgresql-like/