1

我希望能够从数据库中删除多个用户,但是下面的代码在某些时候会失败。发生的情况是只有最后点击的用户(即数组$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;
    }

}
4

2 回答 2

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]....)

于 2012-10-07T14:32:51.043 回答
2

我修改了Dan Simons 的答案并设法让它发挥作用。

此解决方案的问题之一是需要引用call_user_func_array中的第二个参数,这个问题是关于。然而,通过使用函数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;

}
于 2012-10-07T21:23:14.220 回答