PHP+MySQL登录系统如何实现不同客户登录后跳转专属作品集页
实现不同用户登录跳转对应作品集的完整方案
你最初设想的「在账号表新增版本标识字段」的思路完全可行,对于你这种最多10个用户、手动配账号的场景,这是维护成本最低的方案,不需要引入复杂的权限系统或路由框架,按下面的步骤改即可:
第一步:修改数据库表结构
直接在现有的accounts表新增一个字段,用来存对应用户的作品集文件名(比存1、2、3这种数字更直观,省掉后续的数字到文件名的映射步骤),执行下面的SQL语句:
ALTER TABLE accounts ADD COLUMN version VARCHAR(50) NOT NULL DEFAULT 'default';
后续给每个客户建账号时,直接在这个字段填对应的作品集文件名即可,比如AcmeInc的账号填acmeinc.html,BobsBurgers的账号填bobsburgers.html。
第二步:修改authenticate.php的代码
先补全原代码里的两处基础问题:
- 原代码中
$DATABASE_USER = 'john'一行末尾漏了分号,会触发PHP语法错误,需要补上 - 所有
header()跳转语句后面必须加exit,否则PHP会继续执行后续代码,可能导致跳转失效或未授权内容泄露
核心修改逻辑:把数据库查询的范围扩展到新增的version字段,登录成功后把对应的值存到session里,后续不需要重复查数据库。修改后的核心代码段如下,直接替换原文件里对应的逻辑即可:
session_start(); $DATABASE_HOST = 'localhost'; $DATABASE_USER = 'john'; // 补全末尾的分号 $DATABASE_PASS = 'password'; $DATABASE_NAME = 'users'; $con = mysqli_connect($DATABASE_HOST, $DATABASE_USER, $DATABASE_PASS, $DATABASE_NAME); if ( mysqli_connect_errno() ) { exit('Failed to connect to MySQL: ' . mysqli_connect_error()); } if ( !isset($_POST['username'], $_POST['password']) ) { exit('Please fill both the username and password fields!'); } // 修改查询语句,把version字段也查出来 if ($stmt = $con->prepare('SELECT id, password, version FROM accounts WHERE username = ?')) { $stmt->bind_param('s', $_POST['username']); $stmt->execute(); $stmt->store_result(); if ($stmt->num_rows > 0) { // 绑定三个返回值:id、密码、版本 $stmt->bind_result($id, $password, $user_version); $stmt->fetch(); if ($_POST['password'] === $password) { session_regenerate_id(); $_SESSION['loggedin'] = TRUE; $_SESSION['name'] = $_POST['username']; $_SESSION['id'] = $id; // 把用户对应的作品集路径存入session $_SESSION['page_version'] = $user_version; header('Location: home.php'); exit; // 跳转后加exit中断执行 } else { echo 'Incorrect username and/or password!'; } } else { echo 'Incorrect username and/or password!'; } $stmt->close(); }
第三步:在home.php里实现安全跳转逻辑
这里有个必须注意的安全坑:你的作品集html文件如果直接放在web根目录,任何人不用登录直接输入文件路径就能访问,等于登录系统完全失效。推荐的目录结构:
- 网站根目录放:登录页
index.html、验证脚本authenticate.php、权限校验页home.php - 新建一个
private_pages文件夹,把所有客户的作品集html文件(acmeinc.html、bobsburgers.html等)都放到这个文件夹里 - 在
private_pages文件夹里放一个空的.htaccess文件,配置规则禁止外部直接访问这个文件夹下的所有内容
修改home.php顶部的权限校验逻辑,加入白名单校验+跳转,防止有人篡改session参数跳转到未授权文件:
<?php session_start(); if (!isset($_SESSION['loggedin'])) { header('Location: index.html'); exit; } // 配置允许访问的作品集白名单,后续加新客户直接把文件名加进数组即可 $allowed_pages = [ 'acmeinc.html', 'bobsburgers.html' ]; // 校验用户session里存的页面在白名单内 if (isset($_SESSION['page_version']) && in_array($_SESSION['page_version'], $allowed_pages)) { // 跳转到private_pages目录下的对应文件 header('Location: private_pages/' . $_SESSION['page_version']); exit; } // 没有匹配到对应页面的,跳默认公共页 header('Location: private_pages/default.html'); exit; ?>
后续维护说明
你这种小规模场景完全不需要复杂的优化,后续新增客户只需要3步:
- 把新客户的作品集html文件放进
private_pages文件夹 - 把对应的文件名加到
$allowed_pages白名单数组里 - 在数据库里新建账号,把账号的
version字段设为对应的文件名即可
- 额外提醒:现有代码是明文存储数据库密码,后续有空可以改成PHP自带的
password_hash()加密存储,不影响当前功能的跑通。
内容的提问来源于stack exchange,提问作者catfan331
相关产品推荐
相关产品推荐

