在PHP中检查用户是否为管理员
我对php还比较陌生,我正在尝试做我的学校作业,但老师只是说“谷歌”,我真的找不到适合我的asnwer 这是我的login.php(请原谅其中的瑞典语注释,这些是给我的老师的)在PHP中检查用户是否为管理员,php,mysql,admin,Php,Mysql,Admin,我对php还比较陌生,我正在尝试做我的学校作业,但老师只是说“谷歌”,我真的找不到适合我的asnwer 这是我的login.php(请原谅其中的瑞典语注释,这些是给我的老师的) 以下是登录后访问的页面(受保护页面) 登录! ASDSDFSDF 我不明白这段代码怎么会不起作用/ <?php $sql = "SELECT admin FROM `user` WHERE username='$_SESSION['username']'"; $result
以下是登录后访问的页面(受保护页面)
登录!
ASDSDFSDF
我不明白这段代码怎么会不起作用/
<?php
$sql = "SELECT admin FROM `user` WHERE username='$_SESSION['username']'";
$result = mysql_query($sql);
$admin = mysql_fetch_array($result);
$_SESSION['admin'] = $admin['admin'];
if ($_SESSION['admin']) == 1 {
echo "You are an Admin!";
}else{
echo "You are a normal user";
}
尝试以下代码:
$sql = "SELECT admin FROM user WHERE username='".$_SESSION['username']."'"; // username='".$_SESSION['username']."'" instead username='$_SESSION['username']'";
$result = mysql_query($sql);
$admin = mysql_fetch_array($result);
$_SESSION['admin'] = $admin['admin'];
if ($_SESSION['admin'] == 1) { // Be carefull you had if($_SESSION['admin']) == 1 { leaving "1" outside of the if
echo "You are an Admin!";
}else{
echo "You are a normal user";
}
$sql = "SELECT admin FROM `user` WHERE username='$_SESSION['username']'";
注意:告诉你的老师,是时候让她停止教授mysql,转而教授mysqli或PDO了不要担心mysqli和其他注释,这段代码只适用于学习目的。下面逐行解释:
$sql = "SELECT admin FROM `user` WHERE username='$_SESSION['username']'";
$result = mysql_query($sql);
对用户名存储在会话['username']中的用户执行sql查询搜索。它不获取所有列,只获取admin列,该列表示用户是admin还是不是
$admin = mysql_fetch_array($result);
这只是将sql结果加载到数组中。如果找到具有存储用户名的用户,它将只是一个带有一个布尔变量的数组:1或0
$_SESSION['admin'] = $admin['admin'];
将布尔变量存储到会话中
if ($_SESSION['admin']) == 1 {
echo "You are an Admin!";
}else{
echo "You are a normal user";
}
打印操作的结果
然而,有几个警告。例如,如果用户名不存在会发生什么情况。如果您收到一些错误,请尝试打印所有内容并发送错误消息。请再次检查此代码:
$sql = "SELECT admin FROM user WHERE username='".$_SESSION['username']."'"; // username='".$_SESSION['username']."'" instead username='$_SESSION['username']'";
$result = mysql_query($sql);
$admin = mysql_fetch_array($result);
$_SESSION['admin'] = $admin['admin'];
if ($_SESSION['admin'] == 1) { // Be carefull you had if($_SESSION['admin']) == 1 { leaving "1" outside of the if
echo "You are an Admin!";
}else{
echo "You are a normal user";
}
$sql = "SELECT admin FROM `user` WHERE username='$_SESSION['username']'";
这里可能有两个错误:
您不能在“”中插入$_会话李>
在引号中,“$”会话['username']”应更改为“$”会话[username]”李>
概括地说,您可以使用以下方法:
$sql = "SELECT admin FROM `user` WHERE username='".$_SESSION['username']."'";
通过这种方式,您可以保留带有引号的原始SQL方法:
WHERE username='xxx'
您的代码不安全,因为:
- 您可以被注入(mySql注入)
- 您的密码存储为纯文本
此外,我建议您使用模式
login.php:
<?php
session_start();
require("functions.php"); // file with your functions
if ($_SESSION["logged"]) // if already logged, redirect to admin page
header("Location: ./admin.php");
else
{
if ($_SERVER["REQUEST_METHOD"] == "POST")
{
// logIn function in "functions.php" file, returns true if correctly logged
$login = logIn($_POST["user"], $_POST["password"]);
if ($login === true)
{
$_SESSION["logged"] = true;
header("Location: ./admin.php");
}
else
{
// login failed, show error page
$error = $login;
// html code for header
require("templates/header.php");
// html code for body that will display $error
require("templates/error_page.php");
// html code for last part of the page
require("templates/footer.php");
}
}
else
{
// No POST request, so the user must fill the form yet
require("templates/header.php");
// Contains html code for login form
require("templates/login_form.php");
require("templates/footer.php");
}
}
?>
现在给我们错误信息,这是一件非常危险的事情,原因有几个。此外,我认为上一个查询不起作用,因为$\u会话['username']没有被正确解析。除此之外,您的代码中没有安全的查询,您正在执行的每个查询都可以被注入,这不是一个好的实践,我建议您在执行任何mysql查询时,使用官方文档中建议的准备好的语句迁移并开始使用mysqli_*或PDO,您应该停止使用mysql函数,因为它已被弃用,应该使用PDO/mysqli。您还必须在数据库+连接脚本中散列用户密码,如前所述:使用PDO/MySQLi。如果用户是会话中的管理员,也不要保存bool,但要在每个页面上再次检查它!在会话中仅保存当前登录的用户ID!您应该处理您的代码格式-这不容易阅读,不起作用:/。哈哈^老师什么都没教我们。他给我们分配任务,每次我们有问题的时候,他都会说“googleit”,然后用代码,在$admin=mysql\u fetch\u object($result)之后给我发送一个var\u dump($会话)和var\u dump($admin);它只是给了我一个白色的屏幕,什么都没有,一旦你给我一个你的网站压缩到tiagorjogos@gmail.com?@TiagoRibeiro我真的不知道。这可能是一个关于现代社会努力强迫每个人学习一些东西的长期讨论(好像我们自己无法学习任何东西)。我的观点是,如果每个成年人都死了,婴儿会重新发明火。还有其他的。哦,不用担心。尝试此代码并发布它打印出的内容:var\u dump($\u会话)$sql=“从user
中选择admin,其中username='$\u会话['username']'”$result=mysql\u查询($sql)$admin=mysql\u fetch\u数组($result);var_dump($admin)$_会话['admin']=$admin['admin'];如果($_SESSION['admin'])==1{echo“您是管理员!”;}或者{echo“您是普通用户”}没有任何内容,则它不会打印任何内容
function logIn($username, $pass)
{
if ($username == "" || $pass == "")
return "Please, fill every text field.";
$pdo = connectToServer();
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = :username");
$stmt->execute(array("username" => $username));
$fetch = $stmt->fetch();
$numberRows = $stmt->rowCount();
if ($numberRows > 0)
{
// user exists, check for password
$crypted = hash('ripemd160', $fetch["salt"] . $pass);
/* NOTE: you must have encrypted passwords in the same way
at the moment of signing up.
Without encryption (not recommendable) you can use:
$crypted = $pass;
*/
if ($crypted == $fetch["pass"])
{
// Logged, do whatever you want and return true
return true;
}
else
return "You have inserted a wrong username or password";
}
else
return "You have inserted a wrong username or password";
}