php - Mark checkbox as checked if user has a role

one text

Solution:

Role query is just checking if user has any role so it will return always true (if user has at least 1 role) or always false (if user has no role).

Instead

$new_sql = "SELECT role_id from users_roles, users WHERE users_roles.user_id = '".$row["user_id"]."' GROUP BY users_roles.user_id";

You have to add a filter by role_id.

$new_sql = "SELECT role_id from users_roles, users WHERE users_roles.user_id = '".$row["user_id"]."' AND users_roles.role_id = '" . $a . "' GROUP BY users_roles.user_id";

Note: As sugested in the comments you should use parameterized queries to protect against sql injection attacks. Also you should escape variables before echoing to protect against cross-site scripting (xss) attacks.

Above change should fix your problem but I have some suggestions. Check below.

Suggestion 1: You are assuming that role_id is the same as $count index. If you don't have a sequential id in roles table that starts with 1 or by any chance the result order is changed then code will break.

$roles array needs to track role ID. Subsequent code need to change accordingly.

Assuming column id in roles table:

$records_roles = mysqli_query($connect, "SELECT id, role_name FROM roles");
$roles = array();
$count = 0;

while ($course_roles = mysqli_fetch_assoc($records_roles)){
    // Keep track of roles ID
    $roles[] = [
        'id' => $course_roles['id'],
        'name' => $course_roles['role_name'],
    ];
    
    $count++;
}

Suggestion 2: You are executing a database query to check for each role individually. This affects code performance.

Get all roles of the user in 1 query and then compare role id in the array.

Complete code with 2 suggestions will look like this

<?php
// Display user information on table
$query = "SELECT user_id, first_name, last_name, email FROM users ORDER BY user_id ASC";
$result = mysqli_query($connect, $query);

$records_roles = mysqli_query($connect, "SELECT id, role_name FROM roles");
$roles = array();

while ($course_roles = mysqli_fetch_assoc($records_roles)){
    // Keep track of roles ID
    $roles[] = [
        'id' => $course_roles['id'],
        'name' => $course_roles['role_name'],
    ];
}

while($row = mysqli_fetch_array($result))
{
    echo "
    <tr>
    <td style='display:none'>".$row['user_id']."</td>
    <td>".$row['first_name']."</td>
    <td>".$row['last_name']."</td>
    <td>".$row['email']."</td>
    <td>
    <form method='post'>
    Select user roles<br/>
    <input type='hidden' name='user_id' value=".$row["user_id"].">
    ";

    // Get all user roles
    $new_sql = "SELECT role_id FROM users_roles WHERE user_id = '".$row["user_id"]."' GROUP BY user_id";
    $user_roles_result = mysqli_query($connect, $new_sql);
    $user_roles = [];
    while ($row_user_roles = mysqli_fetch_assoc($user_roles_result)){
        // Put user roles in array
        $user_roles[] = $row_user_roles['role_id'];
    }
    
    foreach ($roles as $role) {
        if (in_array($role['id'], $user_roles)) {
            echo "<input type='checkbox' checked name='techno[]' value='{$role['id']}' />" .$role['name']. "<br>";
        } else {
            echo "<input type='checkbox' name='techno[]' value='{$role['id']}' />" .$role['name']. "<br>";
        }
    }

    echo "
    <button class='btn btn-primary' type='submit' name='checkSubmit' >Submit</button>
    </form>
    </td>
    ";
    
    echo "
    </tr>
    ";
}

Source