PDO обновляет только одну строку при использовании с заполнителями - PullRequest
3 голосов
/ 23 августа 2011

У меня есть массив, который содержит несколько идентификаторов, и мне нужно обновить несколько столбцов.Я использую 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 голосов
/ 23 августа 2011

Вы можете сделать что-то подобное, если бы это помогло.

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));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...