hunternh 2 Denunciar post Postado Junho 4, 2007 Conexao.php <?phprequire_once("Trace.php");require_once("./telas/ExceptionsLayer.php");/*** Wagner B. Soares* Classe de conexão com o banco de dados*/class Conexao{ /** * Constante para configurar o banco de dados PostgreSQL */ const POSTGRESQL = 1001; /** * Constante para configurar o banco de dados MySQL */ const MYSQL = 1002; /** * Variável para configurar o tipo de banco de dados */ private $tipoBanco; /** * Variável para guardar a conexão */ private $conexao; /** * Instância para escrever no trace */ private $trace; /** * Variável para guardar o resultado das instruções SQL */ private $resultado; /** * Variável para sinalizar se houve erro durante uma instrução SQL */ private $blnErro; /** * Variável para retornar a quantidade de linhas afetadas pela instrução SQL. */ private $linhasAfetadas; /** * Construtor da classe Conexao */ public function __construct() { //inicia a variável de erro com false $this->blnErro = false; //inicia a variável que retorna as linhas afetadas na consulta $this->linhasAfetadas = 0; //cria uma nova instância do trace $this->trace = new Trace(get_class($this)); $this->trace->escreveTrace("Inicio do construtor-Conexao"); //carrega o arquivo de configuração $config = simplexml_load_file("./config/config.xml"); if(!$config) { //essa mensagem será retornada ao usuário throw new ExceptionsLayer("Não foi possível iniciar a conexão com o servidor.",ExceptionsLayer::CONNECTION_ERROR); return; } //seleciona o tipo de banco de dados que será utilizado $this->tipoBanco = (string)$config->server->tipoBanco; //switch para executar a conexão com o tipo de banco de dados selecionado no arquivo de configuração switch($this->tipoBanco) { case self::POSTGRESQL: { $this->trace->escreveTrace("Conectando-se com servidor - PostgreSQL."); $this->conexao = @pg_connect("host=" . ((string)$config->server->host) . " port=" . ((string)$config->server->porta) . " dbname=" . ((string)$config->server->base) . " user=" . ((string)$config->server->usuario) . " password=" . ((string)$config->server->senha)); if(!$this->conexao) { //se houver algum erro na conexão o mesmo será escrito no trace $this->trace->escreveTrace("Erro ao tentar conectar-se com o servidor ou com a base - PostgreSQL."); $this->blnErro = true; //essa mensagem será retornada ao usuário throw new ExceptionsLayer("Não foi possível conectar-se com a base de dados.",ExceptionsLayer::CONNECTION_ERROR); return; } else { $this->trace->escreveTrace("Conexão efetuada com sucesso - PostgreSQL."); } } break; case self::MYSQL: { $this->trace->escreveTrace("Conectando-se com servidor - MySQL."); $this->conexao = @mysql_connect((string)$config->server->host . (string)$config->server->porta,(string)$config->server->usuario,(string)$config->server->senha); if((mysql_errno() == 2003) || (mysql_errno() == 2005)) { //se houver algum erro na conexão o mesmo será escrito no trace $this->trace->escreveTrace("Erro ao tentar conectar-se com o servidor - MySQL. (" . mysql_error($this->conexao) . ")"); $this->blnErro = true; //essa mensagem será retornada ao usuário throw new ExceptionsLayer("Não foi possível conectar-se com o servidor.",ExceptionsLayer::CONNECTION_ERROR); return; } else if((mysql_errno() == 1044) || (mysql_errno() == 1045)) { //se houver algum erro na conexão o mesmo será escrito no trace $this->trace->escreveTrace("Erro de autenticação com o servidor - MySQL. (" . mysql_error($this->conexao) . ")"); $this->blnErro = true; //essa mensagem será retornada ao usuário throw new ExceptionsLayer("Não foi possível conectar-se com o servidor.",ExceptionsLayer::CONNECTION_ERROR); return; } else { $this->trace->escreveTrace("Conexão efetuada com sucesso - MySQL."); $acessaBase = @mysql_select_db((string)$config->server->base,$this->conexao); if(!$acessaBase) { //se houver algum erro na conexão com a base de dados o mesmo será escrito no trace $this->trace->escreveTrace("Erro ao tentar conectar-se com a base de dados - MySQL. (" . mysql_error($this->conexao) . ")"); $this->blnErro = true; //no mysql a conexão com a base é feita separadamente da conexão, //mas se houver algum erro será retornado o mesmo da conexão para o usuário throw new ExceptionsLayer("Não foi possível conectar-se com o servidor.",ExceptionsLayer::CONNECTION_ERROR); return; } } } break; default: break; } //inicia resultado $this->resultado = null; $this->trace->escreveTrace("Fim do construtor-Conexao"); } /** * executeQuery() * Método para executar uma consulta na base de dados */ public function executeQuery($_stringSQL) { $this->trace->escreveTrace("Inicio da função executeQuery-Conexao"); //switch para executar uma instrução SELECT com o tipo de //banco de dados selecionado no arquivo de configuração switch($this->tipoBanco) { case self::POSTGRESQL: { //executa a consulta $this->resultado = @pg_query($this->conexao, $_stringSQL); $this->linhasAfetadas = @pg_affected_rows($this->resultado); //se houver algum erro cai aqui if(!$this->resultado) { //a mensagem de erro é escrita no trace $this->trace->escreveTrace("Erro ao tentar executar a instrução SQL:\n" . $_stringSQL . " - Postgre error:".pg_last_error($this->conexao)); $this->blnErro = true; throw new ExceptionsLayer("Erro ao tentar executar a instrução SQL.",ExceptionsLayer::SQL_ERROR); return; } else { $this->trace->escreveTrace("Fim da função executeQuery-Conexao"); //retorna o resultado da pesquisa return pg_fetch_all($this->resultado); } } break; case self::MYSQL: { //executa a consulta $this->resultado = @mysql_query($_stringSQL); $this->linhasAfetadas = @mysql_affected_rows(); //se houver algum erro cai aqui if(!$this->resultado) { //a mensagem de erro é escrita no trace $this->trace->escreveTrace("Erro ao tentar executar a instrução SQL:" . $_stringSQL . " - (" . mysql_error($this->conexao) . ")"); $this->blnErro = true; throw new ExceptionsLayer("Erro ao tentar executar a instrução SQL.",ExceptionsLayer::SQL_ERROR); return; } else { $this->trace->escreveTrace("Fim da função executeQuery-Conexao"); //retorna o resultado da pesquisa if((strpos($_stringSQL,"UPDATE") === false) && (strpos($_stringSQL,"INSERT") === false) && (strpos($_stringSQL,"DELETE") === false)) { return $this->mysql_fetch_all($this->resultado); } else return $this->resultado; } } break; default: { } break; } $this->trace->escreveTrace("Fim da função executeQuery-Conexao"); } /** * fechaConexao() * Método para executar o fechamento da conexão */ public function fechaConexao() { $this->trace->escreveTrace("Inicio da função fechaConexao-Conexao"); //switch para executar o fechamento da conexão switch($this->tipoBanco) { case self::POSTGRESQL: { if(!$this->blnErro) { //libera memória @pg_free_result($this->resultado); } else { $this->blnErro = false; } //fecha a conexão $this->resultado = @pg_close($this->conexao); //se houver algum erro durante o fechamento cai aqui if(!$this->resultado) { $this->trace->escreveTrace("Erro ao tentar fechar a conexão"); throw new ExceptionsLayer("Erro ao tentar fechar a conexão com o banco de dados.",ExceptionsLayer::CONNECTION_ERROR); return; } else { $this->trace->escreveTrace("Fim da função fechaConexao-Conexao"); //retorna verdadeiro se o fechamento foi efetuado return true; } } break; case self::MYSQL: { if(!$this->blnErro) { //libera memória @mysql_free_result($this->resultado); } else { $this->blnErro = false; } //fecha a conexão $this->resultado = @mysql_close($this->conexao); //se houver algum erro cai aqui if(!$this->resultado) { $this->trace->escreveTrace("Erro ao tentar fechar a conexão"); throw new ExceptionsLayer("Erro ao tentar fechar a conexão com o banco de dados.",ExceptionsLayer::CONNECTION_ERROR); return; } else { $this->trace->escreveTrace("Fim da função fechaConexao-Conexao"); //retorna verdadeiro se o fechamento foi efetuado return true; } } break; default: { } break; } $this->trace->escreveTrace("Fim da função fechaConexao-Conexao"); } private function mysql_fetch_all($query) { $result = array(); while($row = mysql_fetch_assoc($query)) { array_push($result, $row); } return $result; } public function getLinhasAfetadas() { return $this->linhasAfetadas; }}?> Trace.php <?phpclass Trace{ private $stream; private $nomeArquivo; function __construct($_nome_modulo) { $config = @simplexml_load_file("./config/config.xml"); if(!$config) { echo "Erro a tentar ler o arquivo de configuração."; exit; } $this->nomeArquivo = (string)$config->trace->local . $_nome_modulo. date("d-m-y") . ".txt"; } public function escreveTrace($_stringMensagem) { $this->stream = fopen($this->nomeArquivo, "ab"); fwrite($this->stream,date("d-m-y H:i:s") . " : " . $_stringMensagem . "\r\n"); fclose($this->stream); }}?> config.xml <?xml version="1.0" encoding="iso-8859-1"?><config> <server> <host>localhost</host> <porta>5432</porta> <base>nome_da_base</base> <usuario>nome_do_usuario</usuario> <senha>0123456789</senha> <tipoBanco>1001</tipoBanco> </server> <trace> <local>./trace/</local> </trace></config> ExceptionsLayer.php <?phpclass ExceptionsLayer extends Exception{ const NOT_NULL = 1001; const INCORRECT_FORMAT = 1002; const CONNECTION_ERROR = 1003; const SQL_ERROR = 1004; public function __construct($_mensagem, $_codigo) { parent::__construct($_mensagem, $_codigo); }}?> Forma de uso da classe de conexão: /** * Retorna uma consulta com as informações dos clientes * * @param _arrayInfoConsulta Array com as informações do cliente pesquisado */ public function consultaClientes($_arrayInfoConsCliente) { $this->trace->escreveTrace("Inicio do consultaClientes-AccessLayer"); try { //cria uma nova conexão $this->conexao = new Conexao(); $sql = $this->sqlLayer->consultaClientes($_arrayInfoConsCliente); //escreve o sql no trace para posterior consulta de erro $this->trace->escreveTrace($sql); //recebe o resultado da execução da query $this->resultado = $this->conexao->executeQuery($sql); } catch(ExceptionsLayer $ex) { if($ex->getCode() != ExceptionsLayer::CONNECTION_ERROR) { //fecha a conexão $this->conexao->fechaConexao(); } throw $ex; return; } //fecha a conexão $this->conexao->fechaConexao(); $this->trace->escreveTrace("Fim do consultaClientes-AccessLayer"); //retorna o resultado da pesquisa return $this->resultado; } Ela retorna o resulta do no formato resultado[indice_linha][nome_coluna], sendo possível utilizar for, foreach e while para exibir os resultados. Se for executado um DELETE, INSERT ou UPDATE, pode ser utilizado a função getLinhasAfetadas() para saber quantas linhas foram afetas pela instrução SQL. Compartilhar este post Link para o post Compartilhar em outros sites