PHP:$ _SESSION作为一个数组不起作用,不让我添加新项目?

时间:2016-07-23 12:54:25

标签: php mysql arrays session

我有一个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)

1 个答案:

答案 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注入漏洞。