Ir para conteúdo

Arquivado

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

sacjamm

Problema com Script de Sessao

Recommended Posts

Eu criei um sistema de Sessão para gerar estatisticas do site, criei com a ajuda de video aulas, mais eu agora me deparei com um problema inofensivo, mais que está mostrando erro na tela.

é o seguinte:

Eu possuo uma classe chama Session.class.php, e na linha 102, ou exatamente, onde estará marcado, este sistema de session, ele faz um cadastro e atualização no banco de dados, a cada momento que um usuário diferente entra no site, mais se analisarmos a lógica, ele não cadastra o registro na tabela ws_siteviews, a cada acesso, ele simplesmente cadastra 1 vez no dia, e a atualização desses dados é feita constantemente a cada acesso. só que eu ao acessar o site pela primeira vez, ou seja, eu não tenho nenhuma sessao no site ainda, e ao entrar no site ele me retorna o erro:

Erro na Linha: #102 :: Trying to get property of non-object
/home/garotosonline/public_html/site/admin/conexao/Helpers/Session.class.php

 

Sim este erro está ocorrendo, porque não existe, nenhum dado referente a data atual ao qual o sistema está tentando selecionar pelo método getTraffic(). Então, eu já tentei fazer algumas verificações e efetuar alguns debugs, mais eu não encontrei uma boa solução, sem mudar este código, eu gostaria de encontrar alguém que pudesse me ajudar, a encontrar um boa solução para este problema.

Resumindo, esta classe não está cadastrando o dado no banco de dados, e este dado está tendo falta, e por isso apresenta o erro que a propriedade nao é um objeto. Alguém tem alguma dica pra dar, alguma lógica, para fazer, sem mudar esse código?

class Session {

    private $Date;
    private $Cache;
    private $Traffic;
    private $Browser;

    function __construct($Cache = null) {
        //ob_start();
        //session_start();
        $this->CheckSession($Cache);
    }

    //Verifica e executa todos os m?todos da classe!
    private function CheckSession($Cache = null) {
        $this->Date = date('Y-m-d');
        $this->Cache = ( (int) $Cache ? $Cache : 20 );

        if (empty($_SESSION['useronline'])):
            $this->setTraffic();
            $this->setSession();
            $this->CheckBrowser();
            $this->setUsuario();
            $this->BrowserUpdate();
        else:
            $this->TrafficUpdate();
            $this->sessionUpdate();
            $this->CheckBrowser();
            $this->UsuarioUpdate();
        endif;
//
        $this->Date = null;
    }

    /*
     * ***************************************
     * ********   SESS?O DO USU?RIO   ********
     * ***************************************
     */

