2016-03-03 70 views
1

我已經習慣了做這樣的事情對我的詢問下:在MySQL在PHP條款參數,Python的

$array = array(123,456,10,57,1024,768); //random data 
$sql = "select * from table where field in(".implode(',',$array).")"; 
mysql_query($sql); 

這一切正常,並且是快速即使陣列可以有1000名以上的項目搜索(實際上針對不存在的表的聯合)。 對我來說,這非常有用,因爲我將來自多個來源的數據連接在一起。

但是,我知道它有點不安全 - 如果我沒有正確地逃脫我的傳入數據,SQL注入是可能的。

我想嘗試弄清楚這個參數化的等價物;一些使用更多「硬化」代碼來完成那種「數組入」的方法。

它可能不可能直接做到這一點,它可能需要一個輔助函數來做替換。如果是這樣,我正在尋找一個好的我可以放入我的代碼,希望能讓我只是傳遞一個數組作爲參數。

雖然我的例子是針對PHP的,但我也需要爲Python計算出來,因爲我在那裏做同樣的事情。

我在這裏看過一些類似的問題,但沒有看到任何(好的)答案。

+0

通過使用PDO,您可以輕鬆擴展'PDOStatement'並添加一個方法來爲IN子句構建您的SQL字符串。顯示在Barmar的回答中。 – Xorifelse

回答

5

使用PDO準備語句:

$placeholders = str_repeat('?, ', count($array)-1) . '?'; 
$stmt = $pdo->prepare("SELECT * FROM table WHERE field IN ($placeholders)"); 
$stmt->execute($array); 

$placeholders將包含?, ?, ?佔位符的序列,與同樣數量的?作爲數組的大小。然後當您執行該語句時,數組值被綁定到佔位符。

0

我親自完成的:

$in = substr(str_repeat('?,', count($array)), 0, -1); 

$sql = "SELECT * FROM table WHERE field IN ($in)"; 

這將爲您提供?,每個數組元素,並刪除後面的逗號。