所以我正在用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]当回显(用户角色)时,我仍然得到正确的结果。
答案 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_hash和How can I prevent SQL injection in PHP?
答案 1 :(得分:0)
查询可能只返回一行,并且您两次调用mysqli_fetch_array
,因此第二次调用返回null。
顺便说一句不应该是if($role != 'admin' && $role != 'staff' && $role != 'manager')
吗?