    //Inicia a sess?o do usu?rio
    private function setSession() {
        $_SESSION['useronline'] = [
            "online_session" => session_id(),
            "online_startview" => date('Y-m-d H:i:s'),
            "online_endview" => date('Y-m-d H:i:s', strtotime("+{$this->Cache}minutes")),
            "online_ip" => filter_input(INPUT_SERVER, 'REMOTE_ADDR', FILTER_VALIDATE_IP),
            "online_url" => filter_input(INPUT_SERVER, 'REQUEST_URI', FILTER_DEFAULT),
            "online_agent" => filter_input(INPUT_SERVER, "HTTP_USER_AGENT", FILTER_DEFAULT)
        ];
    }

//    
//
//    //Atualiza sess?o do usu?rio!
    private function sessionUpdate() {
        $_SESSION['useronline']['online_ip'] = filter_input(INPUT_SERVER, 'REMOTE_ADDR', FILTER_DEFAULT);
        $_SESSION['useronline']['online_endview'] = date('Y-m-d H:i:s', strtotime("+{$this->Cache}minutes"));
        $_SESSION['useronline']['online_url'] = filter_input(INPUT_SERVER, 'REQUEST_URI', FILTER_DEFAULT);
        $_SESSION['useronline']['online_agent'] = filter_input(INPUT_SERVER, "HTTP_USER_AGENT", FILTER_DEFAULT);
    }

//
//    /*
//     * ***************************************
//     * *** USU?RIOS, VISITAS, ATUALIZA??ES ***
//     * ***************************************
//     */
//
//    //Verifica e insere o tr?fego na tabela
    private function setTraffic() {
        $this->getTraffic();
        if (!$this->Traffic || $this->Traffic==null):
            $ArrSiteViews = [ 'siteviews_date' => $this->Date, 'siteviews_users' => 1, 'siteviews_views' => 1, 'siteviews_pages' => 1, 'online_ip' => $_SESSION['useronline']['online_ip']];
            $createSiteViews = new Create;
            $createSiteViews->ExeCreate("ws_siteviews", $ArrSiteViews);
        else:
            if (!$this->getCookie()):
                $ArrSiteViews = [ 'siteviews_users' => $this->Traffic->siteviews_users + 1, 'siteviews_views' => $this->Traffic->siteviews_views + 1, 'siteviews_pages' => $this->Traffic->siteviews_pages + 1];
            else:
                $ArrSiteViews = [ 'siteviews_views' => $this->Traffic->siteviews_views + 1, 'siteviews_pages' => $this->Traffic->siteviews_pages + 1];
            endif;

            $updateSiteViews = new Update;
            $updateSiteViews->ExeUpdate("ws_siteviews", $ArrSiteViews, "WHERE siteviews_date = :date", "date={$this->Date}");

        endif;
    }

//
//    //Verifica e atualiza os pageviews
    private function TrafficUpdate() {
        $this->getTraffic();

//o erro está aparecendo aqui, porque não está encontrado o cadastro referente ao dia. Essa linha abaixo, e a consulta dela é feita atraves do metodo getTraffic
        $ArrSiteViews = [ 'siteviews_pages' => $this->Traffic->siteviews_pages + 1];
        $updatePageViews = new Update;
        $updatePageViews->ExeUpdate("ws_siteviews", $ArrSiteViews, "WHERE siteviews_date = :date", "date={$this->Date}");

        $this->Traffic = null;
    }

//
//    //Obt?m dados da tabele [ HELPER TRAFFIC ]
//    //ws_siteviews
    private function getTraffic() {
        $readSiteViews = new Read;
        $readSiteViews->ExeRead("ws_siteviews", "WHERE siteviews_date = :date OR online_ip = :ip", "date={$this->Date}&ip={$_SESSION['useronline']['online_ip']}");
        if ($readSiteViews->getRowCount()):
            $this->Traffic = $readSiteViews->getResult()[0];
        else:
            $this->Traffic = null;
        endif;
    }

//
//    //Verifica, cria e atualiza o cookie do usu?rio [ HELPER TRAFFIC ]
    private function getCookie() {
        $Cookie = filter_input(INPUT_COOKIE, 'useronline', FILTER_DEFAULT);
        setcookie("useronline", base64_encode("weblab"), time() + 86400);
        if (!$Cookie):
            return false;
        else:
            return true;
        endif;
    }

//
//    /*
//     * ***************************************
//     * *******  NAVEGADORES DE ACESSO   ******
//     * ***************************************
//     */
//
//    //Identifica navegador do usu?rio!
    private function CheckBrowser() {
        $this->Browser = $_SESSION['useronline']['online_agent'];
        if (strpos($this->Browser, 'Chrome')):
            $this->Browser = 'Chrome';
        elseif (strpos($this->Browser, 'Firefox')):
            $this->Browser = 'Firefox';
        elseif (strpos($this->Browser, 'MSIE') || strpos($this->Browser, 'Trident/')):
            $this->Browser = 'IE';
        else:
            $this->Browser = 'Outros';
        endif;
    }

//
//    //Atualiza tabela com dados de navegadores!
    private function BrowserUpdate() {
        $readAgent = new Read;
        $readAgent->ExeRead("ws_siteviews_agent", "WHERE agent_name = :agent", "agent={$this->Browser}");
        if (!$readAgent->getResult()):
            $ArrAgent = ['agent_name' => $this->Browser, 'agent_views' => 1];
            $createAgent = new Create;
            $createAgent->ExeCreate("ws_siteviews_agent", $ArrAgent);
        else:
            $ArrAgent = ['agent_views' => $readAgent->getResult()[0]->agent_views + 1];
            $updateAgent = new Update;
            $updateAgent->ExeUpdate("ws_siteviews_agent", $ArrAgent, "WHERE agent_name = :name", "name={$this->Browser}");
        endif;
    }

//
//    /*
//     * ***************************************
//     * *********   USU?RIOS ONLINE   *********
//     * ***************************************
//     */
//
//    //Cadastra usu?rio online na tabela!
    private function setUsuario() {
        $sesOnline = $_SESSION['useronline'];
        $sesOnline['agent_name'] = $this->Browser;

        $userCreate = new Create;
        $userCreate->ExeCreate("ws_siteviews_online", $sesOnline);
    }

//
//    //Atualiza navega??o do usu?rio online!
    private function UsuarioUpdate() {
        $ArrOnlone = [
            'online_ip' => $_SESSION['useronline']['online_ip'],
            'online_endview' => $_SESSION['useronline']['online_endview'],
            'online_url' => $_SESSION['useronline']['online_url'],
            'online_agent' => $_SESSION['useronline']['online_agent']
        ];
        $userUpdate = new Update;
        $userUpdate->ExeUpdate("ws_siteviews_online", $ArrOnlone, "WHERE online_session = :ses", "ses={$_SESSION['useronline']['online_session']}");

        if (!$userUpdate->getRowCount()):
            $readSes = new Read;
            $readSes->ExeRead("ws_siteviews_online", 'WHERE online_session = :onses', "onses={$_SESSION['useronline']['online_session']}");
            if (!$readSes->getRowCount()):
                $this->setUsuario();
            endif;
        endif;
    }

}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sua classe sofre de algumas questões de coerência com a nomenclatura e de validações consistentes.

 

 

