【问题标题】:how to make user access level using pdo?如何使用 pdo 设置用户访问级别?
【发布时间】:2016-05-30 10:36:37
【问题描述】:

我在这里有登录代码,它工作正常我也在这里使用会话,但我现在的问题是我如何设置用户访问级别?在我的登录数据库中,我现在有用户名、密码和级别管理员=1,客人=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);
?>

【问题讨论】:

    标签: php pdo


    【解决方案1】:

    您要查找的术语是 ACL(访问控制列表)

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


    对于您当前的实现,没有检查登录用户是什么level,如果登录成功,您似乎只会看到$crud-&gt;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 是什么,因此您将被抛出一个无效参数计数错误 -> 这意味着该函数将始终返回 false。

    您需要修改该查询(删除AND level = :level 指定:level 在您的@987654330 @.)

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

    //.....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;
        }
    }
    

    【讨论】:

    • 在 home.php 中我需要更改会话中的任何内容吗?
    • @Trojan 取决于你想在home.php 中做什么。谁可以访问它?
    • 是的,我知道……例如在您的代码中,当我以访客身份登录时,我将在 index.php 中重定向,我是否需要像上面的代码一样在 home.php 中添加任何内容?
    • @Trojan 取决于 - 您是否希望根据用户级别发生相同的重定向?
    • 是的..所以如果这种情况我不需要改变任何东西对吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-12
    • 2013-02-27
    • 2012-05-07
    • 2014-10-11
    • 1970-01-01
    • 1970-01-01
    • 2012-04-16
    相关资源
    最近更新 更多