2012-10-12 5 views
1

나는 PHP에서 클라이언트가 보낸 배열을 기반으로 데이터베이스를 쿼리하는 다음 코드를 가지고 있습니다.php pdo 바인딩 여러 값 문제

$limit = $_POST['limit']; 
$userArray = json_decode($_POST['arr'], true); 
$queryPlaceholders= implode(',', array_fill(0,count($userArray), '?')); 
$stmt = $db->prepare("SELECT * FROM tableA 
          WHERE tableA.id IN (".$queryPlaceholders.") 
          LIMIT ?"); 
foreach($userArray as $k => $val){ 
    $stmt->bindParam(($k+1), $val); 
} 
$stmt->bindValue(count($userArray) + 1, (int)trim($limit), PDO::PARAM_INT); 
$stmt->execute(); 
$result = $stmt->fetchAll(PDO::FETCH_ASSOC); 
echo $result; 

이 코드에는 오류가 있습니다. 내가 값 11 & (17)를 포함하는 배열을 보낼 경우, 쿼리가 값을 17으로 실행하는 것, 둘 (11) 및 (17)

내가 얻을 print_r($userArray) 경우 Array ( [0] => 11 [1] => 17 )

그래서 PHP는 올바른을 가지고 알고 정렬.

SELECT * FROM tableA 
WHERE tableA.id IN (11,17) 
LIMIT 10 

위의 코드를 실행,이 쿼리를 실행 가리키고 나타나는 그러나, 위의 코드를 사용하여이 쿼리를 실행하고 아래의 쿼리를 실행 다른 답을 얻을 수? 당신이 bindParam()을 사용하고 있는지

SELECT * FROM tableA 
WHERE tableA.id IN (17) 
LIMIT 10 

가 나는 또한 나에게 배열의 두 요소를 알려주는 foreach 루프에서 문을 배치 한 (11 & 17)은 $ stmt를

답변

3

문제에 바인딩되고있다 :

PHP 변수를 문 준비에 사용 된 SQL 문에서 해당 이름이 지정된 물음표 또는 물음표 자리 표시 자에 바인딩합니다. PDOStatement::bindValue()과 달리 변수는 참조로 바인딩되며 PDOStatement::execute()이 호출 될 때만 평가됩니다. 쿼리가 실행될 때 마지막 $val 이후

foreach이 루프가 반복 될 때마다 변경되고 궁극적 각 자리에 대해 동일하다.