PHP会话(用户/管理员)用户级别

时间:2017-02-27 02:03:34

标签: php mysql session

我只是php的新手,几个星期自我教学并制作各种项目来学习如何做事......

我目前正在制作一个由...组成的基本项目 索引(登录页面) 寄存器 家(用户级别) 管理员(管理员级别) 登出 DBCONNECT

我的数据库中有一个名为userlevel的列,默认为0,管理员帐户我将更改为1。

此时登录的任何用户都可以访问home.php页面,因为会话变量是“user”,因此只要有任何用户登录,他们就会转到home.php,否则如果登录不是则返回索引有效....就像我说我是非常新的PHP,只开始学习今天的会议,所以它有点压倒...基本上我只是粘贴从家到管理员的相同页面开始编辑会话详细信息,以便它将只允许userlevel 1的用户访问admin else返回索引....相关页面的代码如下.....

index.php(登录页面)

<?php
	ob_start();
	session_start();

	require_once 'dbconnect.php';


	
	// it will never let you open index(login) page if session is set
	if ( isset($_SESSION['user'])!="" ) {
		header("Location: home.php");
		exit;
	}
	
	$error = false;
	
	if( isset($_POST['btn-login']) ) {	
		
		// prevent sql injections/ clear user invalid inputs
		$email = trim($_POST['email']);
		$email = strip_tags($email);
		$email = htmlspecialchars($email);
		
		$pass = trim($_POST['pass']);
		$pass = strip_tags($pass);
		$pass = htmlspecialchars($pass);
		// prevent sql injections / clear user invalid inputs
		
		if(empty($email)){
			$error = true;
			$emailError = "Please enter your email address.";
		} else if ( !filter_var($email,FILTER_VALIDATE_EMAIL) ) {
			$error = true;
			$emailError = "Please enter valid email address.";
		}
		
		if(empty($pass)){
			$error = true;
			$passError = "Please enter your password.";
		}
		
		// if there's no error, continue to login
		if (!$error) {
			
			$password = hash('sha256', $pass); // password hashing using SHA256
		
			$res=mysql_query("SELECT id, fname, pass FROM project WHERE email='$email'");
			$row=mysql_fetch_array($res);
			$count = mysql_num_rows($res); // if uname/pass correct it returns must be 1 row
			
			if( $count == 1 && $row['pass']==$password ) {
				$_SESSION['user'] = $row['id'];	
				header("Location: home.php");
			} else {
				$errMSG = "Incorrect Credentials, Try again...";
			}

				
		}
		
	}
?>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Sign In</title>
</head>
<body>


<form method="post" action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']); ?>" autocomplete="off">


<input type="email" name="email" placeholder="Enter Your Email" value="<?php echo $email; ?>" maxlength="40" />
<?php echo $emailError; ?><br>

<br>

<input type="password" name="pass" placeholder="Enter Your Password" maxlength="15" />
<?php echo $passError; ?><br>

<br>

<button type="submit" name="btn-login">Sign In</button><br>


<br>
<br>
<a href="register.php">Register</a> <a href="index.php">Sign in</a> <a href="admin.php">Admin</a>
<br>
<?php
if ( isset($errMSG) ) {

?>
 <?php echo $errMSG; ?>

<?php
}
?>


</body>
</html>
<?php ob_end_flush(); ?>

home.php

<?php
	ob_start();
	session_start();
	require_once 'dbconnect.php';

	
	// if session is not set this will redirect to login page
	if( !isset($_SESSION['user']) ) {
		header("Location: index.php");
		exit;
	}
	// select loggedin users detail
	$res=mysql_query("SELECT * FROM project WHERE id=".$_SESSION['user']);
	$userRow=mysql_fetch_array($res);




	
?>




<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Welcome - <?php echo $userRow['fname']; ?></title>
</head>
<body>

Hello <?php echo $userRow['fname']; ?> you are sucessfully logged in!

<br>Your last name is <?php echo $userRow['lname']; ?>
<br>Your email address is <?php echo $userRow['email']; ?>

<br><br><br><br><br><br><br><br><br><br>







<br><br><br><br><br><br><br><br><br><br>


<a href="logout.php?logout"></span>Sign Out</a></li>


<br>
<br>
<a href="register.php">Register</a> <a href="index.php">Sign in</a> <a href="admin.php">Admin</a>
             
</body>
</html>
<?php ob_end_flush(); ?>

admin.php的

<?php
	ob_start();
	session_start();

	require_once 'dbconnect.php';

	
	
	// if session is not set this will redirect to login page
	if( !isset($_SESSION['user']) ) {
		header("Location: index.php");
		exit;
	}

	// select loggedin users detail
	$res=mysql_query("SELECT * FROM project WHERE id=".$_SESSION['user']);
	$userRow=mysql_fetch_array($res);




	
