Ir para conteúdo

POWERED BY:

Arquivado

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

hunternh

[Resolvido] Classe de conexão MySQL e PostgreSQL

Recommended Posts

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

×

Informação importante

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