PHP:$_SESSION 作为数组不起作用,不允许我添加新项目?

标签 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']);
}

然后终止 session 并再次开始,这次尝试将其打印为数组: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]);
                }

然后尝试打印 session 数组:

print_r(array_values($_SESSION['nombreRol']));

它显示:

Array ( [0] => ROLE2 )

最佳答案

您的 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 来绑定(bind)变量。现在没有任何借口可以创建 SQL 注入(inject)缺陷。

关于PHP:$_SESSION 作为数组不起作用,不允许我添加新项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38542024/

相关文章:

php - 合并两个 mysql 结果

javascript - 如何在javascript中获取php echo结果

mysql - 将 node.js 中的 mysql 模块用于大表

android - 尝试访问从 Assets 到数据\数据\的复制数据库中的 DatabaseHelper 时出现空指针异常

java - Spring Boot - spring.jpa.hibernate - 如何使用 sudo 调用?

javascript - 每个字母一次大写

php - PHP MySQL 错误

php - MySQL - 使用可变日期格式和自定义字段按日期查询

arrays - 如何将数组放在 POE 堆上并推送或弹出数据?

C中无法分配内存