使用luasql-sqlite3拼接SQLite语句时出现nil值拼接错误,问题何在?
Lua字符串拼接报错的原因及解决方法
你遇到的问题根本不是字符串拼接本身的问题,而是运算符优先级和括号范围搞错了。
看你出错的代码:
print(db:execute[[SELECT title FROM Table1 WHERE char1 =]] .. [[ "JI";]] )
Lua里函数调用的优先级比字符串拼接..高,所以这段代码会被Lua解析成:
(print(db:execute[[SELECT title FROM Table1 WHERE char1 =]])) .. [[ "JI";]]
也就是先执行db:execute传入不完整的SQL语句(SELECT title FROM Table1 WHERE char1 =),这时候SQL语法错误,execute返回nil;然后print打印这个nil,而print本身的返回值也是nil;最后你尝试把nil和后面的字符串拼接,自然就抛出attempt to concatenate a nil value的错误。
正确的写法是把拼接后的完整字符串作为execute的参数,需要给拼接表达式加上括号,确保先完成字符串拼接,再传给execute:
print(db:execute( [[SELECT title FROM Table1 WHERE char1 =]] .. [[ "JI";]] ))
或者更简洁的写法——Lua里相邻的字符串字面量会自动拼接,不需要..:
print(db:execute([[SELECT title FROM Table1 WHERE char1 =]] [[ "JI";]]))
另外提醒一句:直接拼接字符串写SQL存在注入风险,更安全的方式是用参数绑定:
local stmt = db:prepare("SELECT title FROM Table1 WHERE char1 = ?") stmt:bind("JI") local result = stmt:execute() print(result) stmt:close()
内容的提问来源于stack exchange,提问作者Nikulok
相关产品推荐
相关产品推荐

