[Tutorial] Exclusгo de contas inutilizadas [SQL]
#1

Esse tutorial aki й realmente muito ъtil para servidores, seja de pequeno ou grande porte.
Muitos aki do fуrum tinham dъvidas com relaзгo a EXCLUSГO DE CONTAS INUTILIZADAS. Eu fiz pela primeira vez e deu certo!
Bбsicamente verifica se a conta estб sendo utilizada ou nгo, caso a conta tenha ultrapassado tantos dias e nгo foi logado mais nela, automaticamente ela serб excluнda do BD.

OBS: Esse tutorial й diretamente voltado para Banco de Dados e estarei usando MySQL e SQLite.

Eu ia publicar isso na бrea cуdigos ъteis, mas achei melhor fazer como tutorial, pois assim os iniciantes podem postar suas dъvidas com relaзгo a esse sistema.

Suponho que vc jб tenha um sistema de registro e login completo em seu GM.
Toda vez que o jogador logar em seu servidor, vc precisa atualizar o tempo da conta para o tempo atual, obviamente.

O tempo que utilizei foi de 30 DIAS, entгo alterem para o tempo que vcs acham melhor.

ETAPA 1: Atualizando a conta.
Explicaзгo: Toda vez que o jogador logar em sua conta, a coluna onde guarda o valor do gettime irб ser resetada para o valor inicial, ou seja, voltarб ao inicio da contagem.
MySQL R7:
Код:
	new MySQL_Format[200], Name[24];

	GetPlayerName(playerid, Name, sizeof Name);

	mysql_format(conection, MySQL_Format, "UPDATE `table_name` SET `colunm_name` = '%i' WHERE `player_name` = '%s'", 30 * 24 * 60 * 60 +       gettime(), Name);
	mysql_function_query(conection, MySQL_Format, false, "", "");
SQLite:
Код:
	new SQL_Format[200], Name[24];

	GetPlayerName(playerid, Name, sizeof Name);

	format(SQL_Format, sizeof(SQL_Format), "UPDATE `table_name` SET `colunm_name` = '%i' WHERE `player_name` = '%s'", 30 * 24 * 60 * 60 + 	gettime(), Name);
	db_query(conection, SQL_Format);
ETAPA 2: Verificando as contas.
Explicaзгo: Vamos criar um timer que serб responsбvel por verificar as contas inutilizadas e as mesmas, ao ultrapassarem o limite de tempo, serгo automaticamente excluнdas.

Timer (OnGameModeInit/OnFilterStriptInit):
Код:
SetTimer("CheckUnusedAccounts", (24 * 60 * 1000), true); // verifica a cada 1 dia
MySQL R7:
Код:
forward CheckUnusedAccounts();
public CheckUnusedAccounts()
{
	new MySQL_Format[200];
	
	mysql_format(connection, MySQL_Format, "DELETE FROM `table_name` WHERE `colunm_name` < '%i'", gettime());
	mysql_function_query(connection, MySQL_Format, false, "", "");
	
	return 1;
}
SQLite:
Код:
forward CheckUnusedAccounts();
public CheckUnusedAccounts()
{
	new SQL_Format[200];
	
	format(SQL_Format, sizeof(SQL_Format), "DELETE FROM `table_name` WHERE `colunm_name` < '%i'", gettime());
	db_query(connection, SQL_Format);
	
	return 1;
}


Explicaзгo final (para iniciantes):
connection = Banco de dados.
table_name = Nome da tabela onde armazena os dados dos jogares.
colunm_name = Nome da coluna que serб inserida junto aos dados dos players.
player_name = Nome do jogador em questгo.

@ATUALIZAЗГO: 27/11/2017

Estou atualizando este tуpico para mostrar uma forma melhor e mais fбcil de verificaзгo sem precisar necessariamente formatar uma string para realizar tal verificaзгo, sem falar que desta forma fica mais legнvel e "humano", pois nгo vamos precisar converter os segundos.

Vamos trabalhar com quatro funзхes SQL:
* NOW (SQLite/MySQL) = Pega o tempo atual jб formatado em: AAAA/DD/MM HH/MM/SS
* DATEDIFF (MySQL) = Retorna a diferenзa entre 2 perнodos de tempo: AAAA/DD/MM HH/MM/SS - AAAA/DD/MM HH/MM/SS = X dias
* JULIANDAY (SQLite) = Retorna o tempo em segundos, mas computa cбlculos com datas e nгo necessariamente com segundos
* DATETIME (SQLite/MySQL) = Retorna a data e a hora

