php - 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
手动设置条件,它可以正常工作。
解决方案
您需要将输入拆分为一组角色。然后,您需要使用该列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
数据库连接对象的实际变量。
推荐阅读
- flutter - Flutter Dio 将 MultipartFile 对象动态添加到 Map
- javascript - 如何使用长度和宽度Javascript返回矩形的面积
- kotlin - 使用内联函数 kotlin
- r - 如何对列表中具有相同名称的数据框求和?
- python - Python Pandas 中 DataFrame 中的多索引难以聚合?
- swift - CoreLocation 查看 requestAlwaysAuthorization() 是否触发了弹出窗口
- javascript - 在循环中进行一定数量的 ajax 调用后出错
- reporting-services - 升级到 SendGrid API 密钥后,SSRS(SQL Server 报告服务)订阅邮件未从数据库(报告服务器)发送
- php - 如何制作
- reactjs - 将 CRA v4 应用程序作为 SPA 添加到 WEB 项目时,Visual Studio 2019 React Typescript 出现太多错误