2014-09-26 127 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