我有一个SELECT
查询,用于检索用户的信息:
网站内部的一些个人数据及其分配的用户角色,可以是多个(在示例中有两个)。
我想检索这些用户角色并将它们添加到$_SESSION
全局变量。
这是查询(在phpMyAdmin中测试它,它按预期工作:检索两行结果,因为用户是相同的,但他有两个角色ROLE1和ROLE2):
$conectar = mysqli_connect(localhost, USER, PASS, DATABASE);
$consulta = "SELECT usuarios.userID, usuarios.userEmail, usuarios.userPass, usuarios.userFechaGeneracion, usuarios.userNombres, rolesUsuarios.nombreRol
FROM rolesUsuarios, usuarios
WHERE usuarios.userEmail='$email'
";
$buscarUsuario = mysqli_query($conectar,$consulta);
if ($buscarUsuario) {
$row = mysqli_fetch_array($buscarUsuario);
[here I have some pass check in place]
$_SESSION['usuario'] = $email;
$_SESSION['nombre'] = $row['userNombres'];
$_SESSION['uid'] = $row['userID'];
$_SESSION['nombreRol'] = $row['nombreRol'];
....
现在,$_SESSION['nombreRol']
是一个字符串。当我打印它时,它只显示ROLE1。
所以我尝试将它转换为数组循环,通过它添加:
$_SESSION['nombreRol'] = array();
for ($i=0; $i < 3; $i++) {
array_push($_SESSION['nombreRol'], $row['nombreRol']);
}
然后杀死了会话并重新开始,尝试将此时间打印为数组:print_r(array_values($_SESSION['nombreRol']));
结果显示:
Array ( [0] => ROLE1 [1] => ROLE1 [2] => ROLE1 )
如何使用数组中的所有角色才能使用它?
在Shrikant Mavlankar的评论之后,我试过了这个:
$rolesAsignados = array();
while($row = mysqli_fetch_array($buscarUsuario)){
array_push($rolesAsignados, $row['nombreRol']);
}
$_SESSION['nombreRol'] = array();
for ($i=0; $i < count($rolesAsignados); $i++) {
array_push($_SESSION['nombreRol'], $rolesAsignados[$i]);
}
然后尝试打印会话数组:
print_r(array_values($_SESSION['nombreRol']));
它显示:
数组([0] =&gt; ROLE2)
答案 0 :(得分:1)
您的WHERE
没有加入。您已在角色表格中的每一行加入一个用户的记录,因此您的结果集会很大,但您只是在阅读第一行。
$consulta = "SELECT usuarios.userID, usuarios.userEmail, usuarios.userPass, usuarios.userFechaGeneracion, usuarios.userNombres, GROUP_CONCAT(rolesUsuarios.nombreRol SEPARATOR '|') AS roles
FROM rolesUsuarios, usuarios
WHERE usuarios.userEmail='$email'
AND rolesUsarios.userID = usarios.userID
GROUP BY usarios.userID
";
然后改变你的作业:
$_SESSION['nombreRol'] = explode('|', $row['roles']);
此外,永远不会将未转义的变量放入您的SQL语句。您应该使用mysqli_real_escape_string()
或mysqli::prepare
来绑定变量。现在没有理由创建SQL注入漏洞。