For loop 为什么“i”总是在for循环中被当作1

For loop 为什么“i”总是在for循环中被当作1,for-loop,lua,string-formatting,increment,For Loop,Lua,String Formatting,Increment,我编写了这个简单的脚本来更新MySQL中的表。为此,我创建了一个For循环,并尝试了以下操作: 结果如下: 1 UPDATE `latest` SET `date` = '2010-09-1' WHERE `date` = '2009-1-10' AND `fid` > 50000 2 UPDATE `latest` SET `date` = '2010-09-1' WHERE `date` = '2009-1-10' AND `fid` > 50000 3 UPDATE `late

我编写了这个简单的脚本来更新MySQL中的表。为此,我创建了一个For循环,并尝试了以下操作:

结果如下:

1
UPDATE `latest`
SET `date` = '2010-09-1'
WHERE `date` = '2009-1-10'
AND `fid` > 50000
2
UPDATE `latest`
SET `date` = '2010-09-1'
WHERE `date` = '2009-1-10'
AND `fid` > 50000
3
UPDATE `latest`
SET `date` = '2010-09-1'
WHERE `date` = '2009-1-10'
AND `fid` > 50000
4
UPDATE `latest`
SET `date` = '2010-09-1'
WHERE `date` = '2009-1-10'
AND `fid` > 50000
5
UPDATE `latest`
SET `date` = '2010-09-1'
WHERE `date` = '2009-1-10'
AND `fid` > 50000
6
UPDATE `latest`
SET `date` = '2010-09-1'
WHERE `date` = '2009-1-10'
AND `fid` > 50000
7
UPDATE `latest`
SET `date` = '2010-09-1'
WHERE `date` = '2009-1-10'
AND `fid` > 50000
8
UPDATE `latest`
SET `date` = '2010-09-1'
WHERE `date` = '2009-1-10'
AND `fid` > 50000
9
UPDATE `latest`
SET `date` = '2010-09-1'
WHERE `date` = '2009-1-10'
AND `fid` > 50000
10
UPDATE `latest`
SET `date` = '2010-09-1'
WHERE `date` = '2009-1-10'
AND `fid` > 50000
11
UPDATE `latest`
SET `date` = '2010-09-1'
WHERE `date` = '2009-1-10'
AND `fid` > 50000
12
UPDATE `latest`
SET `date` = '2010-09-1'
WHERE `date` = '2009-1-10'
AND `fid` > 50000
正如您所看到的,printi打印得很好,但是sOldDate和sNewDate都将i视为1。然后,我更改了sOldDate和sNewDate,如下所示:

sOldDate = string.format("2009-%d-10", i)
sNewDate = string.format("2010-09-%d", i)
我仍然得到两个日期的输出,如图所示:2009-1-10和2010-09-1

这个循环可能有什么问题。我已经在这样的循环上工作了很长时间,直到今天他们才让我失望


我想这只是我的一个愚蠢的错误,我无法识别。非常感谢您的帮助。

是的,问题是您每次都在覆盖sUpdate

第一次,您将覆盖字符串占位符%s,之后,该字符串将不再更改

请尝试重命名内部sUpdate。我想你希望所有的变量都是局部变量

编辑:正如您在上面看到的,我保留了您的变量名,但是内部的sUpdate并没有覆盖外部的sUpdate,因为它声明为局部的。默认情况下,Lua中的所有变量都是全局变量,因此最好确保使用声明局部变量和局部变量。我会选择不同的变量名,比如:

local sUpdateTemplate = [[UPDATE `latest`
SET `date` = '%s'
WHERE `date` = '%s'
AND `fid` > 50000]]

for i = 1, 12 do
  print( i )
  local sOldDate = "2009-"..tostring(i).."-10"
  local sNewDate = "2010-09-"..tostring(i)
  local sUpdate = string.format( sUpdateTemplate, sNewDate, sOldDate )
  print( sUpdate )
end

如上所述,您需要在循环内重命名sUpdate,以避免覆盖外部的sUpdate并中断string.format。然后,您可以使用string.format中的%02d将焊盘编号归零,长度至少为两位数:

local sUpdate = [[UPDATE `latest`
SET `date` = '%s'
WHERE `date` = '%s'
AND `fid` > 50000]]

for i = 1, 12 do
  print( i )
  local sOldDate = string.format("2010-%02d-10", i)
  local sNewDate = string.format("2010-09-%02d", i)
  local update = string.format( sUpdate, sNewDate, sOldDate )
  print( update )
end

我不是lua专家,但在for循环中设置的i=1似乎从未递增,即i++@Luas for循环就是这样编程的。检查我只是做了一些阅读和周围的Lua循环,可以看到我的评论是不正确的,就像我说没有Lua专家,更多的是观察而不是回答。谢谢你的更正-嗯,就像我说的,我犯了个愚蠢的错误。我通常在循环中声明sUpdate,因此从未遇到任何麻烦。谢谢你的建议另外,我希望你不介意我选择furq的答案而不是你的答案,因为他是SO的新手,需要一些分数^_^我认为你应该为子孙后代选择你认为最好的答案。
local sUpdateTemplate = [[UPDATE `latest`
SET `date` = '%s'
WHERE `date` = '%s'
AND `fid` > 50000]]

for i = 1, 12 do
  print( i )
  local sOldDate = "2009-"..tostring(i).."-10"
  local sNewDate = "2010-09-"..tostring(i)
  local sUpdate = string.format( sUpdateTemplate, sNewDate, sOldDate )
  print( sUpdate )
end
local sUpdate = [[UPDATE `latest`
SET `date` = '%s'
WHERE `date` = '%s'
AND `fid` > 50000]]

for i = 1, 12 do
  print( i )
  local sOldDate = string.format("2010-%02d-10", i)
  local sNewDate = string.format("2010-09-%02d", i)
  local update = string.format( sUpdate, sNewDate, sOldDate )
  print( update )
end