You need to enable JavaScript to run this app. PHP+MySQL登录系统如何实现不同客户登录后跳转专属作品集页
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.07 21:54:02