?>




<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Welcome - <?php echo $userRow['fname']; ?></title>
</head>
<body>


Hello <?php echo $userRow['fname']; ?> you are sucessfully logged in!

<br>Your last name is <?php echo $userRow['lname']; ?>
<br>Your email address is <?php echo $userRow['email']; ?>

<br><br><br><br><br><br><br><br><br><br>


<h1><?php echo $userRow['userlevel']; ?></h1>





<br><br><br><br><br><br><br><br><br><br>


<a href="logout.php?logout"></span>Sign Out</a></li>

<br>
<br>
<a href="register.php">Register</a> <a href="index.php">Sign in</a> <a href="admin.php">Admin</a>
             
</body>
</html>
<?php ob_end_flush(); ?>

如果有人可以告诉我如何使会话查看数据库中的userlevel行以获取存储的信息(0或1表示用户或管理员)以及如何相应地更改index.php(登录)页面,以及如何编辑admin.php只允许登录用户使用userlevel 1来查看页面?

对不起,如果这是模糊的或者到处都是,我仍然只是每天都找到新的东西

由于

2 个答案:

答案 0 :(得分:0)

如果你将一个is_admin字段添加到你的项目表(我假设你的用户表),那么你可以测试用户是否是管理员,如下所示:

$sql = "SELECT * FROM project WHERE id='" . mysql_real_escape_string($id) . "'";
$res = mysql_query($sql);
$row = mysql_fetch_array($result, MYSQL_ASSOC);
if (!$row || !$row['is_admin']) {
    die();
} 

(我不使用PHP并且没有测试过这段代码,所以把它想象成伪代码)

答案 1 :(得分:0)

警告

你不应该再使用PHP中的mysql_ *函数了,因为它们已经从php7中删除了,并且不会从我理解的内容中返回。

使用mysqli_ *或pdo *代替。

有人说......

至于将数据库信息存储到用户会话中的解决方案,您可以使用我为此编写的一些函数。

注意:这些函数使用不受支持的mysql_ *函数,如果没有更新到mysqli _ *等受支持的替代函数,则不应进行复制/粘贴。

连接到MySQL数据库

function SQL_LOGIN() {
    $servername = "localhost";
    $username = "myusername";
    $password = "XXXXXXXXXX";

    // Create connection
    $conn = mysql_connect($servername, $username, $password);

    // Check connection
    if (!$conn) {
        die("Connection failed: " . mysqli_connect_error());
    }   
    return $conn;
}

-

执行MySql查找

function SQL_SELECT($inputDB, $inputTable, $inputColumns, $inputParams, $inputConnection) {
    $query = "SELECT ".mysql_real_escape_string($inputColumns)." from ".$inputDB.".".mysql_real_escape_string($inputTable)." ".$inputParams."";
    $result = mysql_query($query, $inputConnection);
    return $result;
}

-

将SQL查询结果转换为数组

function SQL_RESULT_TO_ARRAY($result) {
    $endArray = array();
    if (mysql_num_rows($result) > 0) {
        while($row = mysql_fetch_assoc($result)) {
            $endArray[] = $row;
        }
    } else {
        /* blank result */
    }    
    return $endArray;
}

-

如果用户是管理员,则将会话变量is_admin设置为true

       $inputEmail = ""; /* put in your code to get the user's email or whatever */

        session_start();
        $conn = SQL_LOGIN();

        $result = SQL_SELECT("users", "ID,EMAIL,IS_ADMIN", "where EMAIL like '".$inputEmail."'", $conn);
        $resultArray = SQL_RESULT_TO_ARRAY($result);
        foreach ($resultArray as $idx=>$childArray) {
           if ($childArray["IS_ADMIN"] == 1) { 
               $_SESSION["IS_ADMIN"] = true; 
           }
        }

修改

$_SESSION["IS_ADMIN"]之类的会话变量设置为true后,它将一直保留到:

  • 您致电session_destroy()
  • 用户从浏览器中删除Cookie
  • 会话根据 php.ini
  • 中定义的会话到期时间到期
  • 访问了一个新页面,但未调用session_start()命令(一旦session_start()被调用,则会话将被恢复,并带来任何$_SESSION[]个变量)

注意所提供的代码旨在成为正确方向的指南,而不是安全的解决方案。代码的某些部分可能会让攻击者入侵您的SQL数据库,进入PHP,甚至进入您的服务器。

不要直接复制/粘贴生产环境