Ir para conteúdo

POWERED BY:

Arquivado

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

ricardoluizv

[Resolvido] Conflito com location.href

Recommended Posts

Na página layout.php eu faço uma consulta quando é carregada.... em uma página eu executo a mesma classe e o mesmo método, esse método seta os valores nesta sessão. Será que está dando conflito de sessão?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Esses são os arquivos que se comunicam diretamente com a classe Login.php, a classe LogoDb pertence ao um banco de dados chamado "instituto" e a classe Login pertence ao banco de dados "adm".

 

Layout.phtml

<?php
ob_start();
session_start();

require_once('../application/controllers/consulta/Login.php');

$log = new Login();
$autenticacao = $log->getLogon();

$logon = Zend_Registry::getInstance();

if (!empty($autenticacao->usuario)) {

   $acao = 'logon';
   $acaoUsuario = $autenticacao->usuario;

}else{
     $acao = null;
}

?>

///////////////////////////////////////////////////////////

LayoutController.php

 

 public function layoutAction(){
     session_start();
       ob_start();


     $logoDb = new LogoDb();
      $url = $logoDb->getLogo();

      if (empty($url->imagem)){
          $url = $logoDb->selecionaLogo('logo_smal');
      }

      $this->view->url = $url;
}

 

/////////////////////////////////////////////////////////////////////

Logon.php

 

require_once (realpath(dirname(__FILE__) . "../../../../application/controllers/") . "/consulta/Login.php");

$param->usuario = $_POST["fr_nome"];
$param->senha = $_POST["fr_senha"];

$logon_S = new Login();
$res = $logon_S->autenticar2($param->usuario,$param->senha,'ipam');

echo "Usuário: ".$param->usuario."<br>";
echo "Senha: " .$param->senha."<br>";
echo $res;

///////////////////////////////////////////////////////////////////////////

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olha, você está usando Zend mas não está usando nada do que ele te permite utilizar. Algumas perguntas:

 

  • Aonde você salva os dados em $_SESSION?
  • Porque utilizar o session_start ao invés de Zend_Session::start() ?
  • Porque não utilizar Zend_Auth?
  • Porque seu arquivo Layout.phtml tem esta verificação de usuário logado? Isto não é função do layout, é função do controller ou no máximo de um plugin, mas nunca do layout.

 

Sugiro que dê uma lida em algumas informações sobre o Zend, pois tem várias formas mais fáceis de fazer isto que você faz. Se mesmo assim você quiser fazer como está fazendo, faltou você mostrar onde você utiliza o location.href do javascript.

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu entendo a falta da utilização dessa função do framework, mas como o site precisa de um prazo mínimo para ficar pronto, não da tempo para eu aprender a utilizar o Zend_Auth e conhecer outras funções do Framework, mas logo estarei restruturando o site.

 

Aqui está o location.href

///////////////////////////////////////////////////////////////

sistema/

<script type="text/javascript">
   $(document).ready(function(){
       var logon = "";
       //  switch ($_REQUEST["error"],){

       var sis_usuario = "";
       var sis_senha = "";
       var error = "";
       $.post("../library/php/sistemas/verifica_logon.php",{param:sis_usuario},function(data){
           $(data).find('error').each(function(){
               if ($(this).text() == "1"){
                  // location.href = "restrito";
                  $(location).attr('href', 'sistemas');

               }
               error = $(this).text();
           });

           $(data).find('usuario').each(function(){
               sis_usuario = $(this).text();

           });

            $(data).find('senha').each(function(){
               sis_senha = $(this).text();
           });

           if (error == 0){
               $("#logon_usuario").empty().html(sis_usuario.toUpperCase());
           }/*else{
                 $(location).attr('href', 'sistemas');
           }*/

       },'xml');




   });
</script>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Certo. Então, vamos analisar:

 

