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));
}
即使這樣也行不通。發生什麼事?我錯過了什麼?
謝謝
如果不指定每個元素都帶有佔位符,則AFAIK參數化查詢不能與列表「IN(...)」一起使用。 'IN(?,?,?,?...)'。當您的第一個查詢是要走的路,當propertyId只包含整數值。 – Jacob
你可以找到類似的問題的解決方案 http://stackoverflow.com/questions/327274/mysql-prepared-statements-with-a-variable-size-variable-list –
只是爲了支持第一條評論,「Doctrine」 ORM使用'PDO'併爲'IN'查詢生成'(?,?,?,....)'。 – J0HN