Ir para conteúdo
Entre para seguir isso  
Mock

[nv.av] Usando luaSQL

Recommended Posts

Mock    32
Mock

LuaSql

 

 

 

Apesar de já existir um tutorial sobre luaSql no forum ele é antigo e agora usa outro metodo.

 

  • O que é?

LuaSql é você inserir, alterar, deletar, subistituir valores no bacno de dados MySql ou Sqlite de seu servidor facil e rapido.

  • Como uso?

É relativamente simples. caso você ja tenha mexido com MySql não vai ter 1 pingo de duvidas.

Bom vamos começar pegando um valor da database.

Para pega um valor antigamente tinha uma treta GIGANTESCA usando assert e outras coisas agora é mais facil basta usar a função: db.getResult(query)

Essa função ela executa query no servidor Mysql ou sqlite vamos dar um exemplo. vamos criar uma Query que pega o level do player.

local [color="Blue"][b]Query[/b][/color] = "SELECT `level` FROM `otserv`.`players` WHERE `name` = " .. playername .. ";"

Vamos palavra pro palavra se você sabe ingles vai entender.

SELECT > selecionar

level > nivel

FORM > em

otserv.players > players otserv como nome da database. é a mesma q c poe no configu.lua eu puis otserv mais a sua pode ser diferente.

WHERE > onde

name = playername > nome = nomedoplayer.

Traduzindo:

SELECIONAR `level` EM `players` ONDE `name`= nomedoplayer.

Resumindo ele vai abrir a DB em players vai pegar o valor level de todos os players que tiverem o nome igual a variavel nomedoplayer

Em pratica...

Suponhamos que na DB tenha um player chamado Skyen Hasus e queremos pegar o level e o id dele. fazemos assim:

local coisas = [b][color="Blue"]db.getResult[/color][/b]([color="DarkRed"]"SELECT `level`,`id` FROM `otserv`.`players` WHERE `name` = 'Skyen Hasus';"[/color])
player_level = coisas:getDataInt("level")
player_id = coisas:getDataInt("id")

PRONTO! :D

Lembrese que depois de SELECT vocÊ deve colocar todos os valores entre `` são ascentos invertidos NÃO ASPASA. e separados por VIRGULA.

 

Agora vamos INSERIR um valor...

para isso usamos esta função: db.executeQuery(Query)

A diferença dessa para a outra que essa ele apenas executa a outra executa e retorna valores.

Bom vamos inserir um valor.

para isso se usa isso:

[color="DarkRed"]"INSERT INTO `player_deaths` (`player_id`, `time`, `level`, `killed_by`, `altkilled_by`) VALUES (1, " .. os.time() .. ", " .. getPlayerLevel(cid) .. ", 'demon', 'demon');"[/color]

Esplicando...

INSERT INTO > Inserir em

`player_deaths` Tabela player_deaths

(`player_id`, `time`, `level`, `killed_by`, `altkilled_by`) > os valores player_id time level killed_by altkilled_by.

VALUES > significa que os valores acima coresponde a...

(1, " .. os.time() .. ", " .. getPlayerLevel(cid) .. ", 'demon', 'demon'); > player_id = 1 time = os.time(), level = Level do player, killed_by = demon, altkilled_by = demon.

Resumindo inserir na tablela playerdeaths os valores player_id time level killed_by altkilled_by que correspondem a player_id = 1 time = os.time(), level = Level do player, killed_by = demon, altkilled_by = demon.

:D

Entendeu?

Vamos a um exemplo de uso:

db.executeQuery("INSERT INTO `player_deaths` (`player_id`, `time`, `level`, `killed_by`, `altkilled_by`) VALUES (" .. getPlayerGUID(cid) .. ", " .. os.time() .. ", " .. getPlayerLevel(cid) .. ", 'Um bixo', 'Um bixo');")

siginifica que o player morreu na hora que vc executou isso e ele morreu pra um bicho chamado 'Um bixo' xDDD.

 

  • O que acontece se eu inserir um valor usand INSERT into e o valor INDEX ja existir como id? ou apenas mudar UM VALOR de algo?

Toda tabela tem um valor definido como INDEX como digamos um valor central no caso da tabela players é id, o nome dos players pode até se repetir porem o ID não!!! provavelmente vai dar algum erro indesejado entao no caso deveriamos verificar se o valor ja e xiste e usar a função UPDATE assim:

[b][color="Blue"]db.executeQuery[/color][/b]([color="DarkRed"]"UPDATE `otserv`.`players` SET `name` = 'Joao' WHERE `players`.`id` ="..getPlayerGUID(cid).." AND CONVERT( `players`.`name` USING utf8 ) = '"..getPlayerName(cid).."' LIMIT 1 ;"[/color])

No caso disso eu iria mudar o NOME do player pois e um valor ja existente x.x

vamos esplicar.

UPDATE > atualizar

otserv.players > database oserv na tabela players

