Insert being executed twice

Asked

Viewed 299 times

2

I have a code for when a logout in the system, to be registered in a table of the database.

I call this file that logs out when I click the quit button and also when I close the window in the browser.

The problem is that sometimes insert records twice.

I don’t know if the problem is the problem. I’ve tried several ways to fix it, but all without success.

I’ll leave the code below:

//Código JavaScript para chamar o arquivo logout.php quando o navegador é fechado

window.onbeforeunload = function() {
  $.get("../banco/validador-de-login/logout.php", function(data) {
    return false;
  });
}
<!-- Arquivo logout.php -->

<?php

require_once("../conexao/conexao-com-banco.php");

session_start(); //iniciamos a sessão que foi aberta

require_once("../login-logout/login.php");

$usuario = $_SESSION['usuario'];

//Esse IF verifica se a sessão está ativa. Só chama a função se a sessão está ativa. 
if(session_status() == PHP_SESSION_ACTIVE)
{
pegarLogout($conecta, $usuario);

}
 
session_destroy(); //destruimos a sessão ;)
 
session_unset(); //limpamos as variaveis globais das sessões

/*aqui você pode redirecionar para uma determinada página*/
/*
echo "<script> document.location.href='../../index.php';</script>";
*/

header('location:../../index.php');

?>


  <!-- Arquivo login.php -->
  <!-- Arquivo que contém as funçõe que realizam o insert -->

  <?php

	
	/* Função para realizar o controle de login de usuários */
	function pegarLogin($conexao, $user)
	{
			
		$query_login = "INSERT INTO log(tipo_reg,horario,usuario,data) VALUES('LOGIN',CURTIME(),'$user',CURDATE())"; 
		$resultado_query_login =  mysqli_query($conexao, $query_login);

		if(!$resultado_query_login) /*Verifica se o resultado deu certo ou errado*/
		{
			/*Se deu erro, então exibe a mensagem do sql sobre o erro */
			die("Falha no registro do login: " . mysqli_error($conexao)); 
		}

		


		//echo "<BR> Concluído a atualização das atividades com sucesso. <BR> Quantidade de atividades atualizadas: " . $contador;
	}


	/* Função para realizar o controle de login de usuários */
	function pegarLogout($conexao_2, $user)
	{
			
		$query_login_2 = "INSERT INTO log(tipo_reg,horario,usuario,data) VALUES('LOGOUT',CURTIME(),'$user',CURDATE())"; 
		$resultado_query_login_2 =  mysqli_query($conexao_2, $query_login_2);

		if(!$resultado_query_login_2) /*Verifica se o resultado deu certo ou errado*/
		{
			/*Se deu erro, então exibe a mensagem do sql sobre o erro */
			die("Falha no registro do login: " . mysqli_error($conexao_2)); 
		}	
		
		//echo "<BR> Concluído a atualização das atividades com sucesso. <BR> Quantidade de atividades atualizadas: " . $contador;
	}



?>


    <!-- Botão de deslogar que fica no menu da página HTML -->

    <a class="text-light dropdown-item" href="../banco/validador-de-login/logout.php">Sair <i class="fas fa-sign-out-alt"></i></a>

Table image

inserir a descrição da imagem aqui

Note that a second insertion is made with the column that keeps the user name blank.

I don’t know where I could be going wrong. If you could help me, I’d be grateful.

  • If the guy clicks the "exit" button and closes the window, it will not register 2x?

  • I think not, because the script of this function is not called in the index.

  • @Sam, lie. I checked here and is running javascript also when I close the "Unzip" button. So it is running twice.

1 answer

1

Analyzing

In that code:

//Esse IF verifica se a sessão está ativa. Só chama a função se a sessão está ativa. 
if(session_status() == PHP_SESSION_ACTIVE)
{
  pegarLogout($conecta, $usuario);

}

It seems the intention is to discover the state of the current session and prevent a logout call based on the current state of the session. However, this code does not do this, or at least it does not do well the task to which it was designated. In the manual it is specified that session_status() is used to return the current session status. But if session_status() is used after function call session_start(), as is the case, it will only inform whether or not sessions are enabled in the settings.

Another thing is that even you have used this code:

session_destroy(); //destruimos a sessão ;)

session_unset(); //limpamos as variaveis globais das sessões

The superglobal variable $_SESSION still persists, even without grace, an id or associated values. session_destroy() does not completely or definitely delete the session. session_destroy() only deletes the reference $_SESSION, session, temporarily until the next call from session_start() where the reference $_SESSION, the sitting is resumed.

Solution

Only by the question it is not possible to know what takes the logout code to be called twice, but what can be done is to create conditions to prevent a second logout call using the session variable.

<!-- Arquivo logout.php -->

<?php

  require_once("../conexao/conexao-com-banco.php");

  session_start(); //<-- Retoma a referência para o superglobal $_SESSION

  require_once("../login-logout/login.php");

  // Verifica se o valor 'usuario' está definido no array $_SESSION
  if(isset($_SESSION['usuario'])) {
        pegarLogout($conecta, $_SESSION['usuario']);    
  }


  //Libera os valores atualmente registradas na sessão. Chame antes de 
  //session_destroy.
  session_unset(); 

  //Não destrói a sessão ou cookie de sessão. Só invalida temporariamente a referência
  //para a superglobal $_SESSION. A referência pode ser retomada com `session_start()`
  session_destroy();

  header('location:../../index.php');

?>

Browser other questions tagged

You are not signed in. Login or sign up in order to post.