2013-08-05 71 views
0

我正在使用一個應用程序,它需要對數據庫執行where查詢以返回具有「t1.address_city」(數據庫中的一列)的行等於數組中的任何位置。我知道我應該使用implode()將它變成一個大字符串,但這不會返回任何行 - 大概是因爲它正在尋找與大字符串匹配的行(當然這不僅僅是一個城市,它是一個列表)。代碼:使用帶有長字符串的MySQL「in」子句

$_GET["places"]包含這樣的事情:

["madrid", "lisbon", "london", "paris", "new york"]

當數組名,$地方,放入WHERE子句像IN ('$places'),我沒有得到任何行。按照這裏的其他類似問題的建議,我將陣列擊碎,使其看起來像"madrid, lisbon, london, paris, new york",然後使用像IN ('$implodedplaces')這樣的內部變量,但如前所述,它找不到任何行。

我發現輸入每個地名的引號(IN ('madrid','lisbon','london'))單獨工作完美,但當然我需要IN子句使用$_GET["places"],因爲這是由用戶操縱的。有沒有辦法在$_GET["places"]中輸入所有的值作爲逗號分隔的字符串?

任何幫助表示讚賞 - 如果我的解釋不是很好,請隨時提問。

+1

聽起來像所有你想做的事情是把所有嵌入的單引號字符加倍,用雙引號代替單引號,並丟棄方括號? –

+0

Mysql也接受IN(「madrid」,「lisbon」,「london」),所以你只需要刪除那些方括號。 –

+0

它不只是方括號......它是一個數組。 –

回答

-1

嘗試

$implodedplaces = implode("','", $places); 

請注意,這並不逃避,可能是在$地方的任何報價。

如果$ _GET [「地方」]是一個字符串,你可以嘗試:

$implodedplaces = str_replace('"', "'", str_replace('[',"'", str_replace(']',"'",$_GET["places"]))); 

這確實有這樣的假設但是,你不會找到你的地名報價和括號。

+0

結合使用WHERE't1.address_city IN('「。$ places。''))」)',這個工作非常完美,我沒有經常使用內爆/爆炸,所以它沒有穿過我的腦海 - doh! – jbirch

+0

由於它無法解決SQL注入問題,所以我低估了這個問題 – Halcyon

0

你需要記住,你需要做的轉義:

$in = []; 
foreach ($_GET["places"] as $place) { 
    $in[] = mysql*_real_escape_string($place); 
} 
$in = '"' . implode('", "', $in) . '"'; 
$query = "select * from t where f IN (" . $in . ")"; 

此外,您需要檢查count($_GET["places"]),因爲如果它是空的,你的查詢將有IN()這是一個語法錯誤。

+0

請注意在MYSQL中使用雙引號括住字符串,如果它在ANSI模式下,雙引號用於引用列名和表名 – noz

+0

不知道爲什麼這不起作用我因爲它有點類似於上面的解決方案,但它給了我一個服務器錯誤。我正在使用別人的服務器,因此我無法訪問錯誤日誌以查明是否是我所做的事情,但我會嘗試找出答案。謝謝你的幫助,感謝Frits。 – jbirch

+0

你需要用任何適用的函數替換mysql * _real_escape_string'。像'mysqli_real_escape_string'一樣,如果你使用'mysqli'。 – Halcyon

0

小心在,在大多數情況下,它需要全表掃描,這殺死了MySQL的性能..

您應該檢查與解釋它看到它的查詢。

+0

如果您使用'IN'如'a IN(「b」,「c」,「d」)作爲:'a =「b」或a =「c」或a =「d」' – Halcyon

+0

您在IN子句中傳遞的參數越高,mysql優化器將從範圍掃描切換到全表掃描。因爲你的查詢不太具有選擇性 –