我用不同的代码发布了一个类似的帖子,但更改了它现在有点,没有得到我所希望的答案(答案对我帮助不大)。我希望这是好的,如果不是,告诉我。:)
我一直在尝试为管理员页面设置页面保护,但无法使其正常工作。如果我不是PHP编码的新手,我相信这不会是个问题,呵呵。
当类型为"0"的普通用户试图访问管理员页面index_admin.php时,该用户将被重定向到普通用户页面index.php 这是我一直在努力工作的代码。(此文件在index_admin.php中是必需的,它被称为index_admin_check.php) index_admin_check.php: 部分文本为挪威语 $vert=$host(英文) $brukarnam=$usernamn(英文) $passord=$password(英文) $db_namn=$db_name(英文) $tbl_namn=$tbl_name(英文) $_SESSION['mittbrukarnamn']=$_SESSION['mysername'](英文)<?php
session_start();
?>
<?php
$vert = "localhost";
$brukarnamn = "root";
$passord = "";
$db_namn = "nettsidebunad";
$tbl_namn = "kunde_register";
// Connection to the MySQL database.
mysql_connect("$vert", "$brukarnamn", "$passord") or die ("Kan dessverre ikkje koble til databasen.");
mysql_select_db("$db_namn") or die ("Kan ikkje finna den ynkjande databasen.");
?>
<?php
if (isset($_SESSION['mittbrukarnamn'])) {
$sql1 = "SELECT `type` FROM $tbl_namn";
$rad1 = mysql_query($sql1);
$type1 = mysql_fetch_row($rad1);
if ($type1 == 0) {
echo "You do not have access to this page.";
//header("location: index.php");
} else {
echo "You have access to this page.";
}
}
?>
您的SQL查询正在选择所有行,因为您没有WHERE
子句。因此,当您调用mysql_fetch_row
时,它只获取第一行。
您需要检查当前登录的用户类型
$sql1 = "SELECT `type` FROM $tbl_namn WHERE <user_name> = '$_SESSION[mittbrukarnamn]'";
另一个建议是不要使用MYSQL,而是使用MYSQLi或PDO进行数据库操作,因为MYSQL不再由PHP维护,并且将在PHP 5.5.0中完全弃用。某些MYSQL函数已被弃用。
编辑:您的代码中有另一个问题。mysql_fetch_row
返回一个数组,因此您需要从数组中检索值。
if($type1['type'] == 0)
而不是
if($type1 == 0)
由于我今天似乎回答了很多问题,我在github上有一个管理面板,它似乎回答了许多关于php登录的常见问题。在您的情况下,您只需从数据库中获取type
并使用它。请注意,您必须在SQL中提供WHERE
语句,否则您将无法获得该用户的信息。您将在该表中拥有的每一部分。
下面使用准备好的查询。mysql_*
函数被弃用(不再支持;请参阅此SO问题)
function get_user_array() {
/* Does all of the heavy lifting for getting user stats. */
$db = new db(); // where db() is an abstraction class that implements mysqli and adds login details.
if (isset($_SESSION["id"])) {
$sid = $_SESSION["id"];
if ($query = $db->prepare("SELECT id, name, status FROM `users` WHERE id=?")) {
$query->bind_param("i", $sid); // i = integer
$query->execute();
$query->bind_result($id, $name, $status);
$query->fetch();
$query->close();
$db->close();
return array("name" => $name, "status" => $status, "id" => $id);
} else {
return false;
}
} else {
return false;
}
}
我的建议也是使用用户id,并从数据库中查找所有内容。这样,如果他们的用户名更改,整个网站就不会在页面加载时爆炸。
实际的比较是:
$user = get_user_array();
if (@$user["type"] != 'admin') { // @ error-handling will make it NULL anyway.
header("Location: index.php"); // note: this must be sent BEFORE any output!
}
以及检查正常用户是否登录的快速比较(例如if logged_in()
):
$user = get_user_array();
if (!@$user["id"]) { // continue only if logged in
// not logged in handle
}
注意:db()
就是这个类(从长远来看,覆盖mysqli公共函数以缩短代码是很好的,前提是调用父函数):
class db extends mysqli {
public function __construct($a = DB_HOST,
$b = DB_USER,
$c = DB_PASS,
$d = DB_NAME,
$persistent = true) {
if ($persistent) {
parent::__construct("p:" . $a, $b, $c, $d);
} else {
parent::__construct($a, $b, $c, $d);
}
}
}