Lua:table.getn(tablename [something])仅在第一次出现时起作用

问题描述 投票:0回答:1

[一个朋友让我研究他的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代码是可以的。

mysql lua
1个回答
0
投票

我相信问题是表长度运算符(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因为您要索引的表只有键vnumamount(如果我正确理解了代码),它只会返回0,因此每个表都无法通过检查。您将需要另一种确定空表的方法。一种快速而肮脏的方法可能是if itemshop.logs[pid].vnum == nil这应该起作用,因为当您找到nil pids时创建了空表(因此没有键)。

© www.soinside.com 2019 - 2024. All rights reserved.