我有一个存储用户及其角色的表。用户可以具有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_dump(mysqli_num_rows($results)); --> 1
var_dump($row['username']); --> user1
即使您说num_rows = 1仍在for循环上,它仍将其设为0,并且下拉列表为空。如果我尝试手动将条件放在WHERE
上,则效果很好。
答案 0 :(得分:1)
您需要将输入分成多个角色数组。然后,您需要使用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
数据库连接对象的实际变量。
答案 1 :(得分:0)
您必须使用:
$query = "SELECT username FROM users WHERE role IN (" .$roles. ")";
注意IN和“之间以及()括号之间的空格