我的问题很快。
我是PHP的新手,我正在创建一个具有登录和注册表单的网站。我有代码解决但是我使用PHP包括mysql.php,我想知道是否需要单独的。
我的意思是这里有普通会员登录和管理员登录。如果成员已登录,那么我希望重定向转至example.com/member,如果是admin,则返回example.com/admin。它来自MySQL文件我重定向意味着我需要超过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");
?>
我希望至少有一些有帮助。我还没有覆盖一百万件事,但你可以从网上已有的资料中学到很多东西。祝你好运!