Welcome to xTibia - Sua comunidade de Otserv e Tibia

Registre-se para utilizar nossas ferramentas e baixar conteúdos. Quando registrado e logado em sua conta, lhe garantimos uma experiência incrível em nossa comunidade!

Jovial

Tutorial De Luasql

20 posts neste tópico

Postado (editado)

[center][color="red"][size=7]Tutorial de LuaSQL[/size][/color]
[size=1]Créditos: Jovial[/size][/center]

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 [url="http://img114.imageshack.us/img114/4632/tutorialluasqlsr7.jpg"]clique aqui[/url].


[size=5][color="blue"]O que é LuaSQL?[/size][/color]
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: [url="http://www.keplerproject.org/luasql/br/manual.html"]

Registre-se para ver link(s).



[color="blue"][size=5]Conexão[/size][/color]

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.
[code]assert(luasql.mysql()) para MySQL
assert(luasql.sqlite3()) para SQLite[/code]
Para fazer a conecção temos que salvar esse 'ambiente' em uma variável, Exemplo.
[code]environment = assert(luasql.mysql())
ou
environment = assert(luasql.sqlite3())[/code]
A função para se conectar com o banco de dados tem a seguinte sintaxe:
[code]connection = assert(environment:connect(mysqlDatabase, mysqlUser, mysqlPass, mysqlHost, mysqlPort)) para MySQL
ou
connection = assert(environment:connect(sqliteDatabase)) para SQLite[/code]
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.

[color="blue"][size=5]Variáveis da conexão em Mysql[/size][/color]

Como vocês podem ver na conexão com MySQL Precisamos saber 5 coisas mysqlDatabase, mysqlUser, mysqlPass, mysqlHost e mysqlPort.
[code]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))[/code]

[color="blue"][size=5]Variáveis da conexão em SQLite[/size][/color]

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:
[code]connection = assert(environment:connect('forgottenserver.s3db'))[/code]

[color="blue"][size=5]Finalizando uma conexão[/size][/color]

Para finalizar uma conexão você precisa usar os seguintes comandos:
[code]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')[/code]

[color="blue"][size=5]Executando comandos[/size][/color]

Para executar algum comando SQL em lua usamos uma função com a seguinte sintaxe:
[code]assert(connection:execute('Comando SQL'))[/code]
Exemplo:
[code]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.[/code]

[color="blue"][size=5]Pegando informações[/size][/color]

Para pegar alguma informação de seu banco de dados você precisará salvar seu comando em uma variável, Exemplo:
[code]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.[/code]
Agora para pegar informações dessa variável, no caso 'cursor', você ira ter que usar algumas funções como:
[code]numrows() Retorna: o número de registros no resultado da busca.
fetch() Recupera o próximo registro do resultado.[/code]
Você ira ver como usá-los logo abaixo nos exemplos.

[color="blue"][size=5]Exemplos[/size][/color]

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
[code]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[/code]

Rank por action.
Tag: <action itemid="id do item desejado" script="Rank.lua"/>
[code]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[/code]
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. Editado por Jovial

Compartilhar este post


Link para o post
Compartilhar em outros sites
Aprovado jovis...
xD...
bah me disculpa intrometer como voce é preguissoso e nao quer botar dai os noob vao se ###### vao chorar e vao para de programar porque não consegue ahesues :D.

