2011-01-18 87 views
4

我有一個表單字段,它返回一個逗號分隔的字符串,我想將它傳遞給PHP PDO MySQL查詢IN操作,但IN操作要求這些值由逗號分隔(與我的字符串分隔值的)。將值傳遞給PDO準備語句中的MySQL IN操作?

我該怎麼做?

$values = $_POST['values']; # '10,5,4,3' (string) 
$query = "SELECT * FROM table WHERE id IN (:values)"; 
$data = array(':values' => $values); 

回答

9

您無法在單個佔位符中傳遞多個值。您必須爲每個值輸入一個不同的佔位符,以傳入IN()。由於您不知道會有多少個,請使用?而不是命名參數。

$values = explode(',', $values) ; 

$placeholders = rtrim(str_repeat('?, ', count($values)), ', ') ; 
$query = "SELECT * FROM table WHERE id IN ($placeholders)"; 

$stm = $db->prepare($query) ; 
$stm->execute($values) ; 
+0

+1不錯,我會然而,做到以下幾點:`$值= array_filter(array_map( '微調',爆炸( '',$值) ),'is_numeric');`,你永遠不知道什麼來自用戶輸入... – 2011-01-18 23:02:22

+0

你的語法反轉了'rtrim`:應該是`rtrim(str_repeat('?,',count($ values)), ',');`。但除此之外,這是我一起去的解決方案。謝謝! – neezer 2011-01-18 23:37:37

0

PDO本身不能將數組綁定到:parameter。你需要一個輔助函數。

另外在你的例子中,文字字符串'10,5,4,3'將作爲一個值接收。參數綁定將把它變成.. id IN ('10,5,4,3')而不是列表比較。

你的情況的解決方法是回退使用動態SQL和轉義。

$values = preg_replace('/[^\d,]/', "", $_POST['values']); 
$query = "SELECT * FROM table WHERE id IN ($values)"; 

我個人使用,其具有陣列的特殊語法的包裝/輔助function(但你實際上並沒有一個開始,所以這將是一個雙重的解決方法):

db("SELECT * FROM table WHERE id IN (??)", explode(",",$values)); 
0

關鍵是要認識到,$values是一堆個人的價值觀,並考慮設立查詢與此有關。如果您使用?佔位符而非命名佔位符,則更容易。例如,你可以做類似如下:

$values = explode(',', $_POST['values']); //array(10,5,4,3) 
$placeholder_string = implode(',', array_fill(0, count($values), '?')); // string '?,?,?,?' 
$query = "SELECT * FROM table WHERE id IN ($placeholder_string)"; 

$statement = $db->prepare($query); 
$statement->execute($values);