2015-07-01 81 views
3

我可以使用以下代碼在PDO準備語句內成功實現IN子句。MYSQL - 具有多個IN子句的PDO

in_array = array(1,2,3); 
$in = str_repeat('?,', count($in_array) - 1) . '?'; 
$sql = "SELECT * FROM my_table WHERE my_value IN ($in)"; 
$stm = $db->prepare($sql); 
$stm->execute($in_array); 
$data = $stm->fetchAll(); 

我該怎麼做多個$ in?例如,我已經失敗嘗試了以下內容:

in_array1 = array(1,2,3); 
$in1 = str_repeat('?,', count($in_array) - 1) . '?'; 
in_array2 = array(4,5,1); 
$in2 = str_repeat('?,', count($in_array) - 1) . '?'; 
$sql = "SELECT * FROM my_table WHERE (my_value1 IN ($in1)) AND (my_value2 IN ($in2))"; 
$stm = $db->prepare($sql); 
$stm->execute($in_array1,$in_array2); 
$data = $stm->fetchAll(); 

我認爲它必須做與STM->執行,但不能肯定,幫助表示讚賞

+2

'執行()'需要** ** 1的參數,這是參數... – Rizier123

回答

3

您當前的查詢出來的

SELECT * FROM my_table WHERE (my_value1 IN (?,?,?)) AND (my_value2 IN (?,?,?)) 

所以你execute使用是不正確,http://php.net/manual/en/pdostatement.execute.php。它應該只傳遞一個包含值的數組。

具有與執行的SQL語句中綁定參數一樣多的元素的值數組。所有值都被視爲PDO :: PARAM_STR。

我想用array_merge,http://php.net/manual/en/function.array-merge.php,將讓你完成你正在嘗試

$stm->execute(array_merge($in_array1,$in_array2)); 

這樣的執行是

$stm->execute(array(1,2,3,4,5,1)); 

相當於這似乎不正確,因爲陣列配對現在已消失,但佔位符1(第一個問號)將映射到1,佔位符4到4,依此類推。

+0

非常感謝你解釋這個給我。老實說,我不明白將數組放在execute()中的目的,但是現在我知道它與現在有意義的佔位符有關!這讓我無法嘗試在for循環中執行查詢,再次感謝! –

+0

做什麼$ in_array1和$ in_array2是一樣的? – Subin

+0

@Subin它應該仍然合併罰款,不是嗎?你能否提出一個問題的例子,還是你有一個懸而未決的問題? – chris85