Tutorial de LuaSQL
Créditos: Jovial
Olá pessoal, estou aqui para ensinar um pouco de LuaSQL para vocês. Este tutorial foi feito por mim, Palmares me deu uma mão no fim, procurando erros. Espero que eu consiga explicar bem, para entender melhor o tutorial leia um tutorial ensinando os comandos de SQL(INSERT, CREATE, UPDATE, etc.).
Não são todos os servers que possuem o LuaSQL, você pode usar o Forgotten Server.
Para ver este tutorial em forma de imagem clique aqui.
O que é LuaSQL?
LuaSQL é uma interface simples entre Lua e um sistema gerenciador de banco de dados (DBMS). Ela permite que um programa Lua:
* Conecte-se aos bancos de dados ODBC, ADO, Oracle, MySQL, SQLite, JDBC e PostgreSQL;
* Execute comandos arbritários do SQL;
* Recupere resultados no modo linha-a-linha de um cursor SQL.
LuaSQL é um software livre e utiliza a mesma licença do Lua 5.0.
Manual: http://www.keplerproject.org/luasql/br/manual.html
Conexão
Antes de você adicionar/modificar informações no seu banco de dados, você precisa se conectar a ele, primeiro tempos que criar o 'ambiente' de conexão, onde você ira definir que tipo de banco de dados está usando, Exemplo.
assert(luasql.mysql()) para MySQL assert(luasql.sqlite3()) para SQLite
Para fazer a conecção temos que salvar esse 'ambiente' em uma variável, Exemplo.
environment = assert(luasql.mysql()) ou environment = assert(luasql.sqlite3())
A função para se conectar com o banco de dados tem a seguinte sintaxe:
connection = assert(environment:connect(mysqlDatabase, mysqlUser, mysqlPass, mysqlHost, mysqlPort)) para MySQL ou connection = assert(environment:connect(sqliteDatabase)) para SQLite
Como vocês podem ver, no exemplo acima eu 'guardei' a conexão em uma variável chamada 'connection', para poder executar os comandos depois.
Variáveis da conexão em Mysql
Como vocês podem ver na conexão com MySQL Precisamos saber 5 coisas mysqlDatabase, mysqlUser, mysqlPass, mysqlHost e mysqlPort.
mysqlDatabase é o Banco o nome do Banco de Dados que você deseja usar, Exemplo: o Forgotten Server usa o 'theforgottenserver'(se você não alterou). mysqlUser é o usuário usado para se conectar com o MySQL, geralmente é 'root'. mysqlPass é a senha usada para a conexão com o Mysql. mysqlHost é o ip de onde se encontra o servidor de MySQL, como ele deverá estar no seu computador deixe como 'localhost'. mysqlPort é a porta usada para a conexão com o MySQL, use a porta '3306'. Ficando: connection = assert(environment:connect('theforgottenserver', 'root', 'minha senha', 'localhost', 3306))
Variáveis da conexão em SQLite
Para criar uma conexão só é preciso saber o sqliteDatabase, que no forgotten server é 'forgottenserver.s3db', como podem ver, é o nome do arquivo que ira abrigar o banco de dados.
Ficando:
connection = assert(environment:connect('forgottenserver.s3db'))
Finalizando uma conexão
Para finalizar uma conexão você precisa usar os seguintes comandos:
connection:close() para fechar sua conexão(troque connection pela variável que você armazenou sua conexão) e environment:close() para fechar seu 'ambiente' de conexão(troque environment pela variável que você armazenou seu 'ambiente')
Executando comandos
Para executar algum comando SQL em lua usamos uma função com a seguinte sintaxe:
assert(connection:execute('Comando SQL'))
Exemplo:
assert(connection:execute("INSERT INTO `accounts` (`id`, `password`, `type`, `premdays`) VALUES ('222222', 'tibia', '1', '365');")) Isto irá criar uma conta 222222/tibia do tipo 1(conta normal) com 365 dias de premium.
Pegando informações
Para pegar alguma informação de seu banco de dados você precisará salvar seu comando em uma variável, Exemplo:
cursor = assert(connection:execute("SELECT `password` FROM `accounts` WHERE `id` = '222222';")) Nesse caso coloquei um comando que ira pegar o valor de 'password' na tabela accounts onde o id(numero da conta) for 222222.
Agora para pegar informações dessa variável, no caso 'cursor', você ira ter que usar algumas funções como:
numrows() Retorna: o número de registros no resultado da busca. fetch() Recupera o próximo registro do resultado.
Você ira ver como usá-los logo abaixo nos exemplos.
Exemplos
TalkAction que cria account.
Tag: <talkaction words="/createacc" script="account.lua"/>
Modo de usar: Dizer '/createacc "222222/tibia' isso irá criar uma conta 222222/tibia
function onSay(cid, words, param) --TalkAction by Jovial if (getPlayerAccess(cid) > 3) then tmp,tmp2,acc,pass = string.find(param,'(%d*)/(%w*)') --Esta linha acima pega os valores digitados na fala do player e separa eles em account e senha. --Tutorial de patterns em ingles: http://lua-users.org/wiki/PatternsTutorial if (acc ~= nil and pass ~= nil) then environment = assert(luasql.mysql()) --Criamos um ambiente de conexão connection = assert(environment:connect('theforgottenserver', 'root', 'minha senha', 'localhost', 3306)) --Agora nos conectamso com o MySQL (não esqueça de colocar sua senha acima) ccursor = assert(connection:execute("SELECT * FROM `accounts` WHERE `id` = `"..acc.."`;")) --Esta linha seleciona os valores da tabela accounts onde o id(numero da conta) for igual ao que você digitou, para verificar se a conta existe. if (cursor:numrows() == 0) then --cursor:numrows() retorna a quantidade de resultados, neste caso se eel retornar mais de 0 é porque a conta ja existe, se retornar 0 ela não existe. assert(connection:execute("INSERT INTO `accounts` (`id`, `password`, `type`, `premdays`) VALUES ("..acc..", "..pass..", 1, 0);")) --Aqui ele ira criar a nova conta. doPlayerSendTextMessage(cid,MESSAGE_STATUS_CONSOLE_RED,words..' "'..param..' (Account created.)') else doPlayerSendCancel(cid,'This account already exists.') doPlayerSendTextMessage(cid,MESSAGE_STATUS_CONSOLE_RED,words..' "'..param..' (This account already exists.)') end connection:close() --Fechando a conexão environment:close() --Fechando o ambiente de conexão else doPlayerSendCancel(cid,'Invalid account or password.') doPlayerSendTextMessage(cid,MESSAGE_STATUS_CONSOLE_RED,words..' "'..param..' (Invalid account or password.)') end else doPlayerSendCancel(cid,'You can not use this command.') end return FALSE end
Rank por action.
Tag: <action itemid="id do item desejado" script="Rank.lua"/>
function onUse(cid,item,frompos,item2,topos) --Action by Jovial local nomes = {} local level = {} environment = assert(luasql.mysql()) --Criamos um ambiente de conexão connection = assert(environment:connect('theforgottenserver', 'root', 'minha senha', 'localhost', 3306)) --Agora nos conectamos com o MySQL (não esqueça de colocar sua senha acima) cursor = assert(connection:execute("SELECT `name`,`level` FROM `players` ORDER BY `level` DESC LIMIT `0`, `10`;")) --Aqui peguei os valores 'name' e 'level' dos 10 players com maior level, agora tenho que passar esse valor para uma tabela para que eu possa usá-los --By Palmares row = cursor:fetch ({}, "a") --A variável 'row' virou uma tabela contendo os valores do primeiro player(o com level mais alto) while row do --Irá repetir enquanto existir valores em 'row' table.insert(nomes, row.name) --Irá adicionar o valor contido em 'row.name' que é o nome de um player na tabela nomes table.insert(level, row.level) --Irá adicionar o valor contido em 'row.level' que é o level de um player na tabela level row = cursor:fetch(row, "a") --Irá pegar os valores do próximo player end --/By Palmares connection:close() --Fechando a conexão environment:close() --Fechando o ambiente de conexão msg = tableToList(nomes,level) --Função criada por mim para passar os valores coletados para uma lista doPlayerPopupFYI(cid, msg) --Irá abri uma janela para o player, que irá mostrar o rank return TRUE end function tableToList(nomes,level) --Function by Jovial local tmp local str = '' for tmp = 1,#nomes do if (str == '') then str = nomes[tmp]..'['..level[tmp]..']' else str = str .. '\n'..nomes[tmp]..'['..level[tmp]..']' end end return str end
Espero que vocês gostem! Qualquer dúvidas poste aqui.
Se achar algum erro no tutorial me avise, pois ele é bem grande e pode ter passado algo despercebido.
Abraço;
Jovial.