Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

manolegal

Definir nome de sessão utilizando variavel

Recommended Posts

Ola amigos. Preciso criar sessões para acesso a sistemas com nomes diferentes. Até o momento, estou usando a seguinte forma:

$_SESSION["sistema1"]["login"] = $login;
$_SESSION["sistema2"]["login"] = $login;

O q eu gostaria de saber é se o que vou colocar a seguir é viável e seguro. Pensei em criar uma coluna na tabela de configurações para definir o nome do sistema para definir o nome da sessão. Por exemplo coluna "nome_sistema", digito o valor "sistema1". Aí no arquivo onde defino o nome da sessão faria da seguinte forma:

Faço consulta que busca campo "nome_sistema" na tabela de configurações, salvo em uma variavel e utilizo esta variavel para definir nome da sessão:

$Sql = "SELECT * FROM configuracoes";
$Resultado = executa($Sql);
while ($linha = @pg_fetch_array($Resultado)){
$nome_sistema = $linha["nome_sistema"];
}

// Definir a sessão. Minha maior duvida
$_SESSION[$nome_sistema]["login"] = $login;

 

Imagino que desta forma o nome da sessão seria diferente em ambos os sistemas pois o valor da variável é diferente. Tentei implementar em 02 sistemas mas não funcionou como esperado. Os sistemas não reconheceram como dois nomes diferentes de sessão. Será que o problema está em:

$_SESSION[b][$nome_sistema][/b]["login"] = $login;

Gostaria da sugestão dos amigos.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tentei da seguinte forma mas também não deu certo:

$_SESSION['$nome_sistema']["login"] = $login;

Compartilhar este post


Link para o post
Compartilhar em outros sites

tipo você criar uma coluna com o nome sistema ai tu faz da seguinte forma se for 1 sistema 1 se for 2 sistema 2

 

e na hora que tu for logar faz um update pra definir em qual ele entrou e puxa pelo banco de dados qual ele esta.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Na verdade são 02 sistemas distintos. Na tabela de configurações de cada sistema tenho uma coluna onde defino um nome que gostaria de utilizar para definir o nome de sessões. Para evitar de ter que alterar em cada sistema os nomes das sessões, gostaria de utilizar uma variavel que buscasse esse nome no Banco de Dados, e este nome faria parte do nome da sessão.

Ao invés de utilizar

$_SESSION["sistema1"]["login"] = $login; // Sessão do Sistema 1
$_SESSION["sistema2"]["login"] = $login; // Sessão do Sistema 2

Gostaria de utilizar

$_SESSION[$nome_sistema]["login"] = $login;

"$nome_sistema" conteria o valor da coluna citada anteriormente, o que imagino que tornaria as sessões com nomes diferentes. O problema é que não está funcionano. Não sei isto está errado ou estou definindo incorretamente o nome das sessões. Aguardo ajuda neste sentido. Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Detalhe, pra fazer isso:

$_SESSION["sistema1"]["login"] = ""

 

Você precisa antes fazer isso:

$_SESSION["sistema1"] = array();
$_SESSION["sistema1"]["login"] = "";

 

Isso porque o Array Super Global $_SESSION não é um Multidimensional e sim Bidimensional, portanto é preciso receber um Array primeiro para adicionar outros Arrays, ou indices. O engraçado é que alguns servidores Web que eu testei precisa, outros não. Ainda não sei o motivo, mas por precaução faça assim.

 

Enjoy -> http://www.php.net/manual/en/intro.session.php

Compartilhar este post


Link para o post
Compartilhar em outros sites

Lucas. Obrigado pelo retorno.

Você precisa antes fazer isso:

 

$_SESSION["sistema1"] = array();

$_SESSION["sistema1"]["login"] = "";

Não estaria contemplado neste código?

while ($linha = @pg_fetch_array($Resultado)){
$nome_sistema = $linha["nome_sistema"];
}

$_SESSION[$nome_sistema]["login"] = $login;

Estou um pouco confuso nesta situação.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olhando por cima não, como eu sugeri você precisa adicionar um Array vazio a sessão para posteriormente adicionar outros Arrays dentro dele:

 

 

<?php
while ($linha = @pg_fetch_array($Resultado)){
$nome_sistema = $linha["nome_sistema"];
}

$_SESSION[$nome_sistema] = array( "login" => $login); ?>

 

Veja que isto equivale a:

$_SESSION[$nome_sistema] = array();
$_SESSION[$nome_sistema]["login"] = $login;

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Seria mais ou menos assim? Para criar as sessões:

$_SESSION[$nome_sistema] = array( "id_usuario" => $id_usuario);
$_SESSION[$nome_sistema] = array( "login" => $login);

 

E no arquivo q verifica se o usuario está logado, eu uso desta forma?

$_SESSION[$nome_sistema] = array( "id_usuario" => $id_usuario);
$_SESSION[$nome_sistema] = array( "login" => $login);