$.post("../library/php/sistemas/verifica_logon.php",{param:sis_usuario},function(data){

Não conheço muito de jQuery, mas parece que você está enviando um POST para verifica_logon.php. É neste arquivo que você grava a sessão? Se sim, poste o conteúdo dele. Ao entrar em qual endereço a sessão é perdida (já que este é o problema no momento)?

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

verifica_logon.php

<?php
ob_start();
session_start();

header('Content-type: text/xml');
header("Cache-Control: no-cache, must-revalidate");

require_once (realpath(dirname(__FILE__)."../../../../application/controllers/")."/consulta/Login.php");

/* $logon = new Login();
$res = $logon->getLogon();*/
$res = $_SESSION["logon"];
if (!empty($res)){

    $xml = '<?xml version="1.0"?>';
    $xml .= '<ret>';
    $xml .= '<usuario>'.$res->usuario.'</usuario>';
    $xml .= '<senha>'.$res->senha.'</senha>';
    $xml .= '<error>0</error>';
    $xml .= '</ret>';
}else{
    $xml = '<?xml version="1.0"?>';
    $xml .= '<ret>';
    $xml .= '<error>1</error>';
    $xml .= '</ret>';
}

echo $xml;

 

classe Login.php

 

<?php

require_once(  realpath(dirname(__FILE__) . '/../').'/db/Factory_Abstract_DB_PostgreSQL_ADM.php');
   require_once(  realpath(dirname(__FILE__) . '/../').'/db/ExecutaFabrica.php');
   require_once(  realpath(dirname(__DIR__) . '../').'\db\CRUD.php');
   require_once(  realpath(dirname(__FILE__) . '/../../').'/models/Usuario.php');

   ob_start();
   session_start();
   //session_register("logon");


class Login {
   //put your code here


   private $conn;
   private $consulta;


   public function __construct() {
       $this->conn = new Factory_Abstract_DB_PostgreSQL_ADM();
       $this->consulta = new ExecutaFabrica($this->conn);

   }


    public function autenticar2($usuario,$senha,$banco) {

        ob_start();
        session_start();


	//SELECIONA O USUÁRIO
       $_SESSION["logon"] = null;
       $_SESSION["banco"] = null;
       $_SESSION["historico"] = null;

       unset($_SESSION["logon"]);
       unset($_SESSION["banco"]);
       unset($_SESSION["historico"]);

       session_register("logon");
       session_register("banco");
       session_register("historico");

       $str = "SELECT
                   usuario,
                   senha,
                   usuario_cadastro_id AS cadastro_id,
                   usuario.empresa_id AS cadastro_pai_id,
                   usuario.idusuario AS id
                 FROM
                     usuario,db_nomes
                 WHERE
                       usuario.usuario = '".$usuario."' AND
                       usuario.senha = '".$senha."' AND
                       db_nomes.nome = '".$banco."' AND
                       usuario.usuario_cadastro_id = db_nomes.idfisica";
       $result = $this->consulta->executa($str);

       $autenticado;

       while ($linha = pg_fetch_object($result)) {

           if (empty ($linha->usuario)){
                 return "Login ou senha inválido!";
           }

             if (empty($linha->senha)){
                     return "Login ou senha inválido!";
               }

           if (($usuario == $linha->usuario) && ($senha == $linha->senha)) {
               $autenticado->usuario = $usuario;
               $autenticado->senha = $senha;
               $autenticado->cadastroId = $linha->cadastro_id;
               $autenticado->empresaPaiId = $linha->cadastro_pai_id;
               $autenticado->usuarioId = $linha->id;
               //permissões deste usuário
              // echo "usuario=".$autenticado->usuario;




               if ($linha->ismaster == true) {
                   $autenticado->ismaster = true;
                   if ($linha->cadastro_id == null) {
                       $autenticado->root = true;
                   } else {
                       $autenticado->root = false;
                   }
               } else {
                   $autenticado->ismaster = false;
               }

       //LISTA AS PERMISSÕES DO USUÁRIO

       //1 - FAZER UMA CONSULTA - LISTAR AS PERMISSÕES DO USUÁRIO

               $str = "SELECT
                           permissao.apagar AS apagar,
                           permissao.atualizar AS atualizar,
                           permissao.cadastrar AS cadastrar,
                           permissao.configurar AS configurar,
                           permissao.consultar AS consultar,
                           permissao.permissao AS permissao,
                           permissao.processo AS processo,
                           permissao.impressao AS impressao,
                           menus.nome AS tela,
                           permissao.idusuario AS idusuario,
                           modulos.nome AS modulo

                       FROM
                               permissao,menus,modulos
                       WHERE
                           permissao.idusuario = '".$autenticado->usuarioId."' AND
                           permissao.idmenu = menus.idmenus AND
                           modulos.idmodulos = menus.idmodulo";
              $result = $this->consulta->executa($str);

   //2 - ARMAZENAR A CONSULTA EM UM OBJETO
       $permissoes;
               while ($linha = pg_fetch_object($result)){
                   $permissoes->apagar[] = $linha->apagar;
                   $permissoes->atualizar[] = $linha->atualizar;
                   $permissoes->cadastrar[] = $linha->cadastrar;
                   $permissoes->configurar[] = $linha->configurar;
                   $permissoes->consultar[] = $linha->consultar;
                   $permissoes->permissao[] = $linha->permissao;
                   $permissoes->processo[] = $linha->processo;
                   $permissoes->impressao[] = $linha->impressao;
                   $permissoes->menu[] = $linha->tela;
                   $permissoes->idusuario[] = $linha->idusuario;
                   $permissoes->modulo[] = $linha->modulo;
              }

              $autenticado->permissao = $permissoes;

         //3- CARREGA O BANCO DE DADOS QUE PERTENCE AQUELE USUÁRIO

		if ( empty($_SESSION["banco"])){
              $str = "SELECT
                        db_nomes.nome AS banco
               FROM
                       db_nomes,usuario
               WHERE
                       usuario.idusuario = '".$autenticado->usuarioId."' AND
                       db_nomes.idfisica = usuario.usuario_cadastro_id";
              $result = $this->consulta->executa($str);

              while ($linha = pg_fetch_object($result)){
                 $banco->database = $linha->banco;
              }
		}
            //4- CONTADOR DE ACESSO

              $str = "SELECT max(historico_aceso.idhistorico_acesso) AS id FROM historico_aceso WHERE historico_aceso.idusuario= '".$autenticado->usuarioId."'";
              $result = $this->consulta->executa($str);

              while ($linha = pg_fetch_object($result)){
                  $historico->id = $linha->id;
              }

              if (!empty ($historico->id)){
                  $str = "SELECT
                             data,hora,quantidade_acesso,idusuario
                           FROM
                             historico_aceso
                           WHERE
                             historico_aceso.idhistorico_acesso='".$historico->id."'";
                  $result = $this->consulta->executa($str);

                  while ($linha = pg_fetch_object($result)){
                       $historico->data = $linha->data;
                       $historico->hora = $linha->hora;
                       $historico->contadorAcesso = $linha->quantidade_acesso;
                  }
                  $historico->contadorAcesso++;
              }else{

                  $historico->contadorAcesso =1;
              }


              $str = "INSERT INTO historico_aceso (data,hora,quantidade_acesso,idusuario)
                       VALUES
                           ('".date('20y-m-d')."','".date('h:i:s')."','".$historico->contadorAcesso."','".$autenticado->usuarioId."')";
              $this->consulta->executa($str);



             //  session_register("banco");

               $_SESSION["banco"] = $banco;

               $_SESSION["historico"] = $historico;

              $_SESSION["logon"] = $autenticado;


             return "true";
           }
       }
        return "Login ou senha inválido!";
   }



   //RETORNA A VARIÁVEL DE SESSÃO "LOGON"
   public function getLogon(){
       ob_start();
       session_start();
          return $_SESSION["logon"];

   }

   public function getDataBaseDetail(){
       ob_start();
       session_start();
       return $_SESSION["banco"];
   }

   public function getHistorico(){
        ob_start();
       session_start();
       return $_SESSION["historico"];
   }



}
ob_end_flush();
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, tá muito confuso o teu sistema. Não consegui entender a sequencia das coisas. Por exemplo, qual página o cara entra, o que chama o que...

 

Faça um debug na página verifica_logon.php. Veja o que está sendo retornado dentro de $_SESSION['logon']. Além disto, habilite todas as mensagens de erro. Veja se não aparece nenhum erro que possa ajudar na identificação do problema, porque confesso que está difícil de compreender o que ocorre.

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

A partir do momento que instancio o objeto $conn eu já estabeleço a conexão com o banco de dados. O método autentica() realiza para a mim o login do usuário.... nesse método preciso do banco de dados que vai acessar, o login e a senha... realiza o select com o login e a senha se tudo ocorrer bem, busca as informações do usuário e armazena um obejto contendo todas as informações do usuário em uma sessão.

 

 

Layout.phtml - No início do arquivo contém esse código, verifica se o usuário está logado, se estiver passa a sessão para as variáveis javascipt, as variáveis 'acao' e 'acaoUsuario' é apenas para filtrar se deve ou não pegar informações do PHP. SE a 'acao' for nula não faz nada

 

<?php
ob_start();
session_start();

require_once('../application/controllers/consulta/Login.php');

$log = new Login();
$autenticacao = $log->getLogon();

$logon = Zend_Registry::getInstance();

if (!empty($autenticacao->usuario)) {

   $acao = 'logon';
   $acaoUsuario = $autenticacao->usuario;

}else{
     $acao = null;
}

?>

 

Caso o usuário não esteja logado.... Ao efetuar o login é executado o trecho de código abaixo:

 

Layout.phtml - Esse é o trecho que está em javascript (ainda não conhecia o Jquery) que realiza o logon principal, coloquei aqui no layout pelo fato de ser opção fixa em todas as páginas...

 

             function logon(){
               var txtLogin = document.getElementById('txtLogin');
               var txtSenha = document.getElementById('txtSenha');
               acao = "logon";
               usaAjax('../library/php/index/Comunica.php','login='+txtLogin.value+'&senha='+txtSenha.value+'&banco='+bancoInst);
               acaoUsuario = txtLogin.value;
           }

     var ajax;
           function usaAjax(site,param){
               ajax = null;
               ajax = iniciaAjax();
               if (acao == "nulo"){
                   return;
               }else{
                   if (ajax){


                       ajax.open("POST",site+"?"+param, true);
                       ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
                       //ajax.overrideMimeType("text/XML");

                       ajax.onreadystatechange = retornoServer;

                       ajax.send(param);

                   }
               }
           }

      function retornoServer(){
               ajax.onreadystatechange=function(){
                   if (ajax.readyState == 4){

                       ret = ajax.responseText;
                       var arrRet = ret.split(',');
                       // window.alert("Retorno: "+arrRet[1]);
                       if (arrRet[1] == "true"){

                           executaAcao();

                       }else{
                           acao = "logof";
                           alert(arrRet[0]);

                       }

                   }
               }

           }


    function executaAcao(){
               if ((acao == "logon")&&(ISscpf == false)){

                   var el = document.getElementById("divLogon");
                   //el.innerHTML = divLogon;

                   /*var el = document.getElementById("divLogon");
                       elSpanLogon = el.innerHTML;*/
                   var arrRet = ret.split(',');

                   el.innerHTML = divLogado;


                   var div = document.getElementById("divLogon");
                   el.style.backgroundImage = "";
                   /* el.style.marginTop = "40px";
                   el.style.position =  "absolute";*/

                   /*  var divUsuario = document.getElementById("divUsuario");
                   divUsuario.style.marginLeft = "15px";*/

               }
               if ((acao == "logof")&&(ISscpf == false)){
                   var el = document.getElementById("divLogon");
                   el.innerHTML = divLogon;
               }

               if (ISscpf == true){
                   //window.alert("Acessa a base MYSQL!");
                   var el = document.getElementById("divLogon");
                   el.innerHTML = divLogon;
               }
           }






 

Ao fazer o logon.... Abre as opções para eu entrar na página de meus sistemas, a partir do momento que eu entro na página meus sistemas, perde a sessão principal, se eu não entrar na página de meus sistemas fica tudo normal. Que estranho!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não sei se tem a ver, pq to com pressa e não li tudo que você escreveu, mas tem um negócio errado no seu JS:

 

ajax.onreadystatechange = retornoServer;

retornoServer é uma função, então:

ajax.onreadystatechange = retornoServer();

 

Veja se isto resolve o problema.

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

... tem que se assim mesmo... Eh estranho mas está correto.

 

Não é verdade. Veja, o problema pode não ser este, mas ao utilizar assim, retornoServer recebe o valor de null, ou seja, a função retornoServer() nunca é executada. Se quando você coloca retornoServer() não funciona, significa que tem alguma coisa errada na função retornoServer(). Então, como eu disse, pode ser que este não seja o problema, mas com certeza isto É um problema.

 

Eu sou totalmente contra javascript obstrutivo. Para mim, um sistema tem que funcionar com ou sem JS habilitado. Então, a minha sugestão é que você faça o sistema funcionar totalmente sem JS. Depois que estiver funcionando, você utiliza o JS para deixá-lo mais amigável.

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vlw pela dica, mas vou passar tudo para JQuery!

 

Eu fiz uns testes e percebi que a $_SESSION["banco"] criada antes de ser executado o site está perdendo o valor quando eu logo e clico em algum link. Existe alguma coisa no Zend que pode destruir a sessão? Eu não podosso utilizar o Zend_Session pelo fato da sessão ser criada fora da aplicação?

 

Consegui resolver o problema... O location.href não tem conflito e a sessão que estava perdendo eu havia feito um comando para matar a sessão...

 

Muito obrigado pela ajuda!

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.