2014-09-26 114 views
0

我做一个查询,我有语法错误。但对我而言,我做得很好。Postgres,与查询错误

我在哪里有错误?

谢谢!

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

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

+0

'ilike'?它是一个更像人格化的SQL'like'版本吗? – CodeNewbie 2014-09-26 08:30:12

+1

@CodeNewbie:只有PostGreSql提供关键字ILIKE可以用来代替LIKE根据活动语言环境使匹配不区分大小写。 – Naincy 2014-09-26 08:46:38

+0

你是什么意思? – 2014-09-26 08:50:47

回答

3

LIKE/ILIKE运营商需要两个字符串作为它的参数。也就是说,该模式必须是一个带引号的字符串,而不只是直接在SQL查询中。

所以不是:

"defaultName" ilike %Moscow% 

您需要:

"defaultName" ilike '%Moscow%' 

在PHP中,你应该是(至少是)逃逸的输入,以避免SQL注入。或许笨有逃逸,或使用参数化查询的功能,但最起码​​,你应该这样做:

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

编辑每克雷格·林格评论,正确的方法去逃避或建立安全的查询使用CodeIgniter是covered in this answer

这可能是最简单的(注意查询参数自动为一个字符串,并且不需要额外的引号):

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

谢谢这对我有用! – 2014-09-26 09:03:16

-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%模式匹配任何字符串开头的机智h BAR,Bar,BaR等。如果使用LIKE运算符,则查询不会返回任何行。 参考:http://www.postgresqltutorial.com/postgresql-like/

+0

它不适用于我:( – 2014-09-26 08:34:48

+0

你看到了什么...? 你在数据库中运行该查询,它显示什么错? – Naincy 2014-09-26 08:35:18

+0

错误:语法错误处于或接近“%” LINE 1:select *从 “城市”,其中 “defaultName中” LIKE%莫斯科% – 2014-09-26 08:37:34

1

您需要环绕%莫斯科%引号:

select * from "Cities" where "defaultName" ilike' %Moscow%'

+0

感谢编辑您的帖子对我来说是非常有帮助的 我的解决办法是\t \t \t'$数据= $ CI-> crud_model- >查询(“select * from \”Cities \“where \”defaultName \“ilike'%$ str%'”);' – 2014-09-26 09:01:20