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