与占位符一起使用时,PDO仅更新一行

时间:2011-08-23 07:48:52

标签: php mysql pdo

我有一个包含多个ID的数组,我需要更新多个列。我正在使用MySQL IN()。问题是,当我使用下面的查询时,它完全正常。

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

即使这样也行不通。怎么了?我错过了什么?

谢谢

1 个答案:

答案 0 :(得分: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));
}