如何使用pdo创建用户访问级别?

时间:2016-05-30 02:20:09

标签: php pdo

我在这里有登录的代码,它工作正常我也在这里使用会话,但我现在的问题是,我怎么能想让用户访问级别?。在我的登录数据库中我有用户名,密码和级别,现在admin = 1和guest = 0。 我想要发生的是,当我以管理员身份登录时,它会将我重定向到signup.php,如果我以访客身份登录,它会将我重定向到index.php,请帮助我,我已经工作了近两周。 。 这是我的代码..

db.php中

<?php

session_start();

$DB_host = "localhost";
$DB_user = "root";
$DB_pass = "";
$DB_name = "survey";
$charset = "utf8";


try
{
  $DB_con = new PDO("mysql:host={$DB_host};dbname={$DB_name};charset={$charset}",$DB_user,$DB_pass);
  $DB_con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  $DB_con->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
}
  catch(PDOException $e)
{
  echo $e->getMessage();
}

?>

class.user.login.php

<?php

class crud
{
private $db;

function __construct($DB_con)
{
  $this->db = $DB_con;
}

public function login($uname,$upass)
{
try
{
  $stmt = $this->db->prepare("SELECT * FROM users WHERE user_name=:uname AND level=:level LIMIT 1");
  $stmt->execute(array(':uname'=>$uname));
  $userRow=$stmt->fetch(PDO::FETCH_ASSOC);

    if($stmt->rowCount() > 0)
    {
    if(password_verify($upass, $userRow['user_pass']))
    {
      $_SESSION['user_session'] = $userRow['user_id'];
      return true;
    }
    else
    {
      return false;
    }
  }
}
    catch(PDOException $e)
  {
    echo $e->getMessage();
  }
}

public function is_loggedin()
{
if(isset($_SESSION['user_session']))
{
    return true;
  }
}

public function redirect($url)
{
header("Location: $url");
}
?>

**** ****的login.php

<?php
include_once 'dbconfig.php';

    if($crud->is_loggedin()!="")
    {
    $crud->redirect('insert.php');
    }

    if ($_SERVER["REQUEST_METHOD"] == "POST")
    {
    $uname = $_POST['user'];
    $upass = $_POST['pass'];

    if($crud->login($uname,$upass))
    {
    $crud->redirect('index.php');
    }
    else
    {
    echo "<script type='text/javascript'>alert('Invalid Username or Password');</script>";
    }   
}
?>

home.php

<?php
include_once 'dbconfig.php';

    if(!$crud->is_loggedin())
    {
    $crud->redirect('home.php');
    }
    $ID = $_SESSION['user_session'];
    $stmt = $DB_con->prepare("SELECT * FROM survey_section WHERE ID=:ID");
    $stmt->execute(array(":ID"=>$ID));
    $userRow=$stmt->fetch(PDO::FETCH_ASSOC);
?>

1 个答案:

答案 0 :(得分:0)

您正在寻找的术语是ACL(访问控制列表)

This应该可以帮助您获得理解: - )

对于您当前的实现,没有检查登录用户是level,如果登录成功,您似乎只有$crud->redirect('index.php');

但在我们开始之前;你试图绑定:level但没有指定它或在任何地方实现它......

使用login()方法:

$stmt = $this->db->prepare("SELECT * FROM users WHERE user_name=:uname AND level=:level LIMIT 1");
$stmt->execute(array(':uname'=>$uname));

由于您未指定:level是什么,因此会失败,因此您将被抛出无效的参数计数错误 - &gt;意味着此函数将始终返回false。

您需要修改该查询(删除AND level = :level 指定:level是什么在execute()

从那里,您需要适当地修改您的功能 - 在这种情况下,将级别设置为会话变量会更合适:

//.....code above...
if(password_verify($upass, $userRow['user_pass']))
{
  $_SESSION['user_session'] = $userRow['user_id'];
  $_SESSION['user_level'] = $userRow['level'];
  return true;
}
//.....cove below...

现在;在login.php内,您可以相应地重定向:

if($crud->login($uname,$upass))
{
    switch($_SESSION['user_level']) {
        case "0": // regular user
        $crud->redirect('index.php');
        break;
        case "1": // admin
        $crud->redirect('signup.php');
        break;
    }
}