mysqli_fetch_array返回会话的值,但不变量

时间:2019-06-26 13:12:13

标签: php mysql mysqli

所以我正在用PHP创建一个简单的登录页面。我有2个表,一个表用于Staff(管理员,经理等),一个表用于Customer,两者都有3个共同的栏:用户名,密码,角色。当用户登录时,将在会话中设置角色以将用户重定向到适当的页面。目前,我的代码如下:

function.php

function queryMySQL($query)
{
    global $conn;
    $result = $conn->query($query);
    if(!$result)
    {
        die($conn->error);
    }
    return $result;
}
function  passwordToToken($password)
{
    global $salt1;
    global $salt2;
    $token = hash("ripemd128", "$salt1$password$salt2");
    return $token;
}

login.php

<?php
require_once 'function.php'
$user = $_POST['user'];
$pass = $_POST['pass'];
$token = passwordToToken($pass); //encrypt password
$query = "Select userId, username, password, role 
          from users 
          where username = '$user' 
          and password = '$token' 
        union 
          Select customerId, username, password, role 
          from customer 
          where username = '$user' 
          and password = '$token'";
$result = queryMySQL($query); //function return mysqli_query
if($result->num_rows == 0)
{
    $error = "Username/password is invalid";
    echo $error;
} else {
    session_start();
    $_SESSION['uId'] = mysqli_fetch_array($result)[0];
    $_SESSION['user'] = $user;
    $_SESSION['pass'] = $pass;
    $role = mysqli_fetch_array($result)[3];
    if($role != 'admin' || $role != 'staff' || $role != 'manager')
    {
        $_SESSION['role'] = 'customer';
    } else {
        $_SESSION['role'] = $role;
    }
    echo $role;
}
?>

我的问题是,当用户正确登录时,$role变量为空,但是,如果我回显$_SESSION['uId'],它的确会返回结果(用户ID),即使我更改了{{ 1}}的值传递给mysqli_fetch_array($ result)[3]当回显(用户角色)时,我仍然得到正确的结果。

2 个答案:

答案 0 :(得分:2)

您的问题是您一直在尝试获取更多结果。每次致电mysqli_fetch_array()时,您都要求下一行-但您只希望下一行。

相反,将行分配给变量$row,并在需要列的地方使用它。

此外,我还更改了您的角色检查,以简化操作。您当前的逻辑有点不正确,因为它永远都是客户。

session_start();
$row =  mysqli_fetch_array($result);
$_SESSION['uId'] = $row[0];
$_SESSION['user'] = $user;
$_SESSION['pass'] = $pass;
$role = $row[3];
if (!in_array($role, ['admin', 'staff', 'manager']))
{
    $_SESSION['role'] = 'customer';
} else {
    $_SESSION['role'] = $role;
}
echo $role;

也就是说,您可能可以更改方法,以拥有一个表users和一列以指示其角色。无需单独的表格。

您还应该使用准备好的语句以及正确的密码哈希值。参见How to use password_hashHow can I prevent SQL injection in PHP?

答案 1 :(得分:0)

查询可能只返回一行,并且您两次调用mysqli_fetch_array,因此第二次调用返回null。

顺便说一句不应该是if($role != 'admin' && $role != 'staff' && $role != 'manager')吗?