与占位符一起使用时,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));
}

即使这样也不行。发生了什么?我错过了什么?

谢谢

你可以这样做,希望它有帮助。

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

相关内容

  • 没有找到相关文章

最新更新