sacjamm 0 Denunciar post Postado Julho 8, 2016 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
Gabriel Heming 766 Denunciar post Postado Julho 8, 2016 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
sacjamm 0 Denunciar post Postado Setembro 19, 2016 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