首页 > 解决方案 > SQL - 选择用户名 WHERE 角色 = $string

问题描述

我有一个存储用户及其角色的表。用户可以拥有 1 个或多个角色。角色以字符串的形式存储,其中值用逗号分隔,后面有一个空格。

//Get selected roles from user input on a string where values are separated by , and space   

$roles = roleA, roleB; //  --> user selected input        
$query = "SELECT username FROM users WHERE role IN" .$roles;
$query = "SELECT username FROM users WHERE FIND_IN_SET(role, '$roles');

完整代码如下:

<?php
include('dbConnect.php');

$roles = array_map('trim', explode(',',$_POST['role']));
$roles_tests = array_map(function($role) use ($link) {
        $role = $link->real_escape_string($role);
        return "FIND_IN_SET('$role', role)";
    }, $roles);
$query = "SELECT username FROM users WHERE " . implode(' OR ',           $roles_tests);
$results = mysqli_query($link, $query);

if (mysqli_num_rows($results) > 0) {
    echo '<option value="">Please choose</option>';
    while($row = mysqli_fetch_array($results))
    {
        var_dump(mysqli_num_rows($results)); 
        var_dump($row['username']);
        echo '<option value="'.$row['username'].'">'.$row['username'].'</option>';
    }
}else{
    echo '<option value="">Empty</option>'; //display when no data!
}
?>

var转储结果:

var_dump(mysqli_num_rows($results));  --> 1   
var_dump($row['username']);  --> user1  

即使你说 num_rows = 1 仍在 for 循环中,它也将其设为 0 并且下拉列表为空。如果我尝试WHERE手动设置条件,它可以正常工作。

标签: phpmysqlsql

解决方案


您需要将输入拆分为一组角色。然后,您需要使用该列FIND_IN_SET()来测试其中的每一个。role

您还需要在调用之前删除逗号后的空格FIND_IN_SET(),因为它按字面意思对待它们。

所以查询应该是:

$roles = array_map('trim', explode(',', $_POST['role']));
$roles_tests = array_map(function($role) use ($db) {
    $role = $db->real_escape_string($role);
    return "FIND_IN_SET('$role', REPLACE(role, ', ', ','))";
}, $roles);
$query = "SELECT username FROM users WHERE " . implode(' OR ', $roles_tests);

替换$db为您用于保存mysqli数据库连接对象的实际变量。


推荐阅读