错误处理:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
local function add(a,b) assert(type(a) == "number", "a 不是一个数字") assert(type(b) == "number", "b 不是一个数字") return a+b end add(10) #如果正确执行,不做任何操作,否则第二个参数当做错误信息。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
error (message [, level]) 终止正在执行的函数,并返回message的内容作为错误信息(error函数永远都不会返回) 通常情况下,error会附加一些错误位置的信息到message头部。 Level参数指示获得错误的位置: Level=1[默认]:为调用error位置(文件+行号) Level=2:指出哪个调用error的函数的函数 Level=0:不添加错误位置信息
数据库访问:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
LuaSQL。他是开源的,支持的数据库有:ODBC, ADO, Oracle, MySQL, SQLite 和 PostgreSQL。 可以使用luarocks安装库 luarocks install luasql-sqlite3 luarocks install luasql-postgres luarocks install luasql-mysql luarocks install luasql-sqlite luarocks install luasql-odbc _______________________________________________ require "luasql.mysql" --创建环境对象 env = luasql.mysql() --连接数据库 conn = env:connect("数据库名","用户名","密码","IP地址",端口) --设置数据库的编码格式 conn:execute"SET NAMES UTF8" --执行数据库操作 cur = conn:execute("select * from role") row = cur:fetch({},"a") --文件对象的创建 file = io.open("role.txt","w+"); while row do var = string.format("%d %s ", row.id, row.name) print(var) file:write(var) row = cur:fetch(row,"a") end file:close() --关闭文件对象 conn:close() --关闭数据库连接 env:close() --关闭数据库环境
面向对象:
lua中对象就是table Role = { hp = 100 } function Role.addHp(hp) Role.hp = Role.hp + hp end Role.addHp(50) print(Role.hp)
类:
Lua 没有类的概念,不过可以通过元表(metatable)来实现与原型 prototype 类似的功能,而 prototype 与类的工作机制一样,都是定义了特定对象行为。Lua 里的原型特性主要使用元表的 __index 事件来实现,这样当调用对象没定义的方法时,会向其元表的 __index 键(事件)查找。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
Role = { hp = 100 } function Role:new(o) o = o or {} setmetatable(o, self) self.__index = self self.aaa='safasdf' return o end function Role:addHp(hp) self.hp = self.hp + hp end r = Role:new() for i ,j in pairs(r) do print(i,j..'aaa') print(1) end r:addHp(50) print(r.hp) print(r.aaa)
继承同理,写个函数,定义当前的表的元表是父类(也是表),执行这个方法相当于实例化对象(返回一个表)。
防sql注入:
--防止sql注入 local ch_param = ngx.req.get_uri_args()["ch"] or '' --使用ngx.quote_sql_str防止sql注入 local query_sql = "select id, ch from test where ch = " .. ngx.quote_sql_str(ch_param) res, err, errno, sqlstate = db:query(query_sql) if not res then ngx.say("select error : ", err, " , errno : ", errno, " , sqlstate : ", sqlstate) return close_db(db) end for i, row in ipairs(res) do for name, value in pairs(row) do ngx.say("select row ", i, " : ", name, " = ", value, "<br/>") end end