MTA Lua账号注册代码无法插入数据库 误报登录名已存在求助
问题原因定位与解决方案
核心触发点
报错「用户名已存在但数据库无对应记录」的核心问题出在TR_mysql查询返回值的判断逻辑,以及多处隐藏的逻辑语法漏洞,逐一修复如下:
优先排查修复项
- 用户名查询逻辑错误
你当前的判断逻辑是
if checkUsername and checkUsername[1] then,但绝大多数MTA的MySQL导出库,查询无结果时可能返回false、nil或空数组;若查询执行异常(表不存在、字段拼写错误、数据库权限不足)也会返回非空的错误对象,误触发checkUsername[1]的存在判定。
修复方案:先增加调试打印确认返回结构,再调整判断逻辑为校验返回数组长度:local checkUsername = exports.TR_mysql:query("SELECT UID FROM `dhiran` WHERE `login` = ? LIMIT 1", login) -- 调试用打印,生产环境可删除,可直接在服务端控制台看查询结果 outputDebugString("用户名查询结果:"..type(checkUsername)..",长度:"..(#checkUsername or 0)) -- 仅当查询成功且返回至少1条结果时,才判定用户名存在 if checkUsername and type(checkUsername) == "table" and #checkUsername > 0 then triggerClientEvent(client, "loginResponseServer", resourceRoot, "该用户名已被注册", "error") return end
- 插入语句参数错位
你插入语句的字段顺序是
(login, password, email, serial, createIP, position, referencedPlayer, money, phoneBlocked),共9个占位符,但你把最后一个字段phoneBlocked的固定值'[[]]'写在了SQL模板里,后面又传了9个参数,导致参数数量不匹配、错位,插入语句执行直接失败。
修复方案:调整插入语句参数匹配:exports.TR_mysql:query("INSERT INTO dhiran (login, password, email, serial, createIP, position, referencedPlayer, money, phoneBlocked) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)", login, passwordHash(password, "bcrypt", {}), email, getPlayerSerial(client), getPlayerIP(client), settings.spawnPositions[math.random(1, #settings.spawnPositions)], referenceUID or false, referenceUID and 500 or 0, '[[]]')
其他附带修复项
序列号限制逻辑完全失效:你查询序列号时加了LIMIT 1,返回结果最多只有1条,#checkSerial == 2的判断永远不会触发,相当于设备账号上限限制完全没用,顺便修复即可:
-- 去掉LIMIT 1才能统计该设备下的账号总数 local checkSerial = exports.TR_mysql:query("SELECT UID FROM `dhiran` WHERE `serial` = ?", serial) if checkSerial and type(checkSerial) == "table" and #checkSerial >= 2 then triggerClientEvent(client, "loginResponseServer", resourceRoot, "你当前设备已达到账号创建上限(最多2个)", "error") return end
内容的提问来源于stack exchange,提问作者Dhiran Daniel
相关产品推荐
相关产品推荐