[size=5]
Para fazer o query selecionar uma coluna ou tabela é usado ASSENTO ` NÂO AS ' << aspinha:
exemplo para notar:
("SELECT `rank_id` FROM `players` WHERE `name` = " .. p_name .. ";)
onde uma var é normal em todo lua.
:P
[/size]

Compartilhar este post


Link para o post
Compartilhar em outros sites
[b]@Jovial
@Palmares_[/b]
Legal ver vocês aqui.

Tomara que queiram fazer parte da familia XTibia

Ótimo tutorial

[b][size=5][color="#9ACD32"]SUPER APROVADO[/color][/size][/b]


Ps.: Se tiverem contato com
[quote][color="#FF0000"][b][V][/b][/color]Dragonheart[/quote]
PLX... peçam pra ele vir aqui no XTibia também

[img]http://www.mwr4ever.com.br/sapo/smile_bye.gif[/img]

Compartilhar este post


Link para o post
Compartilhar em outros sites
Fou falar pro Dragonheart aparecer por aki =D

Compartilhar este post


Link para o post
Compartilhar em outros sites
[quote name='Jovial' post='401302' date='15:54 - 11/10/2007 ']Fou falar pro Dragonheart aparecer por aki =D[/quote]
[img]http://i94.photobucket.com/albums/l99/iluminado_2006/aplauso.gif[/img]

[size=5]Te amuuuuuuuuuuuu[/size]

[img]http://www.mwr4ever.com.br/sapo/XTibia_smile.gif[/img]

Compartilhar este post


Link para o post
Compartilhar em outros sites
Muito bom tutorial, eu até leria, se não soubesse, como já sei tudo disso, só me resta comentar. :P

Compartilhar este post


Link para o post
Compartilhar em outros sites
s tambem gostei muito bem explicado e bem detalhado vlw ^^!

Compartilhar este post


Link para o post
Compartilhar em outros sites
@Jovial(pelo tuto) e Nostradamus(por participar da xfusion)
No site criado pela exfusion projects ele se conecta a database "otserv"(axo que é essa).
Pelo que vi, ele só funciona em SQL, para usa-lo em SQLite como faço???

É só mudar o modo de conecção e etc??
E como coloco uma DB de SQLite pra rodar em server(com o que o site se conecta),
pelo que sei, ele não precisa de um servidor separado.

Já que estamos em uma era de readaptaçoes, eu axo que seria bem melhor
esquecer-mos o SQL e ficar apenas com SQLite, poi eh bem mais pratico ;)

Grato, KingCPI

Compartilhar este post


Link para o post
Compartilhar em outros sites
Simplesmente formidável.

Tutorial com certeza aprovado e fixado ;D

Parabéns Jovial e palmares.

Está [img]http://www.xtibia.com/forum/style_images/skinoficia/rating_5_mini.gif[/img]


Sem mais.

Compartilhar este post


Link para o post
Compartilhar em outros sites
@KingCPI
Eu não troco o tradicional mysql pelo sqlite, acho o mysql muito bom e mais prático, posso fazer oque eu quiser de qualquer lugar do mundo =D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!


Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.


Entrar Agora

  • Conteúdo Similar

    • Por Brunds
      Fala guys tópico atualizado 29/06/2017 espero que gostem
       
       
      Cidades e Construções
      Registre-se para ver spoiler(s).
       
       
      Aguardo criticas construtivas para como posso melhorar ^^
    • Por Ckfox
      --Por favor me digam se me apoião ou não! Isso e muito importante para mim !--

      Registre-se para ver attachment(s).

      --Mapa do tópico--
      Resumo
      Inovações
      Introdução
      Vagas
      Objetivos
      Imagens
      Spoilers
      Atualizações
      Conclusão

      --Resumo--

      Os players começarão com um livro de receitas básico que você fará apenas os itens necessários!
      Dentro do livro terá algumas receitas que se você possuir os materiais necessários para produzir a receita desejada você apenas precisa utiliza-la para criar o item!
       
      Com o tempo você vai evoluindo seu livro assim desbloqueando novas receitas.

      Cinza = Comum (Inicial)
      Azul = Incomum (Comprado)
      Amarelo = Raro (Vocation)
      Vermelho = Épico (Quest)
      Roxo = Lendário (???)
       
      OBS: Cada livro tem no mínimo 1 receita única!
      Por enquanto temos apenas dois tipos diferentes de livro!
      Fogo = Magic
      Pá = Utensílios
      Bag = Bags/Backpacks
      Estamos utilizando a versão 8.6 pois temos maior liberdade de modificações!
      O cliente será próprio pois terá diversos itens novos

      --Inovações--
      Teremos diversos sistemas inovadores, mas que deixarei para descobrirem por si mesmos.
      Mas abaixo vou divulgando alguns para que desperte seus interesses em nosso servidor!
       
      House system
      O house system em nosso server terá um grande diferencial pois terá "terrenos" em diversas locais sorteados no meio do mapa pode ate mesmo ter um no meio de uma hunt e você mesmo construirá sua casa no espaço já delimitado! 

      --Introdução--
      Esta cansado desses serves padrões de poketibia, narutibia, dbo ou tibia ?
      Hoje venho trazer uma grande oportunidade/inovação para o mundo tibia !
       
      Então hoje venho pedir uma ajuda da comunidade do um sitezinho qualquer !
      Consigo fazer sprites e sistemas muito bons mas quero que a qualidade das sprites seja muito boas!  
      Desenhar não e meu ponto forte, nem mesmo mapping, mas consigo me virar com o vago conhecimento que tenho nessa área!
      Por isto estou aqui pedindo a colaboração de vocês, para que nosso server seja o melhor possível!
       
      Que tal trazermos um mundo de sobrevivência ao tibia ?

      --Vagas--
      Spriter -- Toda ajuda e bem vinda! 
      Scripter -- Toda ajuda e bem vinda! 
      WebDisigner -- Não sei se irei fazer site ainda! 
      Mapper -- Toda ajuda e bem vinda! 
      Programador -- Toda ajuda e bem vinda! 
       
      Me viro em todas mas uma ajuda sempre e bem vinda!

      --Objetivos--
      ---1---
      Meu primeiro objetivo e fazer com que as pessoas saiam do automático e testem novas fronteiras no mundo tibia
      --2--
      Criar sistemas com a melhor qualidade possível
      -3-
      Trazer a felicidade as pessoas

      Registre-se para ver link(s).
      --Imagens--
      OBS: tera muito mais ilhas! estas 3 são apenas uma demonstração do que ja foi feito o mesmo para os itens!!!



      To meio sem tempo agora mas quando possível disponibilizo mais imagens!

      Registre-se para ver link(s).
      --Spoilers--

      Registre-se para ver link(s).

      Registre-se para ver link(s).

      Registre-se para ver link(s).
      Registre-se para ver spoiler(s).
      1.1
      Para próxima atualização pretendo já ter feito a sprite e o script de todas receitas !

      Registre-se para ver link(s).
      --Conclusão--
      Então galera essa e minha ideia caso queiram ajudar ou dar sugestões e só comentar ai !
      OBS: Não pretendo parar jamais com este projeto!

      Site provisório: Registre-se para ver link(s).


      Registre-se para ver link(s).
      Obrigado por chegar ate aqui 

      Registre-se para ver attachment(s).
    • Por Gabrieltxu
      fala ai galerinha estava vendo que varias pessoas estavam querendo um NPC de Egg system para server com level system PDA então achei esse Script para server com level em outro forume irei trazer para vocês xD


      Comesando:
      1) Vai para onde o seu servidor esta e de lá para \ data \ npc
      crie um arquivo XML com o nome de "Vendedor de Ovo"
      Coloque isso dentro da XML do NPC

      Registre-se para ver spoiler(s).



      Pronto é isso Creditos: Não sei não estava marcando no site onde peguei.
    • Por LuckOake
      Oláá galere, de buenas? Trouxe pra vocês mais um sistema que é útil para muitos servers, o Characters Market System (Mercado de Personagens)

      O que é: É um sistema em que você pode colocar um character à venda por um preço que você mesmo define, tudo dentro do jogo!

      Gogo ao script:

      Registre-se para ver spoiler(s).


      Configurando:

      level = 30 -- Level mínimo que o character deve ter para ser vendido
      min_price = 100 -- Preço mínimo de um character
      max_price = 1000000 -- Preço máximo de um character[/CODE]

      [size=5][u][b]Comandos:[/b][/u][/size]
      [CODE]!character buy,nome -- Compra um character
      !character sell,nome,preço -- Vende um character
      !character remove,nome -- Remove um character da lista de vendas, caso ele esteja à venda
      !character list -- Vê a lista de characters disponíveis para a venda[/CODE]

      [size=5][u][b]Observações:[/b][/u][/size]
      [CODE]- O character é transferido para a conta do comprador automaticamente ao ser comprado
      - Funciona em 0.3.6 pra cima
      - Em algumas versões de servers, pode dar erro na list de characters.[/CODE]

      [size=5][u][b]Créditos:[/b][/u][/size]
      [CODE]LuckOake -- Pelo Sistema
      Oneshot -- Pela ajuda com algumas funções
      Demonbholder -- Pela ajuda com algumas funções[/CODE]

      É isso, obrigado.