如何将现有等级系统从服务器端迁移至数据库驱动实现?
等级系统改造方案与代码优化建议
问题概述
当前用户等级系统的等级名称、升级经验均硬编码在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
相关产品推荐
相关产品推荐

