[一个朋友让我研究他的lua代码,但是我无济于事,在那儿没有发现任何错误,所以我们最终在这里提出了这个问题。
MYSQL表:只是为了外观:
SELECT * FROM itemshop.config.ITEMSHOP_LOGS_TABLE;
+----+-------+-------+--------+
| id | pid | vnum | amount |
+----+-------+-------+--------+
| 1 | 10001 | 35040 | 3 |
| 2 | 10002 | 60319 | 6 |
| 3 | 10001 | 31139 | 1 |
| 4 | 10001 | 71132 | 5 |
| 5 | 10002 | 40319 | 1 |
| 6 | 10003 | 80024 | 1 |
+----+-------+-------+--------+
Lua:
itemshop.logs = {}
function itemshop.load_logs_array()
itemshop.logs = {}
local c,logs = mysql_direct_query("SELECT * FROM "..itemshop.config.ITEMSHOP_LOGS_TABLE..";") --mysql_direct_query is an inside c++ function, i checked and works fine
if c > 0 then
for i = 1,c do
if itemshop.logs[logs[i].pid] == nil then itemshop.logs[logs[i].pid] = {} end
itemshop.logs[logs[i].pid][i] = {logs[i].vnum, logs[i].amount}
end
end
end
itemshop.load_logs_array()
function itemshop.load_logs(pid)
if itemshop.logs[pid] ~= nil then
cmdchat(table.getn(itemshop.logs[pid]))
if table.getn(itemshop.logs[pid]) > 0 then
--for k,logs in pairs(itemshop.logs[pc.get_player_id()]) do
--do something
--end
end
end
end
以便将mysql表加载到itemshop.logs = {}
[当我尝试:itemshop.load_logs(10001)
时,它工作正常。当我尝试:itemshop.load_logs(10002)
没有任何反应。当我尝试时:itemshop.load_logs(10003)
没有任何反应
我发现错误在哪里。
[This:table.getn(itemshop.logs[pid])
返回0,如果我尝试比mysql表中的第1行更高的值(因此pid:10001)。当我尝试pid 10001时,它返回3,这是正确的,因为有3pcs的10001 pid。当我尝试其他任何操作时,它返回0。
即使听起来很奇怪,该信息也是100%肯定的,我打印了每个table.getn(itemshop.logs[pid])
进行检查,只有第一个有效。如果我从mysql表中删除第一行,则只有第二个pid将起作用。
有人可以在lua代码中看到错误,为什么它仅与第一个pid一起使用,或者该错误应该在其他地方?因为这是一件复杂的事情,所以可能会发生。至少我们可以知道lua代码是可以的。
我相信问题是表长度运算符(PS:由于弃用,您应该使用#table
而不是table.getn(table)
)无法计算键。它仅计算数组的长度。
arr = {"A", "B"}
dict = {A = "Apple", B = "Banana"}
print(#arr)
print(#dict)
-----------------------------------OUTPUT
2
0
function itemshop.load_logs(pid)
中的这一行似乎是问题所在:if table.getn(itemshop.logs[pid]) > 0 then
因为您要索引的表只有键vnum
和amount
(如果我正确理解了代码),它只会返回0,因此每个表都无法通过检查。您将需要另一种确定空表的方法。一种快速而肮脏的方法可能是if itemshop.logs[pid].vnum == nil
这应该起作用,因为当您找到nil pids
时创建了空表(因此没有键)。