2014-02-13 3 views
1

the PHP Manual에서() 배열의 문을 준비 : 당신은, 예를 들어, 단일 명명 된 매개 변수에 SQL 문의 IN() 절을 여러 값을 바인딩 할 수 없습니다PHP PDO는

.

그러나 물음표 매개 변수 표시 문자를 사용하여 여러 값을 사용할 수 있습니까? 또는 값 수가 변경 될 때마다 에 새 명세서가 있어야합니까?

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-pause-with-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 마술 niceness를 설명하는지 모르지만 그것은 지금까지 꽤 잘 작동합니다.

+0

아이디어가 옳았지 만 코드는 마법과 침묵의 고려 사항으로 가득차 있습니다. 또한 어쨌든 * 실제 * 준비를 사용할 수 없으므로 값의 수가 변경 될 때마다 새로운 명령문을 준비해야합니다. 따라서 목표에 아직 도달하지 못했습니다. –

+0

그러나 올바른 방향으로 이동하고 있습니다. 자신 만의 자리 표시자를 구현하는 것이 유일한 해결책입니다. –

+0

나는 내 솔루션이 당신이 올바른 순서로 배열을 직접 만들어야하는 다른 것들보다 약간 더 멋지다고 생각했습니다. 질의는 "준비"되어 있어야하지만 기본적으로 지원되는 경우 기대할 수있는 방식으로 작동합니다. –