使用带有Zend的IN运算符的`update statement`不正确

时间:2011-10-29 10:21:43

标签: zend-framework zend-db

我有一个想要执行如下语句的函数:

UPDATE coupon_users SET status = status | '1' WHERE id IN ('3','4')

coupon_users模型中,我写了一个类似下面的方法:

/**
* @param array $ids        #array(3,4)
* @param array $status     #1
*/
public function updateStatus(array $ids, $status)
{
    $result = $this->_db->query(
        "UPDATE {$this->_name} SET status = status | ? WHERE id IN (?)",
        array(
            $status,
            $ids
        )
    )->execute();
    return $result;
}

但查询总是:

UPDATE coupon_users SET status = status | '1' WHERE id IN ('Array')

我不知道我在这里错了什么,请帮助我,非常感谢。

4 个答案:

答案 0 :(得分:4)

根据PDO documentation(Zend_Db使用PDO作为其DB访问后端):

  

您无法将多个值绑定到for中的单个命名参数   例如,SQL语句的IN()子句。

因此,您可能需要进一步准备查询,以便它包含与数组中元素一样多的标记。可能的解决方案如下:

// Compose the query
$queryToExecute = "UPDATE {$this->_name} SET status = status | ? WHERE id IN (";
$questionMarks = array();
for ($id in $ids) {
    $questionMarks[] = '?';
}
$queryToExecute .= implode(',', $questionMarks);
$queryToExecute .= ')';

// $queryToExecute should have the format "UPDATE ... WHERE id IN (?,?,?,...?)"

// Execute it
$result = $this->_db->query(
    $queryToExecute,
    array($status, $ids)
)->execute();

希望有所帮助,

答案 1 :(得分:1)

尝试:

public function updateStatus(array $ids, $status)
{
    $result = $this->_db->query(
        "UPDATE {$this->_name} SET status = ? WHERE id IN (?)",
        array(
            $status,
            implode(',',$ids)
        )
    )->execute();
    return $result;
}

更新

你试过吗?:

$this->_db->update($this->_name, array('status'=>$status), array('id IN (?)'=>$ids));

我还没有测试过,它还取决于$ this-> _db是

的实例

http://framework.zend.com/manual/en/zend.db.adapter.html#zend.db.adapter.write.update

答案 2 :(得分:1)

试试这个..

public function updateStatus(array $ids, $status)
{
    $inarray=   implode(',',$ids);
    $result = $this->_db->query(
        "UPDATE {$this->_name} SET status = status | ? WHERE id IN (?)",
        array(
            $status, 
            $inarray
        )
    )->execute();
    return $result;
}

答案 3 :(得分:0)

它对我来说很好。

     $existingImagesIds = array(1, 2, 3, 7);

     $where = $pImgModel->getAdapter()->quoteInto("id in (?) ", $existingImagesIds);

     $pImgModel->update(array('status' => '0'), $where);