Ir para conteúdo

POWERED BY:

Arquivado

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

Vianney

[Resolvido] Erro ao fazer duas consultas consecutivas no MySQL

Recommended Posts

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

<?php

REQUIRE_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

<?php

REQUIRE_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

<?php

REQUIRE_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

<?php

REQUIRE_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;

}

}

?>

 

 

<?php

class 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

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

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.