Postgres,查询错误

时间:2014-09-26 08:25:00

标签: php sql codeigniter postgresql

我做了一个查询,我有语法错误。但对我来说,我做得很好。

哪里有错误?

谢谢!

$str = "Moscow";
$data = $ci->crud_model->query(
    'select * from "Cities" where  "defaultName" ilike  %'.$str.'%'
);

查询是:select * from "Cities" where "defaultName" ilike %Moscow%

3 个答案:

答案 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/