,所以我在PHP中制作了一个简单的登录页面。我有2个表,一张桌子(管理员,经理等(,一张适用于客户,都有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(,即使我将 $_SESSION['uId']
值更改为mysqli_fetch_array($ result(($ result([3]当回声(用户角色(时,我仍然会得到正确的结果。
您的问题是您一直在尝试获取更多结果。每次打电话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
,并指示它们的角色。无需单独的表。
您还应使用准备好的语句,并适当地使用密码。查看如何使用password_hash,以及如何防止PHP中的SQL注入?
可能只有一排从查询返回,您正在调用mysqli_fetch_array
两次,因此第二个呼叫返回null。
btw不应该是 if($role != 'admin' && $role != 'staff' && $role != 'manager')
?