2011-08-23 3 views
3

여러 개의 ID를 보유하는 배열이 있고 여러 열을 업데이트해야합니다. 나는 그것에 대해 IN()을 사용하고있다. 문제는 내가 아래의 쿼리를 사용할 때 완벽하게 잘 작동하는 것입니다. 위의 쿼리와 PDO는 자리 표시 자와 함께 사용될 때 한 행만 업데이트합니다.

public function available($value, $propertyId = array()) { 
    $sth = $this->dbh->prepare('UPDATE properties p SET p.status = :status WHERE p.id IN('.implode(',',$propertyId).')'); 
    $sth->bindParam(':status',$value); 
    return $sth->execute(); 
} 

가 두 번째 인수 $propertyId에 대한 어떤 자리 표시자를 사용하지 않는 내가 그렇게 할 잘못된 방법입니다 가정합니다. 하지만 쿼리에서 명명 된 또는 명명되지 않은 자리 표시자를 사용하면 단 하나의 행만 업데이트됩니다. 예를 들어 아래 코드는 한 행만 업데이트합니다.
//Using Unnamed Place Holder. 
public function available($value, $propertyId = array()) { 
    $sth = $this->dbh->prepare('UPDATE properties p SET p.status = ? WHERE p.id IN(?)'); 
    return $sth->execute(array($value, implode(',', $propertyId))); 
} 

//This will update only one row. 
//Using Named Place Holder 
public function available($value, $propertyId = array()) { 
    $sth = $this->dbh->prepare('UPDATE properties p SET p.status = :status WHERE p.id IN(:propertyId)'); 
    $sth->bindParam(':status',$value); 
    $sth->bindParam(':propertyId', implode(',', $propertyId)); 
    return $sth->execute(); 
} 

아니면 제가

문자열로 배열 변환 아래와 같은 변수에 할당 변환 시도.

public function available($value, $propertyId = array()) { 
    $id = implode(',', $propertyId); 
    $sth = $this->dbh->prepare('UPDATE properties p SET p.status = ? WHERE p.id IN(?)'); 
    return $sth->execute(array($value, $id)); 
} 

심지어 작동하지 않습니다. 무슨 일 이니? 내가 뭘 놓치고 있니?

고마워요.

+2

AFAIK 매개 변수화 된 쿼리는 모든 단일 요소에 자리 표시자가없는 경우 'IN (...)'목록과 함께 사용할 수 없습니다. 'IN (?,?,?,? ...)'. 첫 번째 쿼리는 propertyId가 정수 값만 포함 할 때 사용할 수있는 방법입니다. – Jacob

+1

비슷한 문제에 대한 해결책을 찾을 수 있습니다 http://stackoverflow.com/questions/327274/mysql-prepared-statements-with-a-variable-size-variable-list –

+0

단지 첫 번째 주석을 지원하기 위해'Doctrine' ORM은'PDO'를 사용하고'IN' 질의에 대해'(?,?,?, ....)'를 생성합니다. – J0HN

답변

0

이렇게하면 도움이되기를 바랍니다.

public function available($value, $propertyId = array()) { 
    $id_placeholders = implode(',', array_fill(0, count($propertyId), '?')); 
    $sth = $this->dbh->prepare('UPDATE properties p SET p.status = ? WHERE p.id IN('.$id_placeholders.')'); 
    return $sth->execute(array_merage(array($value), $propertyId)); 
} 
관련 문제