php包含带重定向的mysql文件

时间:2016-10-12 02:47:22

标签: php mysql

我的问题很快。

我是PHP的新手,我正在创建一个具有登录和注册表单的网站。我有代码解决但是我使用PHP包括mysql.php,我想知道是否需要单独的。

我的意思是这里有普通会员登录和管理员登录。如果成员已登录,那么我希望重定向转至example.com/member,如果是admin,则返回example.com/admin。它来自MySQL文件我重定向意味着我需要超过1或者它在其他地方我会这样做吗?

目前我不想在同一页面上完成所有操作,这就是我这样做的原因。

任何指导都会很棒。

由于

1 个答案:

答案 0 :(得分:1)

<强> TL; DR: 使用header("Location: somepage.php");根据每页开头的$_SESSION['user_type']或SQL查询重定向。无需单独登录。

我假设mysql.php是您的数据库文件:

<强> mysql.php

<?php
$mysqli = new mysqli('localhost', 'username', 'pass', 'db', port);
if(mysqli_connect_errno()) {
    echo "DB Error!"; exit();
}
?>

在所有页面的顶部,添加如下内容。如果用户没有登录,这将重定向到登录页面。很多假设(整数ID,SESSION变量等),但你明白了:

<?php
session_start();
require("mysql.php");
// If not logged in, go to login
if(isset($_SESSION['user_id']) && $_SESSION['logged_in']) {
  if($result = $mysqli -> prepare("SELECT id FROM `USER` WHERE id = ? AND session_id = ? LIMIT 1")) {
    $session_id = session_id();
    $result -> bind_param("i", $_SESSION['uid']);
    $result -> execute();
    $result -> store_result();
    if($result -> num_rows != 1) {
      header("Location: login");
      exit();
    }
  }
  else {
    header("Location: login");
    exit();
  }
}
else {
  header("Location: login");
  exit();
}
?>

同样,如果登录用户是管理员或成员,则可以重定向(使用$_SESSION['user_type'],登录时设置)。因为您是新手,所以还需要更多代码:

<强>的login.php

<?php
session_start();
require("mysql.php");
// If already logged in, redirect to admin or members based on session variable.
// ...
//
// If a login form has been submitted (assuming you're logging in from a POST)
if(isset($_POST['submit'])) {
  if($_POST['username'] && $_POST['password']) {
    if($result = $mysqli->prepare("SELECT id, username, user_type, password FROM `USER` WHERE username = ? LIMIT 1")) {
      $result -> bind_param("s", $_POST['username']);
      $result -> execute();
      $result -> store_result();
      if($result -> num_rows == 1) {
        $result -> bind_result($id, $username, $user_type, $bcrypted);
        $result -> fetch();
        if(password_verify($_POST['password'], $bcrypted)) {
          session_regenerate_id(); // Avoid Session Fixation Attack
          $session_id = session_id(); // Update the USER table using this
          $_SESSION['user_id'] = $id;
          $_SESSION['username'] = $username;
          $_SESSION['user_type'] = $user_type;
          $_SESSION['logged_in'] = true;
          // Log some data to your DB, login time, ip, etc
          header("Location: ".($_SESSION['user_type'] == 'admin' ? 'admin.php' : 'member.php'));
          exit();
        }
      }
    }
  }
}
?>
<html> ...

那里有几点。在实际登录之前重新生成会话ID,使用bcrypt作为密码,假设你理解了MySQL的参数化语句,那里还有一个三元运算符。不要忘记退出页面:

<强> logout.php

<?php
session_start();
$_SESSION['logged_in'] = False;
$_SESSION = array();
session_destroy();
header("Location: login.php");
?>

我希望至少有一些有帮助。我还没有覆盖一百万件事,但你可以从网上已有的资料中学到很多东西。祝你好运!