You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将现有等级系统从服务器端迁移至数据库驱动实现?

等级系统改造方案与代码优化建议

问题概述

当前用户等级系统的等级名称、升级经验均硬编码在PHP代码中,每次调整等级规则都需修改代码,维护成本高。现计划改为从独立数据库表读取等级配置,让系统能根据用户经验自动适配新规则,同时纠结:是修改现有代码更简便,还是重新编写整套系统更好?

当前数据库与代码情况

用户表(Characters)结构

id  username    rank    rankXP
1   myusername  0       231

现有核心硬编码代码片段

// 硬编码的等级名称和升级经验数组
$rank_array = array("Tramp", "Crook", "Thief", "Hustler", "Mobster", "Soldier", "General", "Boss", "GodFather");
$rank_exp_array = array("750", "1600", "3400", "7000", "15000", "33000", "69000", "140000", "99999999999");

// 固定分支的升级判断逻辑
if(($rank == "0") && ($exp >= "750")){ $newrank="1"; $done="1"; }
elseif(($rank == "1") && ($exp >= "1600")){ $newrank="2"; $done="1"; }
// ... 更多重复的elseif分支

期望的等级配置表结构

新增一张ranks表专门存储等级规则:

id  name        level_up
1   Tramp       750
2   Crook       1600
3   Thief       3400
4   Hustler     7000
5   Mobster     15000
6   Soldier     33000
7   General     69000
8   Boss        140000
9   Godfather   999999999 -- 最高等级,无法继续升级

改造方案

1. 创建等级配置表

执行以下SQL语句创建表并初始化等级数据:

CREATE TABLE ranks (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50) NOT NULL,
    level_up BIGINT NOT NULL -- 使用BIGINT避免经验值溢出
);

INSERT INTO ranks (name, level_up) VALUES
('Tramp', 750),
('Crook', 1600),
('Thief', 3400),
('Hustler', 7000),
('Mobster', 15000),
('Soldier', 33000),
('General', 69000),
('Boss', 140000),
('Godfather', 999999999);

2. 修改现有PHP代码

替换硬编码数组为数据库查询,同时优化升级逻辑(无需编写大量重复的elseif分支):

// RANKS - 从数据库读取等级配置
$rank = $fetch['user_rank'];
$exp = $fetch["rank_xp"];

// 查询所有等级,按id排序保证等级顺序正确
$rankResult = mysqli_query($conn, "SELECT id, name, level_up FROM ranks ORDER BY id ASC");
$rankList = [];
while ($row = mysqli_fetch_assoc($rankResult)) {
    // 将数据库的id(从1开始)转换为0索引,兼容原有等级索引逻辑
    $rankList[$row['id'] - 1] = [
        'name' => $row['name'],
        'level_up' => $row['level_up']
    ];
}

// 处理等级显示与进度计算
if (isset($rankList[$rank])) {
    $rankdisplay = $rankList[$rank]['name'];
    // 最高等级直接显示100%进度
    if ($rank == count($rankList) - 1) {
        $rankpercent = 100;
    } else {
        $rankpercent = round($exp / $rankList[$rank]['level_up'] * 100, 2);
    }
} else {
    // 防错处理:等级超出配置范围时显示默认值
    $rankdisplay = 'Unknown';
    $rankpercent = 0;
}

// -- RANK SYSTEM - 动态升级判断 -- 
$done = 0;
$newrank = $rank;

// 循环检查升级条件,支持任意数量的等级扩展
while (true) {
    // 已达最高等级,终止循环
    if ($newrank >= count($rankList) - 1) {
        break;
    }
    // 当前等级所需的升级经验
    $requiredExp = $rankList[$newrank]['level_up'];
    if ($exp >= $requiredExp) {
        $newrank++;
        $done = 1;
    } else {
        break;
    }
}

// 升级成功时更新用户数据
if ($done == 1 && $newrank != $rank) {
    mysqli_query($conn, "UPDATE Characters SET user_rank = '$newrank', money = money + 50000, bullets = bullets + 50 WHERE username = '$username'");
}

3. 改造后的优势

  • 后续修改等级名称、调整升级经验,直接操作ranks表即可,无需改动代码
  • 升级逻辑改为动态循环,新增等级只需在数据库插入一行数据,代码无需调整
  • 增加防错处理,避免等级超出配置范围时出现异常

修改vs重写的结论

直接修改现有代码更简便高效,理由如下:

  • 核心功能(经验计算、升级奖励)无需改动,仅需替换数据源(从硬编码数组改为数据库查询)
  • 重写系统不仅工作量大,还容易破坏原有功能、引入新bug
  • 现有代码结构清晰,改造后可保留所有原有功能,同时实现动态配置的需求

内容的提问来源于stack exchange,提问作者MrUnique

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 20:45:35