if (!isset($_SESSION[$nome_sistema] = array( "id_usuario" => $id_usuario)) 
AND (!isset($_SESSION[$nome_sistema] = array( "login" => $login)))) {  // Esta linha apresenta problema.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Para criar as sessões está certo, para verificar não, o correto seria assim:

 

if( !isset( $_SESSION[$nome_sistema]["id_usuario"] ) and !isset( $_SESSION[$nome_sistema]["login"]) ) {

} 

 

Você ainda pode otimizar o seu IF usando uma vez o Isset, pois ele aceita multíplas variáveis ao mesmo tempo:

if( !isset( $_SESSION[$nome_sistema]["id_usuario"], $_SESSION[$nome_sistema]["login"] ) ) {

} 

Compartilhar este post


Link para o post
Compartilhar em outros sites

No arquivo que faz a autenticação fiz assim:

$_SESSION[$nome_sistema] = array( "id_usuario" => $id_usuario);
$_SESSION[$nome_sistema] = array( "login" => $login);

 

E no arquivo q verifica se o usuario está logado fiz da seguinte forma:

$_SESSION[$nome_sistema] = array( "id_usuario" => $id_usuario);
$_SESSION[$nome_sistema] = array( "login" => $login);

if( !isset( $_SESSION[$nome_sistema]["id_usuario"], $_SESSION[$nome_sistema]["login"] ) ) { 
session_start();
session_destroy();
unset($_SESSION[$nome_sistema]["id_usuario"]);
unset($_SESSION[$nome_sistema]["login"]);

   // Redireciona o visitante de volta pro login
header("Location:https://www......./sistema1/login.php");
exit;
}

 

Desta forma não está funcionando. Está sempre direcionando pro login.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Continua errado amigo, o session_start() deve ser o primeiro trecho de código a aparecer em sua página. E para usar Headers depois dele, é recomendado segurar o buffer de saída com o ob_start(); Além disso, você precisa fechar as sessões antes de trocar de página, com o session_write_close(); Veja

 

 

<?php
ob_start();
session_start();

$_SESSION[$nome_sistema] = array( "id_usuario" => $id_usuario);
$_SESSION[$nome_sistema] = array( "login" => $login);

if( !isset( $_SESSION[$nome_sistema]["id_usuario"], $_SESSION[$nome_sistema]["login"] ) ) { 
	unset( $_SESSION[$nome_sistema] );
	session_write_close();

	header("Location:https://www......./sistema1/login.php");
	exit;
}
?>

 

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tentei da seguinte forma e ainda não está funcionando.

<?php
       ob_start();
       session_start();

       $_SESSION[$nome_sistema] = array( "id_usuario" => $id_usuario);
       $_SESSION[$nome_sistema] = array( "login" => $login);

       if( !isset( $_SESSION[$nome_sistema]["id_usuario"], $_SESSION[$nome_sistema]["login"] ) ) { 
               session_destroy();
               unset($_SESSION[$nome_sistema]["id_usuario"]);
               unset($_SESSION[$nome_sistema]["login"]);
               session_write_close();

               header("Location:https://www......./sistema1/login.php");
               exit;
       }
?>

Continua redicionando para o login.

Compartilhar este post


Link para o post
Compartilhar em outros sites
// Autenticação do Usuário
   $Sql = "SELECT * FROM configuracoes";
   $Resultado = @executa($Sql);
while ($linha = @pg_fetch_array($Resultado)){
$nome_sistema = $linha["nome_sistema"];
}

$_SESSION[$nome_sistema] = array( "id_usuario" => $id_usuario);
$_SESSION[$nome_sistema] = array( "login" => $login);

// Verificar usuário logado
       ob_start();
       session_start();

       $_SESSION[$nome_sistema] = array( "id_usuario" => $id_usuario);
       $_SESSION[$nome_sistema] = array( "login" => $login);

       if( !isset( $_SESSION[$nome_sistema]["id_usuario"], $_SESSION[$nome_sistema]["login"] ) ) { 
               session_destroy();
               unset($_SESSION[$nome_sistema]["id_usuario"]);
               unset($_SESSION[$nome_sistema]["login"]);
               session_write_close();

               header("Location:https://www......./sistema1/login.php");
               exit;
       }

Compartilhar este post


Link para o post
Compartilhar em outros sites

você precisa colocar o ob_start(); session_start(); em primeiro de tudo, como eu te falei:

 

 


<?php
ob_start();
session_start();

// Autenticação do Usuário
   $Sql = "SELECT * FROM configuracoes";
   $Resultado = @executa($Sql);
while ($linha = @pg_fetch_array($Resultado)){
	$nome_sistema = $linha["nome_sistema"]; //outro erro
}

$_SESSION[$nome_sistema] = array( "id_usuario" => $id_usuario);
$_SESSION[$nome_sistema] = array( "login" => $login);

// Verificar usuário logado	
if( !isset( $_SESSION[$nome_sistema]["id_usuario"], $_SESSION[$nome_sistema]["login"] ) ) { 
	session_destroy(); //isso exclui o PHPSESSID, não a sessão do usuário
	unset($_SESSION[$nome_sistema]); //apenas esse unset já exclui toda a sessão
	session_write_close();

	header("Location:https://www......./sistema1/login.php");
	exit;
}?>

 

Tem outro erro ali, veja aonde eu comentei. Você está adicionando na mesma variável vários resultados, isso vai sobrepondo ela. No fim, ela fica sempre com o último registro, possivelmente seja esse o erro. Faça um where na sua query para mostrar apenas o "nome_sistema" de acordo com o usuário

Compartilhar este post


Link para o post
Compartilhar em outros sites

Blza. Na verdade eu tenho 02 arquivos:

autenticacao.php - onde defino as sessões

  $Sql = "SELECT * FROM configuracoes";
   $Resultado = @executa($Sql);
       while ($linha = @pg_fetch_array($Resultado)){
                $nome_sistema = $linha["nome_sistema"]; //outro erro
       }

       $_SESSION[$nome_sistema] = array( "id_usuario" => $id_usuario);
       $_SESSION[$nome_sistema] = array( "login" => $login);

 

verifica.php - onde verifico situação do usuário

<?php
       ob_start();
       session_start();

       $_SESSION[$nome_sistema] = array( "id_usuario" => $id_usuario);
       $_SESSION[$nome_sistema] = array( "login" => $login);

       // Verificar usuário logado     
       if( !isset( $_SESSION[$nome_sistema]["id_usuario"], $_SESSION[$nome_sistema]["login"] ) ) { 
               unset($_SESSION[$nome_sistema]); //apenas esse unset já exclui toda a sessão
               session_write_close();

               header("Location:https://www......./sistema1/login.php");
               exit;
       }?>

 

Na verdade a variável $nome_sistema traz somente um valor de retorno, pois só existe uma linha na tabela configurações e consequentemente somente 01 na coluna nome_sistema.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ok.. tudo bem que agora só tem um registro, mas e quando tiver vários? Afinal você nos explicou assim, que está usando variáveis dentro da $_SESSION por ter vários registros. Isso será um problema pra você, como você vai receber o nome do sistema adequado dessa forma? Uma forma bem simples de se resolver isso é, como eu te falei, usar um WHERE na sua query, para mostrar só o nome do sistema de acordo com o usuário. Assim, quando tiver vários usuários, só será obtido o nome correto, então a sua atribuição na variável $nome_sistema terá lógica.

 

Corrigindo, o arquivo autenticacao.php

 

<?php

ob_start();
session_start();

$Sql = "SELECT * FROM configuracoes";
$Resultado = @executa($Sql);
while ($linha = @pg_fetch_array($Resultado)){
	$nome_sistema = $linha["nome_sistema"]; //outro erro
}

$_SESSION[$nome_sistema] = array( "id_usuario" => $id_usuario, "login" => $login );
session_write_close();
?>

 

Corrigindo o arquivo verifica.php

 

// $nome_sistema é uma variável indefinida?!
// Você está incluindo este arquivo no autenticacao.php?

if( !isset( $_SESSION[$nome_sistema]["id_usuario"], $_SESSION[$nome_sistema]["login"] ) ) { 
	unset($_SESSION[$nome_sistema]); //apenas esse unset já exclui toda a sessão
	session_write_close();

	header("Location:https://www......./sistema1/login.php");
	exit;	}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Na verdade a tabela configurações terá sempre somente 01 linha, e dentro desta tabela a coluna nome_sistema que irá definir o nome do sistema, e esse nome q quero utilizar para definir o nome das sessões. Este nome do sistema será sempre o mesmo para todos os usuários independente do usuário que acessar o sistema. Nome do sistema seria uma variável definida. O arquivo verifica estou incluindo nos formularios do sistema para evitar o acesso por pessoas estranhas nao usuarias do sistema.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ok, mas no arquivo verifica.php a variável nome_sistema é indefinida, não sei se notou.. Inclua o mesmo código da autenticação em verifica.php

Compartilhar este post


Link para o post
Compartilhar em outros sites

O verifica ficaria assim?

       $_SESSION[$nome_sistema] = array( "id_usuario" => $id_usuario);
       $_SESSION[$nome_sistema] = array( "login" => $login);

if( !isset( $_SESSION[$nome_sistema]["id_usuario"], $_SESSION[$nome_sistema]["login"] ) ) { 
               unset($_SESSION[$nome_sistema]); //apenas esse unset já exclui toda a sessão
               session_write_close();

               header("Location:https://www......./sistema1/login.php");
               exit;   }

Tentei, mas não deu certo ainda.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.