在你提供的代码中,有几个问题需要注意,这些问题可能导致你遇到的错误:
1. **MySQL 查询的结果检查**:
local myInfo = MySQL.Sync.fetchAll("SELECT data FROM fast_station WHERE station = @station AND owner = @owner", {
-- 缺少键名
['station'] = id,
['owner'] = identifier
})
这里缺少了查询参数的键名。应该使用 `['station']` 和 `['owner']` 来指定正确的字段。
2. **检查 `myInfo` 的返回值**:
if #myInfo > 0 then
local cdata = json.decode(myInfo[1].data)
-- 后续代码...
else
print("查询没有返回结果!")
return false
end
在处理 `myInfo` 时,你需要先检查它是否返回了结果(例如,使用 `#myInfo > 0` 来检查数组是否有元素),否则直接访问 `myInfo.data` 会造成 nil 值的问题。
3. **数据修改的逻辑**:
cdata.value = cdata.value - data.value
确保 `cdata.value` 和 `data.value` 都是可以进行减法运算的数字。如果 `cdata.value` 或 `data.value` 为 nil,则会产生错误。
4. **最终更新数据库的执行**:
MySQL.Async.execute("UPDATE fast_station SET data = @data WHERE station = @station", {
['data'] = json.encode(cdata),
['station'] = id,
})
同样缺少了键名,需要确保所有用到的变量都有对应的键。
结合以上指出的问题,修正后的代码如下:
lib.callback.register('fast-fuel:payment', function(source, id, data)
local Player = getPlayer(source)
local identifier = Player.identifier or Player.PlayerData.citizenid
local money = getMoney(Player, data.method)
if money >= tonumber(data.price) then
removeMoney(Player, data.method, tonumber(data.price))
local myInfo = MySQL.Sync.fetchAll("SELECT data FROM fast_station WHERE station = @station AND owner = @owner", {
['station'] = id,
['owner'] = identifier
})
if #myInfo > 0 then
local cdata = json.decode(myInfo[1].data)
cdata.value = (cdata.value or 0) - (data.value or 0) -- 确保这两个值为数字
cdata.money = (cdata.money or 0) + tonumber(data.price)
MySQL.Async.execute("UPDATE fast_station SET data = @data WHERE station = @station", {
['data'] = json.encode(cdata),
['station'] = id,
})
return true
else
print("查询没有返回结果!")
return false
end
end
return false
end)
建议修改后再次运行代码,查看是否解决了原先的错误。如果还有问题,请提供更详细的上下文信息。 |