Ir para conteúdo
  • Cadastre-se

[nv.av] Usando luaSQL


Posts Recomendados

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.

Código:


local Query = "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: Código:

local coisas = db.getResult("SELECT `level`,`id` FROM `otserv`.`players` WHERE `name` = 'Skyen Hasus';")

player_level = coisas:getDataInt("level")

player_id = coisas:getDataInt("id")

PRONTO! biggrin.gif 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: Código:

"INSERT INTO `player_deaths` (`player_id`, `time`, `level`, `killed_by`, `altkilled_by`) VALUES (1, " .. os.time() .. ", " .. getPlayerLevel(cid) .. ", 'demon', 'demon');"

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. biggrin.gif 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: Código:

db.executeQuery("UPDATE `otserv`.`players` SET `name` = 'Joao' WHERE `players`.`id` ="..getPlayerGUID(cid).." AND CONVERT( `players`.`name` USING utf8 ) = '"..getPlayerName(cid).."' LIMIT 1 ;")

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 Código:

function setAccountStorageValue(accid,value_id,value)

		 dofile("config.lua")

		 if string.len(value) >= 10 then

		    error("[setAccountStorageValue]: value is too long!")

		    return FALSE

		 end

		 local coisa = db.getResult("SELECT * FROM `account_storage` WHERE `account_storage`.`id` = ".. accid .." AND `account_storage`.`value_id` ="..value_id..";")

		 if coisa:getID() == -1  then

		    db.executeQuery("INSERT INTO `"..sqlDatabase.."`.`account_storage` ( `id` ,`value_id`, `value`  ) VALUES ( '"..accid.."','"..value_id.."', '"..value.."' ); ")

		    doBroadcastMessage('insert', 22)

		 else

			 doBroadcastMessage('updt'..coisa:getDataInt("value")..'', 22)

			 db.executeQuery("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:getDataInt("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 biggrin.gif. 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 thumbsup.gif

Contato;

6yonKDJ.png god.marinii

TaxNfhb.png

Link para o post
Compartilhar em outros sites

Participe da conversa

Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.

Visitante
Responder

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emojis são permitidos.

×   Seu link foi automaticamente incorporado.   Mostrar como link

×   Seu conteúdo anterior foi restaurado.   Limpar o editor

×   Não é possível colar imagens diretamente. Carregar ou inserir imagens do URL.

  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.

×
×
  • Criar Novo...

Informação Importante

Confirmação de Termo