2011-08-23 84 views
3

我有一個數組,其中包含多個ID,我需要更新多個列。我正在使用MySQL 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我認爲這種做法是錯誤的方式這樣做。但是當我在查詢中使用命名或未命名的佔位符時,它將只更新1行。例如下面的代碼只更新一行。

//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(); 
} 

或者

//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))); 
} 

我試圖轉換數組轉換爲字符串,並像下面分配給變量。

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)); 
}