2014-02-13 89 views
1

PHP PDO製備IN()數組語句從<a href="http://www.php.net/manual/en/pdo.prepare.php" rel="nofollow">the PHP Manual</a>

無法多個值綁定到單個命名參數,例如,SQL語句的IN()子句。

但是,你可以使用多個值使用問號參數標記嗎?或者每次數值的數量發生變化時,您是否需要prepare()一個新的聲明?

SELECT * FROM `table` WHERE `column` IN(?) 

如果這是允許的,你如何使它工作?

編輯:前面提到的兩個問題都是關於命名爲的變量,這些手冊說的不能綁定到多個參數上。我問的是問號(匿名)變量。

+2

這是經常被問到的。 [這是一個](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) –

+0

從多個值中創建一個字符串並將其綁定 –

+0

通常,您需要創建多個'?,?,?,?,? '因爲你有數組元素。 –

回答

1

下面是一些代碼,我刮起來模擬期望的結果:

<?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魔術的好處,但它迄今爲止效果很好。

+0

雖然這個想法是非常正確的,但代碼充滿了魔法和沉默的考慮。另外,你無論如何都不能使用* real * prepare,意味着每當值的數量發生變化時,你仍然需要準備()一個新的語句 - 所以目標還沒有達到。 –

+0

但是,您正朝着正確的方向前進。實施自己的佔位符是唯一適當的解決方案。 –

+0

我認爲我的解決方案比其他人更好,你必須自己以正確的順序構建數組。儘管查詢需要「準備好」兩次,但如果它本身支持,它的工作方式與我期望的方式相同。 –

相關問題