OBS.:
DATEDIFF(valor_maior, valor_menor)
Ex. correto: 1000 - 999 = 1
Ex. errado: 999 - 1000 = -1

O correto й calcular a data, claro, mas esse exemplo acima й sу pra ficar mais fбcil de compreender o modo correto de calcular a data com o comando DATEDIFF.
Usando de forma errada, como mostrado acima, retorna valor negativo. (Nгo que seja errado, mas nгo й nosso objetivo trabalhar com negativos.)

Para comeзarmos, devemos criar uma coluna em nossa tabela com o tipo TIMESTAMP para armazenarmos o valor de NOW().

Cуdigo SQL utilizado para criar a tabela:
Код:
CREATE TABLE `tabela` (`id` INT(5) NOT NULL PRIMARY KEY AUTO_INCREMENT, `data` TIMESTAMP NOT NULL)
OBS.: SQLite utiliza AUTOINCREMENT ao invйs de AUTO_INCREMENT.

Inserindo informaзхes:
MySQL:
Код:
INSERT INTO `tabela` (`data`) VALUES (NOW())
SQLite:
Код:
INSERT INTO `tabela` (`data`) VALUES (datetime('now', 'localtime'))
Depois de criada a tabela, crie um temporizador global e a respectiva funзгo a ser chamada:
Код:
SetTimer("VerificarInativos", (24 * 60 * 1000), true);
No cуdigo acima utilizamos um temporizador de 24 horas para chamar a verificaзгo.

Verificaзгo com MySQL:
Код:
forward VerificarInativos();
public VerificarInativos()
{
	mysql_query(con, "DELETE FROM `tabela` WHERE DATEDIFF(NOW(), `data`) > 90", true);

	return true;
}
Verificaзгo com SQLite:
Код:
forward VerificarInativos();
public VerificarInativos()
{
	db_query(con, "DELETE FROM `tabela` WHERE JULIANDAY('now') - JULIANDAY(`data`) > 90");

	return true;
}
Caso a conta estiver inativa por mais de 90 dias, entгo a mesma serб deletada!

Com base na primeira explicaзгo + essa segunda alternativa de verificaзгo, acredito que tenha ficado claro a forma de usar.
Reply
#2

Bacana.... Bem ъtil!!!!
Reply
#3

Quote:
Originally Posted by Petrick™
Посмотреть сообщение
Bacana.... Bem ъtil!!!!
Obg, Petrick.
Reply
#4

Vocк tб de sacanagem? Qual a necessidade de verificar a cada um minuto? Isso deveria ser checado no mбximo uma vez por dia. Executa isso aн numa tabela com 1k de registros uma vez por minuto...
Reply
#5

Quote:
Originally Posted by FreeGells
Посмотреть сообщение
Vocк tб de sacanagem? Qual a necessidade de verificar a cada um minuto? Isso deveria ser checado no mбximo uma vez por dia. Executa isso aн numa tabela com 1k de registros uma vez por minuto...
Tambйm acho.
Reply
#6

Quote:
Originally Posted by FreeGells
Посмотреть сообщение
Vocк tб de sacanagem? Qual a necessidade de verificar a cada um minuto? Isso deveria ser checado no mбximo uma vez por dia. Executa isso aн numa tabela com 1k de registros uma vez por minuto...
Й sу alterar!
Mantive isso dos testes que eu estava fazendo, afinal, nгo vou esperar um dia para saber o resultado.
Й um open source livre para alteraзхes...
Reply
#7

Mais um уtimo tutorial F1N4L, й bem ъtil.
Reply
#8

Quote:
Originally Posted by Ever_SH
Посмотреть сообщение
Mais um уtimo tutorial F1N4L, й bem ъtil.
Thx, Ever_SH!
Reply
#9

Boa
Reply
#10

Quote:
Originally Posted by Jimmmy
Посмотреть сообщение
Boa
Vlw, Jimmmy!
Reply


Forum Jump:


Users browsing this thread: 3 Guest(s)