無法多個值綁定到單個命名參數,例如,SQL語句的IN()子句。
但是,你可以使用多個值使用問號參數標記嗎?或者每次數值的數量發生變化時,您是否需要prepare()
一個新的聲明?
SELECT * FROM `table` WHERE `column` IN(?)
如果這是允許的,你如何使它工作?
編輯:前面提到的兩個問題都是關於命名爲的變量,這些手冊說的不能綁定到多個參數上。我問的是問號(匿名)變量。
無法多個值綁定到單個命名參數,例如,SQL語句的IN()子句。
但是,你可以使用多個值使用問號參數標記嗎?或者每次數值的數量發生變化時,您是否需要prepare()
一個新的聲明?
SELECT * FROM `table` WHERE `column` IN(?)
如果這是允許的,你如何使它工作?
編輯:前面提到的兩個問題都是關於命名爲的變量,這些手冊說的不能綁定到多個參數上。我問的是問號(匿名)變量。
下面是一些代碼,我刮起來模擬期望的結果:
<?php
function preprepare(&$query, &$data) {
preg_match_all('/\?/', $query, $matches, PREG_OFFSET_CAPTURE);
$num = count($matches[0]);
for ($i = $num; $i;) {
--$i;
if (array_key_exists($i, $data) && is_array($data[$i])) {
$query = substr_replace($query, implode(',', array_fill(0, count($data[$i]), '?')), $matches[0][$i][1], strlen($matches[0][$i][0]));
array_splice($data, $i, 1, $data[$i]);
}
}
}
$query = 'SELECT * FROM `table` WHERE `col1` = ? AND `col2` IN(?) AND `col3` = ? AND `col4` IN(?)';
$data = array('foo', array(1, 2, 3), 'bar', array(4, 2));
preprepare($query, $data);
var_dump($query, $data);
?>
它輸出:
array (size=2)
0 => string 'SELECT * FROM `table` WHERE `col1` = ? AND `col2` IN(?,?,?) AND `col3` = ? AND `col4` IN(?,?)' (length=93)
1 =>
array (size=7)
0 => string 'foo' (length=3)
1 => int 1
2 => int 2
3 => int 3
4 => string 'bar' (length=3)
5 => int 4
6 => int 2
查詢和數據可以在正常的PDO使用準備好的語句。我不知道它是否能夠解釋所有PDO魔術的好處,但它迄今爲止效果很好。
雖然這個想法是非常正確的,但代碼充滿了魔法和沉默的考慮。另外,你無論如何都不能使用* real * prepare,意味着每當值的數量發生變化時,你仍然需要準備()一個新的語句 - 所以目標還沒有達到。 –
但是,您正朝着正確的方向前進。實施自己的佔位符是唯一適當的解決方案。 –
我認爲我的解決方案比其他人更好,你必須自己以正確的順序構建數組。儘管查詢需要「準備好」兩次,但如果它本身支持,它的工作方式與我期望的方式相同。 –
這是經常被問到的。 [這是一個](http://stackoverflow.com/questions/920353/php-pdo-can-i-bind-an-array-to-an-in-condition)[和這裏是另一個](http:// stackoverflow .com/questions/14767530/php-using-pdo-with-in-clause-array) –
從多個值中創建一個字符串並將其綁定 –
通常,您需要創建多個'?,?,?,?,? '因爲你有數組元素。 –