Vianney 0 Denunciar post Postado Maio 17, 2011 Oi Pessoal estou com um problema que nunca tive antes. ao fazer duas consultas consecutivas ao banco mysql, a segunda não é feita, como o acesso ao banco não foce permitido, testes repetir a mesma consulta, ou consultas diferentes e é sempre a mesma coisa. Ou seja o sistema faz uma autenticação de usuário e não consegui mais acessar o banco pro exemplo, pois já acessou uma vez. Fiz um teste e me parece que o problema ocorre quando ele roda o segundo comando, ele abre a conexão perfeitamente, mas não consegue mais selecionar o banco. Ja rodei na internet algo e não achei, estou perdendo tempo nisso. kkkk De início ele dava um fatal erro Fatal error: Uncaught exception 'BancoException' in C:\server\www\myserver.dev\public_html\PRODOC\Banco\Banco.php:51 Stack trace: #0 C:\server\www\myserver.dev\public_html\PRODOC\Repositorio\RepositorioUsuario.php(26): Banco->selectSQL('CALL sp_ChecarL...') #1 C:\server\www\myserver.dev\public_html\PRODOC\Control\ControladorUsuario.php(15): RepositorioUsuario->autenticarUsuario('prof1', '123') #2 C:\server\www\myserver.dev\public_html\PRODOC\Fachada\Fachada.php(44): ControladorUsuario->autenticarUsuario('prof1', '123') #3 C:\server\www\myserver.dev\public_html\PRODOC\GUI\teste.php(9): Fachada->autenticarUsuario('prof1', '123') #4 {main} thrown in C:\server\www\myserver.dev\public_html\PRODOC\Banco\Banco.php on line 51 Eu tratei esse exceção no $e->getMessage(); para seugnda vez que rodo a consulta retorna false; Depois de tratada a exceção aparece o seguinte object(Usuario)#5 (5) { ["id":"Usuario":private]=> string(1) "1" ["nome":"Usuario":private]=> string(21) "Carlos Alberto Torres" ["login":"Usuario":private]=> string(5) "admin" ["senha":"Usuario":private]=> NULL ["perfil":"Usuario":private]=> string(1) "1" } Message: bool(false) Abaixo seguem os códigos, o teste.php foi o que eu usei para testes na gui. Não sei o que estou fazendo de errado, tentei tirar a fachada do singleton e criar várias instâncias dela e não teve jeito, mesmo erro. Se alguém souber e puder me ajudar ficarei muito grato. Esse é o arquivo que usei para testar <?phpREQUIRE_ONCE "../Fachada/Fachada.php"; $f=Fachada::getInstance(); echo var_dump($f->autenticarUsuario("admin","123")); echo var_dump($f->autenticarUsuario("admin","123")); ?> Essa é a minha Fachada <?php REQUIRE_ONCE "../Control/ControladorUsuario.php"; REQUIRE_ONCE "../Interface/IRepositorioUsuario.php"; REQUIRE_ONCE "../Repositorio/RepositorioUsuario.php"; /*FACHADA * * Fachada do Tipo Singleton * O padrão Singleton garante que apenas ums instancia da * Fachada seja criada na aplicaçao. * * É através da fachada que a GUI irá se comunicar com * as camadas inferioes da aplicação * * Para acessar a fachada basta usar o comando * Fachada::getInstance(); * * */ class Fachada { // Instancia única da Fachada static $instancia = NULL; // Usuários private $controladorUsuario; private $repUsuario; // Construtor privado Evita que o programador crie nova instacia do objeto fachada private function __construct() { // Usuários $this->repUsuario = new RepositorioUsuario(); $this->controladorUsuario = new ControladorUsuario($this->repUsuario); } // Usuario - MÉTODOS public function autenticarUsuario($login,$senha) { return $this->controladorUsuario->autenticarUsuario($login,$senha); } static function getInstance() { if(self::$instancia==NULL) { self::$instancia = new Fachada(); } return self::$instancia; } // Evita que o programador duplique o objeto fachada private function __clone() { // Sobrecarga do método clone vazia } } ?> CONTROLADOR <?phpREQUIRE_ONCE "../Interface/IRepositorioUsuario.php"; REQUIRE_ONCE "../Entidades/Usuario.php"; REQUIRE_ONCE "../Entidades/Professor.php"; class ControladorUsuario{ private $repUsuario; function __construct(IRepositorioUsuario $repoCliente) { $this->repUsuario=$repoCliente; } /* public function autenticarUsuario($login,$senha) { return $this->repUsuario->autenticarUsuario($login,$senha); } */ public function autenticarUsuario($login,$senha) { $result = $this->repUsuario->autenticarUsuario($login,$senha); if ($result[0]==NULL) { return FALSE; } if ($result[0]['idTipo']==1) { return new Usuario($result[0]['idUsuario'], $result[0]['nomeUsuario'], $result[0]['login'], NULL, $result[0]['idTipo']); } elseif ($result[0]['idTipo']==2) { return new Professor($result[0]['idUsuario'], $result[0]['nomeUsuario'], $result[0]['login'], NULL, $result[0]['idTipo'], $result[0]['dataUltPromocao'], $result[0]['idTituloProfessor']); } } } ?> REPOSITORIO <?phpREQUIRE_ONCE "../Interface/IRepositorioUsuario.php"; REQUIRE_ONCE "../Banco/Banco.php"; /* DADOS * * Classe que Controla o Acesso ao Banco * Aqui coloquei só as Querys comandos * de Banco coloquei em classe auxiar Banco para não carregar muito * a Clase Repositório, mas pode-se colocar tudo junto aqui. * * */ class RepositorioUsuario implements IRepositorioUsuario{ private $banco; //Classe auxiliar a repositório - Auxilia conexão com banco function __construct() { $this->banco=new Banco(); } function autenticarUsuario($login,$senha) { try { $this->banco->conecta(); //echo var_dump($this->banco->selectSQL("SELECT * FROM Usuarios")); $this->banco->selectSQL("CALL sp_ChecarLogin ('".$login."','".$senha."')"); $this->banco->desconecta(); //echo var_dump($this->banco->getNumRows()); //echo var_dump($this->banco->getResult()); return $this->banco->getResult(); } catch (Exception $e) { echo 'Message: ' .$e->getMessage(); } } function buscaTituloProfessor($id) { //$this->banco->conecta(); $this->banco->selectSQL("SELECT UP.dataUltPromocao, UP.idTituloProfessor, TP.nomeTitulo FROM usuarioprofessor as UP JOIN tituloProfessor AS TP on UP.idTituloProfessor=TP.idTituloProfessor WHERE idUsuario=id"); return $this->banco->getResult(); } } ?> UMA CLASSE AUXILIAR QUE CRIEI PARA CONEXÃO COM BANCO <?phpREQUIRE_ONCE "../Excecao/BancoException.php"; /*DADOS * * Classe de conexão ao banco * Possui instruções de manipulação de banco * * */ class Banco{ private $user; private $pass; private $local; private $db; private $conexao; private $result; public function __construct($db='prodoc', $user='root', $pass='123', $local='localhost'){ $this->setDb($db); $this->setUser($user); $this->setPass($pass); $this->setLocal($local); //$this->conecta(); } public function conecta(){ if (!$conexao=mysql_connect($this->getLocal(), $this->getUser(), $this->getPass()) ) throw new BancoException("Falha na conexao.", mysql_error() ); if (!mysql_select_db($this->getDb()) ) throw new BancoException("Falha ao selecionar o banco ".$this->getDb() , mysql_error() ); } public function desconecta() { if ($this->conexao){ mysql_close($this->conexao); } } public function getNumRows(){ return mysql_num_rows( $this->result ); } public function selectSQL( $sql ) { if (!($result = mysql_query($sql)) ) throw new BancoException("Falha em executar consulta - selectSQL.", mysql_error() ); $this->setResult( $result ); } public function executeSQL( $sql ) { if (!mysql_query($sql)) throw new BancoException("Falha em executar consulta - executeSQL.", mysql_error() ); } private function setDb( $valor ){ $this->db = $valor; } private function setUser( $valor ){ $this->user = $valor; } private function setPass( $valor ){ $this->pass = $valor; } private function setLocal( $valor ){ $this->local = $valor; } private function getDb( ){ return $this->db; } private function getUser(){ return $this->user; } private function getPass(){ return $this->pass; } private function getLocal(){ return $this->local; } private function setResult( $valor ){ $this->result = $valor; } public function getResult(){ $retorno = array(); while( $linha = mysql_fetch_array($this->result, MYSQL_ASSOC) ) { array_push($retorno, $linha); } return $retorno; } } ?> <?phpclass BancoException extends Exception{ private $mensagem; public function __construct($mensagem, $erro=''){ $this->setMensagem(parent::getMessage(). "\n" . $mensagem . "\n" . $erro); } private function setMensagem( $valor ){ $this->mensagem = $valor; } public function getMensagem(){ return $this->mensagem; } } ?> Compartilhar este post Link para o post Compartilhar em outros sites
Vianney 0 Denunciar post Postado Maio 17, 2011 Pessoal muito obrigado! Mas consegui resolver, era uma besteira, por nervosismo e desatenção esqueci de fechar a conexão após cada consulta. Abraço! Compartilhar este post Link para o post Compartilhar em outros sites