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 を同じパラメーターにバインドしようとしているため、実際には最後の 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

私はDanSimonsの回答を変更し、これを機能させることができました。

このソリューションの問題の1つは、call_user_func_arrayの2番目のパラメーターを参照する必要があることです。この質問については、についてです。ただし、この問題は、関数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 に答える