SET > mudar

name = 'joao'

WHERE > onde

players.id = getPlayerGUID(cid) > tabela players o valor id é igual a getPlayer ID (não cid)

AND CONVER > E converter

( `players`.`name` USING utf8 ) = '"..getPlayerName(cid).."' LIMIT 1 ; > converter player.name usando utf8 = "getPlayerName(cid) está dizendo que o nome antigo é getPlayerName pois primeiro ele vai pegar todos os valores e converter para o novo nome.

Agora vamos inserir um valor caso exista vamos atualiza-lo!

Vamos usar como exemplo minha função: setAccountStorageValue

function setAccountStorageValue(accid,value_id,value)
        [b][color="Blue"]dofile[/color][/b]("config.lua")
        if [b][color="Blue"]string.len[/color][/b](value) >= 10 then
           [b][color="Blue"]error[/color][/b]("[setAccountStorageValue]: value is too long!")
           return FALSE
        end
        local coisa = [b][color="Blue"]db.getResult[/color][/b]("SELECT * FROM `account_storage` WHERE `account_storage`.`id` = ".. accid .." AND `account_storage`.`value_id` ="..value_id..";")
        if coisa:[b][color="Blue"]getID() [/color][/b]== -1  then
           [color="Blue"][b]db.executeQuery[/b][/color]("INSERT INTO `"..sqlDatabase.."`.`account_storage` ( `id` ,`value_id`, `value`  ) VALUES ( '"..accid.."','"..value_id.."', '"..value.."' ); ")
           [b][color="Blue"]doBroadcastMessage[/color][/b]('insert', 22)
        else
            [b][color="Blue"]doBroadcastMessage[/color][/b]('updt'..coisa:[b][color="Blue"]getDataInt[/color][/b]("value")..'', 22)
            [b][color="Blue"]db.executeQuery[/color][/b]("UPDATE `"..sqlDatabase.."`.`account_storage` SET `value` = '"..value.."' WHERE `account_storage`.`id` ="..accid.." AND `account_storage`.`value_id` ="..value_id.." AND CONVERT( `account_storage`.`value` USING utf8 ) = '"..coisa:[b][color="Blue"]getDataInt[/color][/b]("value").."' LIMIT 1 ;")
        end
end

Veja que primeiro eu selecionei o valor e usei: coisa:getID() == -1 para saber se o valor existe. se ele der return em -1 quer dizer que nao existe! entao eu usei INSERT INTO, porem caso o valor ja esteje lá eu usei UPDATE.

Repare que usei: "SELECT * FR" um * siginifica que estou pegando TODOS os valores existentes.

 

Viu com é simples? não e tão dificil assim :D.

Caso haja duvidas poste no topico e desfrutem das suas funções!

 

Quase esquecendo...

db.getResult > pega um valor

db.executeQuery > executa algo no servidor MySql

coisa:getDataInt("value") > coisa vc deve definir como coisa = db.getResulte "value" é o valro que vc quer pegar exemplo: getDataInt("level") Essa função SÓ PEGA NUMERO!

getDataString("name") >> mesma coisa porem so string.

 

Acho que é isso (Y)

Editado por Mock
~=lua

Compartilhar este post


Link para o post
Conde2    0
Conde2

Muito bom o tuorial Mock =D

O problema é que o povo nao ta se envolvendo muito com o assunto =/

Hoje em dia ta cada vez mais dificil ver scripters bons xD

Ainda bem que existe exeçoes =DD

 

Eu já sabia de quase tudo que tava ai, mais vai ajuda os mais novatos em SQL

Flw

Compartilhar este post


Link para o post
Mock    32
Mock

Nossa menino sabido xD

brinks

assim meu foco foi mais ensinar a usar esse outro metodo posi o antigo vc tinah quer fazer uma TRETA gigante com assert agora não presisa mais.

Compartilhar este post


Link para o post
Fletch    0
Fletch

Muito bom eu lembro que eu n sabia q tinha o UPDATE ai eu deletava e adicionava denovo mudando as info.

 

Tem mais muitas coisas no SQL:

Pra usar dentro do SELECT:

{

LIKE

UNION

BETWEEN

IN

TOP

AS

JOIN

}

INDEPENDENTES QUE NEM SELECT INSERT E UPDATE

{

TRUNCATE TABLE

DROP TABLE

DROP DATABASE

CREATE DATABASE

CREATE TABLE

}

E mais um monte de coisas que um mero ser mortal como eu não tem como saber de cor... por isso eu sempre consulto esse site W3SCHOOLS que insina alem de sql PHP ASP XML HTML e outras mais coisas la

Compartilhar este post


Link para o post
lyndell    0
lyndell

Hoje com os ots todos em mysql/sqlite isso deveria ser uma das primeiras coisas a serem ensinados para os scripters, ai vc aprende a fazer query no php (nao é dificil), pronto vc pode mecher em tudo do ot pelo site ou dentro do game (scripts).

 

