0

管理者が使用可能な役割(チェックボックス)から選択することにより、特定のユーザーを複数の役割に追加できるようにするために、以下に示すコードがあります。コードはこれを実現するために正常に機能しますが、役割(チェックボックス)が選択されていないユーザーを削除する必要もあります。チェックボックスを使用すると、管理者は選択したロールにユーザーを追加したり、ユーザーを削除したりできます。これは私が理解できない部分です。

誰かが私にこれを案内してくれるなら、それは本当に素晴らしいでしょう。ありがとうございました!

<?php
// declare variables
$msg = '';

// ------------------------------------------------------------------
// UPDATE USER INFO
// ------------------------------------------------------------------
if(isset($_POST['UpdateUser']))
{
    // get user id from query string sent
    $sent_id = mysqli_real_escape_string($conn, $_GET['uid']);
    if(isset($sent_id) && !empty($sent_id) && is_numeric($sent_id) && $sent_id > 0)
    {
        $user_id = $sent_id;

        // ------------------------------------------------------------------
        // ADD CURRENT USER TO SELECTED ROLES
        // ------------------------------------------------------------------
        if(isset($_POST['checked']))
        {
            // get selected role names
            $checked = $_POST['checked'];

            $i1=0;
            $i2=0;
            foreach($checked as $role_name)
            {
                // get role id
                $get_role_id = mysqli_query($conn, "SELECT RoleId FROM roles WHERE RoleName = '$role_name'")
                or die($dataaccess_error.mysqli_error($conn));

                $row = mysqli_fetch_array($get_role_id);
                $role_id = $row['RoleId'];

                // check if user already exist in role
                $check_if_exist = mysqli_query($conn, "SELECT UserId, RoleId, RoleName FROM users_in_roles WHERE UserId = $user_id AND RoleId = $role_id AND RoleName = '$role_name' LIMIT 1")
                or die($dataaccess_error);

                if(mysqli_num_rows($check_if_exist) == 0)
                {
                    // add user to roles
                    $add_user_to_roles = mysqli_query($conn, "INSERT INTO users_in_roles(UserId, RoleId, RoleName) VALUES($user_id, $role_id, '$role_name')")
                    or die($dataaccess_error.mysqli_error($conn));

                    $count1 = $i1++ + 1;
                    $count2 = $i2;
                    $msg = "<div class='msgBox3'>SUCCESS: USER have been ADDED to ($count1) ROLES - AND ALREADY EXISTS in ($count2).</div>";
                }
                elseif(mysqli_num_rows($check_if_exist) == 1)
                {
                    $count1 = $i1;
                    $count2 = $i2++ +1;
                    $msg = "<div class='msgBox4'>NOTE: USER have been ADDED to ($count1) ROLES - AND ALREADY EXISTS in ($count2).</div>";
                }
            }
        }
        else
        {
            $msg = $msg_error2;
        }
    }
}
?>
4

2 に答える 2

0

簡単な解決策は、チェックボックス以外のものを使用することです。チェックボックスをオフにすると値が送信されないためです

または、チェックボックスをオンのままにして、可能な役割値のPHP配列を作成することもできます。現在のループでは、チェックするとこれらの値を削除できます。ループの後、配列にはチェックされていないロールのみが残り、それに応じてそれらを削除できます。

$roles = array('key' => 'Nice Name', 'admin' => 'Administrator');

これは、チェックボックスを出力するだけでなく、役割を管理するためにも使用できます。理想的には、これはデータベーステーブルにあります。

于 2010-11-03T01:59:57.307 に答える
0

送信されたチェックボックスから新しい関係を作成する前に、既存のユーザー/役割関係を削除してください。チェックボックスの値を role_name ではなく role_id に設定すると、単一の MySQL ステートメントにすべてのロールを挿入することもできます。また、テーブルが列users_in_rolesを複製する理由はありません。role_nameこれが私が使用するものです(もちろん単純化された疑似ステートメント):

// New data structure
mysqli_query("DROP TABLE users_in_roles");
mysqli_query("CREATE TABLE users_in_roles ( user_id ..., role_id ....)");

....

// Build SQL fragments for multi-row INSERT.
$a = array();
foreach($checked as $role_id) {
 $a[]= sprintf('(%d, %d)', $user_id, $role_id);
}
// Delete existing user/role relationships for the user.
mysqli_query("DELETE FROM users_in_roles WHERE user_id = $user_id");
// Insert multiple rows in a single statement.
mysqli_query(
 sprintf('INSERT INTO users_in_roles (user_id, role_id) VALUES %s', 
   implode(', ', $a)));

このメソッドは、2 つの SQL ステートメントのみを使用して同じことを実現します。1 つの欠点: 万一、INSERTステートメントの前/実行中にエラーが発生した場合、ロールは割り当てられません。トランザクション内でDELETE実行できます。INSERT

于 2010-11-03T02:18:50.343 に答える