Veja só, o método getTraffic não retorna um Traffic. Nesse caso, por que ele tem o prefixo "get"?

 

Outro ponto. Na linha que da erro, você acessa a variável diretamente. Apesar de estar no mesmo escopo, se utilizar um método no lugar, você poderá validar a informação.

 

Veja bem

private function getTraffic() {
    //Early retur
    if (!is_null($this->Traffic)) {
        return $this->Traffic;
    }

    $readSiteViews = new Read;
    $readSiteViews->ExeRead("ws_siteviews", "WHERE siteviews_date = :date OR online_ip = :ip", "date={$this->Date}&ip={$_SESSION['useronline']['online_ip']}");

    if ($readSiteViews->getRowCount()) {
        return ($this->Traffic = $readSiteViews->getResult()[0]);        
    }

    //caso não existir, lança uma exception
    throw new RuntimeException("Traffic not found");
}

E já, no método aonde ocorreu o erro:

try {
   $traffic = $this->getTraffic();

   /** 
    * código para quando há traffic 
    **/
} catch (\RuntimeException $exception) {
   /** 
    * código para quando não há traffic 
    **/
}

De uma lida sobre Object Calisthenics, vai te ajudar em algumas de suas situações. É um conceito criado para o Java, mas, foi portado para o PHP pelo Guilherme Blanco.

 

Outro ponto, é um capitulo sobre Functions/Returns do livro Clean Code do Robert C. Martin.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Gabriel, peço perdão pelo tempo de resposta, eu consegui resolver este problema, foi algo simples, que eu nem imaginava, mais eu fui testando e testando por horas. Foi o seguinte, eu tenho os filtros de inputs filter_input(); e alguns desses filtros por algum motivo não estava funcionando, eu queria analisar depois isso e ver porque não estava funcionando, eu decidi colocar direto $_SERVER[] ao inves de filter_input(INPUT_SERVER, 'nome_do_global', FILTER_DEFAULT);

agradeço pela sua resposta, irei estudar esses codigos acima que poderã ser uteis futuramente. Mais foi resolvido o problema quando coloquei direto, é tipo que esse filter_input nao estivesse funcionando para enviar o dado pra tabela. e estava resultando num erro.

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.