Exelente tutorial. ^^

Compartilhar este post


Link para o post
Conde2    0
Conde2

@Mock

 

kkkkk

Mais eu to longe de sabe mais da metade =/

Eu sei bem o basico dsahdaussa

so que to me dedicando quase 2 anos de scripter sérios

E com vc me ajudando kkk fica bem mais facil

 

VLw aew mlk

Compartilhar este post


Link para o post
Gpwjhlkdcf    21
Gpwjhlkdcf

Faz um bom tempo que o Mock me disse pra olhar esse tópico. Só agora, aproximadamente 1 mês depois de ser postado, eu preciso dele.

 

Suponhamos que na DB tenha um player chamado Skyen Hasus e queremos pegar o level e o id dele.

Nem tinha percebido que fui citado.

 

Mock~

Isso tudo funciona em SQLite Studio?

Compartilhar este post


Link para o post
Rdgxnk    0
Rdgxnk

~~ Mock

 

Show, Muito bom.

 

como ja citado acima :

 

ver um bom scripter eh dificil hoj em dia ;x

Compartilhar este post


Link para o post
ions_29a    0
ions_29a

Cara... é claro que não precisa nem falar nada...

mas se nós pensassemos assim não haveria reconhecimento...

 

Tópico bem estruturado, muito bem explicado inclusive nos mínimos detalhes...

tá aí algo que eu não via a muito tempo na OTNET!

 

@Mock - parabêns mesmo cara... eu já sei a maioria disso mais tá realmente legal!

Continue assim manin.

 

Logo logo vou começar na parte de scripts do otserv da minha mulher e volto a usar isso tudo... por enquanto só no PHP mesmo com PHP/MySQL.

 

vlws pela excelênte contribuição

 

cya~~

Compartilhar este post


Link para o post
Eventide    7
Eventide

eu quero saber como é o antigo fetch.. :/

o antigo modo rulava muito, apesar de ser mais divagar um pouco.

e getResult agora é storeQuery não?

Compartilhar este post


Link para o post
'- Drugs.    0
'- Drugs.

A facilidade de manuseio é superior comparando com o método antigo, mas pra quem já está acostumado a mexer com SQL em outras linguagens (como PHP) dá na mesma.

 

O que é bom citar também é como trabalhar com resultados múltiplos, no caso:

local coisas = db.getResult("SELECT `name` FROM `otserv`.`players` WHERE `level` > '30';")
if (coisas:getID() ~= -1) then
repeat
print("Player "..coisas:getDataString("name").." tem nível superior a 30!")
until not coisas:next()
return TRUE
else
return FALSE
end

No exemplo acima, imprimiria no console do ot todos os jogadores que tem um nível maior que 30.

 

Abraços.

Editado por Mickfern

Compartilhar este post


Link para o post
Eventide    7
Eventide

no caso então não existe um fetch já pronto, eu vou ter que fazer o meu seguindo esse esquema? ;o

dorgas mano, a unica coisa que melhorou nesse novo sistema foi a velocidade, pq antes se fazia conexões paralelas, agora não, é 1 só conexão..

Compartilhar este post


Link para o post
Mock    32
Mock

@fletch

falto 1

 

ALERT TABLE

:P

@eventide

tipo eu vo olha o sistema aqui e vo ver se consigo p vc ;s

Compartilhar este post


Link para o post
Eventide    7
Eventide

consegui fazer! :]

function query_to_table(arr, query, types)
   local result = db.getResult(query)
   if(result:getID() ~= -1) then 
       while(true) do
           table.insert (arr, types)
           if not(result:next()) then 
               break 
           end 
       end 
       result:free()
   end 
end 

 

exemplo de uso:

local exemplo = {}
query_to_table(exemplo, "SELECT `name` FROM `players`", getDataString(name))

 

code 100% por Eventide, para usar este code pague 100 reais para a seguinte conta no paipoupança:

Editado por Mickfern

Compartilhar este post


Link para o post
de_bone    1
de_bone

Nossa, agora ficou fácil usar luaSQL,

antes era um ** pra meche...

 

Belo tutorial Mock :)

Compartilhar este post


Link para o post
Mock    32
Mock

CLAPS FOR EVENTIDE \0/

:P boa cara

Compartilhar este post


Link para o post
Ramza    11
Ramza

Só pudia explicar direitinho algumas coisa que você passou voando né mockzito, como por exemplo o CONVERT USING utf8 :P

Compartilhar este post


Link para o post
ronka    0
ronka

belo tutorial ! deu pra entende bem os comandos SQL ainda mais quem nao sabe (Y)

mas duvido muito alguem entende lgo de cara kkkk demora um poco

 

LOL

Compartilhar este post


Link para o post
Visitante
Este tópico está impedido de receber novos posts.
Entre para seguir isso  
  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.

×