manolegal 12 Denunciar post Postado Outubro 20, 2012 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
manolegal 12 Denunciar post Postado Outubro 21, 2012 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
Marcos_imasters 288 Denunciar post Postado Outubro 21, 2012 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
manolegal 12 Denunciar post Postado Outubro 21, 2012 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
Lucas Peperaio 20 Denunciar post Postado Outubro 22, 2012 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
manolegal 12 Denunciar post Postado Outubro 22, 2012 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
Lucas Peperaio 20 Denunciar post Postado Outubro 22, 2012 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
manolegal 12 Denunciar post Postado Outubro 23, 2012 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
Lucas Peperaio 20 Denunciar post Postado Outubro 23, 2012 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
manolegal 12 Denunciar post Postado Outubro 23, 2012 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
Lucas Peperaio 20 Denunciar post Postado Outubro 23, 2012 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
manolegal 12 Denunciar post Postado Outubro 23, 2012 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
Lucas Peperaio 20 Denunciar post Postado Outubro 23, 2012 Posta o código inteiro com essas modificações Compartilhar este post Link para o post Compartilhar em outros sites
manolegal 12 Denunciar post Postado Outubro 23, 2012 // 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
Lucas Peperaio 20 Denunciar post Postado Outubro 23, 2012 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
manolegal 12 Denunciar post Postado Outubro 23, 2012 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
Lucas Peperaio 20 Denunciar post Postado Outubro 23, 2012 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
manolegal 12 Denunciar post Postado Outubro 23, 2012 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
Lucas Peperaio 20 Denunciar post Postado Outubro 23, 2012 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
manolegal 12 Denunciar post Postado Outubro 23, 2012 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