我有一个只有管理员点击链接后才能访问的页面。如果登录用户是标准用户,则他们应该无法访问该页面。但是,当标准用户尝试访问管理页面时,他们可以访问该页面。
我很欣赏一双第二只眼睛,看看他们是否能够发现代码的任何错误,这将使功能按预期工作。
由于
<?php
if(check_login() && isAdmin()) {
echo 'welcome administrator';
} else {
header('Location: login.php');
exit;
}
function isAdmin() {
$conn = mysqli_connect("localhost", "root", "dbpass", "dbname") or die ('Could not connect to database!');
$sql = "SELECT * FROM `usertable` WHERE userID ='" . $_SESSION['sess_uid'] . "'";
$mainaccess = $conn->query($sql);
print_r($mainaccess);
if(!$mainaccess){
echo $conn->error;
}
if ($mainaccess -> userLevel == 0) {
return true;
} else {
return false;
}
}
function check_login () {
if(isset($_SESSION['sess_uid']) && $_SESSION['sess_uid'] != '') {
return true;
} else {
false;
return;
}
}
?>
答案 0 :(得分:1)
问题是您正在从数据库中选择他们已经拥有管理员权限的用户,即
SELECT `userID` FROM `usertable` WHERE `userLevel` = 0
所以你总是以管理员身份向所有人展示。需要更改查询以具体检查登录用户是否为管理员。所以将查询更改为类似的内容
$sql = "SELECT * FROM `usertable` WHERE userID = $_SESSION['sess_uid']";
其中$_SESSION['sess_uid']
是userID
我们必须删除userLevel
检查,因为这在选择用户时无关紧要,我们还必须从SELECT userID
更改为SELECT *
,就像您只选择userID
,您的数组和行
userLevel
$mainaccess -> 'userLevel' == 0
不行。通过选择所有内容,您可以确保可以访问所有属性,即
$mainaccess -> 'userLevel'
$mainaccess -> 'userID'
<强>更新强>
访问表数据的正确方法是使用
对象(这是您将使用的方法)
$mainaccess -> 'userLevel'// Incorrect
$mainaccess->userLevel //correct
阵列
$mainaccess -> 'userLevel'// Incorrect
$mainaccess['userLevel'] //correct
请更改此行
您的查询也不正确请使用此代码块,因为您的SQL查询没有提取正确的信息。
function isAdmin()
{
$conn = mysqli_connect("localhost", "root", "dbpass", "dbname") or die ('Could not connect to database!');
$sql = "SELECT * FROM `usertable` WHERE userID = $_SESSION['sess_uid']";
if($result = $mainaccess = $conn->query($sql))
{
while($obj = $result->fetch_object())
{
$user = $obj;
}
}
if ($user->userLevel == 0)
{
return true;
}
else
{
return false;
}
}
答案 1 :(得分:0)
你真的需要这样的东西:
function isAdmin() {
$conn = mysqli_connect("localhost", "root", "dbpass", "dbname") or die ('Could not connect to database!');
$sql = "SELECT `userID` FROM `usertable` WHERE `userLevel` = 0 AND userID ='" . $_SESSION['sess_uid'] . "'";
正如我在评论中所说,您正在寻找具有管理员权限的任何人,但您真的想知道该用户是否具有管理员权限,因此您必须验证您试图找出的用户具有访问权限。我只是将代码放在上面,认为你将userID存储在会话中(根据你以后的代码),但你可能需要更改这个
答案 2 :(得分:0)
你的做法是错误的。该链接应仅显示为登录管理员。
尝试类似此测试代码的内容。
<?php
session_start();
$_SESSION['admin'] = 0;//set only by logging in
$html ="Test<br>";//page html
if ($_SESSION['admin']== 0) {
$html .="<a href=\"adminpage.php\" >Admin</a>";
}
echo $html;
?>
根据您的要求进行修改。