删除多个字段失败

时间:2012-10-07 14:16:21

标签: php mysql sql database sql-delete

我希望能够从数据库中删除多个用户,但下面的代码在某些方面失败了。发生的事情是只有最后点击的用户(即数组中的最后一个元素 $ userIds )才会被删除。

我做错了什么?

来自UserModel.php的

public function RemoveUser(Array $userIds) {

    $query = 'DELETE FROM Users WHERE id IN (?)';

    $stmt = $this->m_db->Prepare($query);

    foreach ($userIds as $value) {
        $stmt->bind_param('s', $value);
    }

    $ret = $this->m_db->DeleteUsers($stmt);

    $stmt->Close();

    return $ret;

}
来自Database.php的

public function DeleteUsers(\mysqli_stmt $stmt) {

    if ($stmt === FALSE) {
        throw new \Exception($this->mysqli->error);
    }

    if ($stmt->execute() == FALSE) {
        throw new \Exception($this->mysqli->error);
    }

    if ($stmt->fetch()) {
        return true;
    } else {
        return false;
    }

}

2 个答案:

答案 0 :(得分:3)

正如一些评论所示,您需要为每个用户ID设置?。目前,您正在尝试将每个用户ID绑定到同一个参数,因此只有最后一个实际应用。

$c = Array();
foreach ($userIds AS $u) {
  $c[] = "?";
}
$inPart = "(" . implode(",", $c) . ")";
$query = "DELETE FROM Users WHERE id IN $inPart";

由于bind_param期望每个变量都是一个单独的参数,所以你必须做一些php魔术来一次传递整个数组。您必须将绑定循环更改为:

call_user_func_array(array($stmt, 'bind_param'), array_unshift($userIds, 's'));

这基本上会调用$stmt->bind_param('s', $userIds[0], $userIds[1]....)

答案 1 :(得分:2)

我修改了Dan Simons answer并设法使其正常运行。

此解决方案的一个问题是需要引用 call_user_func_array 中的第二个参数,其中this question是关于的。但是,通过使用函数 makeValuesReferenced 来解决问题。

代码:

public function RemoveUser(Array $userIds) {

    $c = Array();
    $s = '';

    foreach ($userIds AS $u) {
        $c[] = "?";
        $s.= 's'; 
    }

    $inPart = "(" . implode(",", $c) . ")";
    $query = "DELETE FROM Users WHERE id IN $inPart"; 

    $stmt = $this->m_db->Prepare($query);

    array_unshift($userIds, $s);

    call_user_func_array(array($stmt, 'bind_param'), $this->makeValuesReferenced($userIds));

    $ret = $this->m_db->DeleteUsers($stmt);    // Execution and fetching

    $stmt->Close();

    return $ret;

}

public function makeValuesReferenced(Array $arr) {
        $refs = array();

        foreach($arr as $key => $value)
            $refs[$key] = &$arr[$key];
        return $refs;

}