Exclusгo de contas inutilizadas [SQL] -
F1N4L - 23.05.2016
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.
Re: Exclusгo de contas inutilizadas [SQL] -
Petrick™ - 23.05.2016
Bacana.... Bem ъtil!!!!
Re: Exclusгo de contas inutilizadas [SQL] -
F1N4L - 23.05.2016
Quote:
Originally Posted by Petrick™
Bacana.... Bem ъtil!!!!
|
Obg, Petrick.
Re: Exclusгo de contas inutilizadas [SQL] -
FreeGells - 23.05.2016
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...
Re: Exclusгo de contas inutilizadas [SQL] -
HaRdiiZin - 23.05.2016
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.
Re: Exclusгo de contas inutilizadas [SQL] -
F1N4L - 23.05.2016
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...
Re: Exclusгo de contas inutilizadas [SQL] -
Ever_SH - 23.05.2016
Mais um уtimo tutorial F1N4L, й bem ъtil.
Re: Exclusгo de contas inutilizadas [SQL] -
F1N4L - 23.05.2016
Quote:
Originally Posted by Ever_SH
Mais um уtimo tutorial F1N4L, й bem ъtil.
|
Thx, Ever_SH!
Re: Exclusгo de contas inutilizadas [SQL] -
Jimmmy - 23.05.2016
Boa
Re: Exclusгo de contas inutilizadas [SQL] -
F1N4L - 23.05.2016
Quote:
Originally Posted by Jimmmy
Boa
|
Vlw, Jimmmy!