Ir para conteúdo

POWERED BY:

Arquivado

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

cassiano óliver

[Resolvido] Classe de extensão PDO e funções MySQL

Recommended Posts

Não houve solicitação de tal atitude, porém o usuário está tendo sua postagem moderada por conta de vários posts que não contribuem com o desenvolvimento do topico, trollando, postando em topicos como se fosse o msn da vizinha e agora querendo criar polemica.

 

Continuemos com o bom andamento deste tópico, pois o assunto discutido é interessante e relevante.

 

Posts que não estejam relacionados com o topico serão moderados.

 

Qualquer duvida entre em contato comigo por mp.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não utilize herança, ela não cabe aí.

Faça assim:

 

class ConnectionConfig {
private $_host, $_user, $_pswd, $_dbname;
public function __construct($host, $user, $pswd, $dbname){
	$this->_host = $host;
	$this->_user = $user;
	$this->_pswd = $pswd;
	$this->_dbname = $dbname;
}
}

class Conection {
private $_config;
public function __construct(ConnectionConfig $config){
   	$this->_config = $config;
}
}

 

Só não pode esquecer de colocar os getters na classe ConnectionConfig, porque senão você não tem acesso aos dados fora da classe.

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá amigos,

 

Após sugestões, seguem as modificações.

 

Classe FuncoesDB, responsável pelos métodos de acesso a informações em base de dados.

Criei os métodos baseados no que utilizo normalmente em meus projetos.

include 'class.conexao.php';

class FuncoesDB extends Conexao {
private $campos;
private $valores;
private $condicao;
private $ordem;
private $limiteInicio;
private $limiteFim;
public $tabela;
private $alias;
public $join;

/*
 * tabela_qualquer
 *
 * @param string
*/
public function setTabela($tabela, $alias = NULL) {
	if(!is_null($alias)) {
		$this->alias = $alias;
		$this->tabela = $tabela . ' ' . $this->alias;
	}
	else {
		$this->tabela = $tabela;
	}
}

/*
 * array('campo1', 'campo2', 'campo3')
 *
 * @param array ou string
*/
public function setCampos($campos) {
	if(is_array($campos)) {
		foreach($campos as $campo) {
			$this->campos .= $campo . ', ';
		}
		$this->campos = substr($this->campos, 0, -2);
	}
	else {
		$this->campos = $campos;
	}
}

/*
 * array('campo1' => 'valor1', 'campo2' => 'valor2', 'campo3' => 'valor3')
 *
 * @param array ou string
*/
public function setValores($valores) {
	if(is_array($valores)) {
		foreach($valores as $campo => $valor ){
			$this->valores .= $this->conexao->quote($valor) . ', ';
		}
		$this->valores = substr($this->valores, 0, -2);
	}
	else {
		$this->valores = $valores;
	}
}

/*
 * array('tabela1' => array('alias', 'campo de referência 1', 'campo de referência 2'), 'tabela2' => array('alias', 'campo de referência 1', 'campo de referência 2'))
 *
 * @param array
*/
public function setJoin($join) {
	foreach($join as $tabela => $parametros) {
		$this->join .= ' LEFT JOIN ' . $tabela . ' ' . $parametros[0] . ' ON (' . $parametros[0] . '.' . $parametros[1] . ' = ' .  $parametros[2] . ')';
	}
}

/*
 * Condição, Ordenação, Limite início, Limite fim
 *
 * @param string
*/
public function consulta($condicao = NULL, $ordem = NULL, $limiteInicio = NULL, $limiteFim = NULL) {
	$this->condicao = !empty($condicao) && !is_null($condicao) ? ' WHERE ' . $condicao : '';
	$this->ordem = !empty($ordem) && !is_null($ordem) ? ' ORDER BY ' . $ordem : '';
	$this->limite = $limiteInicio != '' && $limiteFim != '' && !is_null($limiteInicio) && !is_null($limiteFim) ? ' LIMIT ' . $limiteInicio . ', ' . $limiteFim : '';

	return $this->conexao->query("SELECT " . $this->campos . " FROM " . $this->tabela . $this->join . $this->condicao . $this->ordem . $this->limite . "");
	//return "SELECT " . $this->campos . " FROM " . $this->tabela . $this->join . $this->condicao . $this->ordem . $this->limite . "";
}

public function totalRegistros() {
	return $this->conexao->query("SELECT * FROM " . $this->tabela . "")->rowCount();
}

public function cadastrar() {
	if(!empty($this->campos) && !empty($this->valores)) {
		return $this->conexao->query("INSERT INTO " . $this->tabela . " (" . $this->campos . ") VALUES (" . $this->valores . ")");
	}
	else {
		echo 'Campos e/ou seus respectivos valores não foram informados.';
	}
}
}

 

Exemplos de uso:

 

Consulta simples a uma tabela (Funcionários) e exibindo seus campos.

 

$teste = new FuncoesDB;
$teste->setTabela('funcionarios');
$teste->setCampos(array('nome', 'email'));
$query = $teste->consulta('dataCadastro > CURDATE()', 'nome ASC', '1', '10');
while($dados = $query->fetch()) {
echo $dados->nome . ' - ' . $dados->email . '<br>';
}
$teste = NULL;

 

 

Consulta com JOIN. Acessando a tabela (Funcionários) e exibindo seus respectivos Departamento e Cargo.

 

CREATE TABLE `cargos` (
`id`  tinyint(3) UNSIGNED NOT NULL AUTO_INCREMENT ,
`cargo`  varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL ,
PRIMARY KEY (`id`)
)

CREATE TABLE `departamentos` (
`id`  tinyint(2) UNSIGNED NOT NULL AUTO_INCREMENT ,
`nome`  varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL ,
PRIMARY KEY (`id`)
)

CREATE TABLE `funcionarios` (
`id`  int(10) UNSIGNED NOT NULL AUTO_INCREMENT ,
`nome`  varchar(80) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL ,
`email`  varchar(60) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL ,
`cargoID`  tinyint(3) UNSIGNED NULL DEFAULT NULL ,
`departamentoID`  tinyint(3) UNSIGNED NULL DEFAULT NULL ,
PRIMARY KEY (`id`)
)

 

$teste = new FuncoesDB;
$teste->setTabela('funcionarios', 'f');
$teste->setCampos(array('f.nome', 'd.nome AS departamento', 'c.cargo'));
$teste->setJoin(array('departamentos' => array('d', 'id', 'f.departamentoID'), 'cargos' => array('c', 'id', 'f.cargoID')));
$query = $teste->consulta();
while($dados = $query->fetch()) {
echo $dados->nome . ' - ' . $dados->departamento . ' - ' . $dados->cargo . '<br>';
}
$teste = NULL;

Compartilhar este post


Link para o post
Compartilhar em outros sites

cassiano óliver

Quanto aos JOIN's, você não precisa (ao meu ver) criar métodos join, e fazer INNER, LEFT, RIGHT JOIN da vida, até por que você fazendo junção de tabelas com este método, tu escreve muito mais código. Basta fazer junção de tabelas de forma mais simples, que aí você poderá usar o método setCampos normalmente, por exemplo:

 

SELECT albuns.*, fotos.* FROM albuns WHERE albuns.id = fotos.foto

fotos.foto = id do álbum.

 

Aí (creio eu) é só você jogar os albuns.*, fotos.* no setCampos, e fazer a condição WHERE normalmente.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Henrique,

 

A classe de conexão não foi alterada.

 

class.config.php

abstract class ConfigDB {
protected $host = 'localhost';
protected $database = 'teste';
protected $usuario = 'root';
   protected $senha = '';

public function exibeErro($obj) {
	echo 'Falha ao realizar conexão à base de dados.<br /><br />
	Erro técnico: ' . $obj->getMessage() . '<br />
	Arquivo: ' . basename($obj->getFile()) . '<br />
	Linha: ' . $obj->getLine() . '<br />';
}
}

 

class.conexao.php

include 'class.config.php';

abstract class Conexao extends ConfigDB {
protected $conexao;

public function __construct() {
       try {
           //Cria a conexão ao MySQL
           if($this->conexao == NULL) {
               $this->conexao = new PDO('mysql:host=' . $this->host . ';port=3306;dbname=' . $this->database, $this->usuario, $this->senha, array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'));
			$this->conexao->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
			$this->conexao->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
               return $this->conexao;
           }
       }
       catch(PDOException $e) {
           echo 'Falha ao realizar conexão à base de dados.<br /><br />
		Erro técnico: ' . $e->getMessage() . '<br />
		Arquivo: ' . basename($e->getFile()) . '<br />
		Linha: ' . $e->getLine() . '<br />';
       }
   }

public function closeCnx() {
	$this->conexao = NULL;
}
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Novamente, você está insistindo na herança... Não faça assim... Prefira composição:

abstract class Conexao {
   protected $_config;
   protected $_conexao;
   public function __construct(ConfigDB $config) {
       $this->_config = $config;
   	$this->_init();
   }
   abstract protected function _init();
}

 

Outra coisa, se a sua classe é abstrata, não faz sentido criar uma implementação utilizando PDO/MySQL nela.

Defina na classe abstrata apenas as operações e atributos comuns a todos os tipos de conexão com o banco de dados.

 

Agora sim cabe a herança:

class PDOMySQL extends Conexao {
   protected function _init(){
       try {
           //Cria a conexão ao MySQL
           if($this->_conexao == NULL) {
               $this->_conexao = new PDO('mysql:host=' . $this->_config->getHost() . ';port=3306;dbname=' . $this_config->getDatabase(), $this->_config->getUsuario(), $this->_config->getSenha(), array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'));
                               $this->_conexao->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
                               $this->_conexao->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
       	// Return desnecessário...
           }
       }
       catch(PDOException $e) {
           echo 'Falha ao realizar conexão à base de dados.<br /><br />
                       Erro técnico: ' . $e->getMessage() . '<br />
                       Arquivo: ' . basename($e->getFile()) . '<br />
                       Linha: ' . $e->getLine() . '<br />';
       }
   }
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Henrique, seguindo suas recomendações, criei um novo arquivo para testes.

Ao tentar instanciar a classe PDOMySQL, está sendo exibido um erro, o qual não consegui identificar.

 

include 'class.config.php';

abstract class Conexao {
   protected $_config;
   protected $_conexao;

   public function __construct(ConfigDB $config) { // linha 33
       $this->_config = $config;
       $this->_init();
   }

   abstract protected function _init();
}

class PDOMySQL extends Conexao {
   protected function _init(){
       try {
           //Cria a conexão ao MySQL
           if($this->_conexao == NULL) {
               $this->_conexao = new PDO('mysql:host=' . $this->_config->host . ';port=3306;dbname=' . $this->_config->database, $this->_config->usuario, $this->_config->senha, array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'));
                               $this->_conexao->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
                               $this->_conexao->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
               // Return desnecessário...
           }
       }
       catch(PDOException $e) {
           echo 'Falha ao realizar conexão à base de dados.<br /><br />
                       Erro técnico: ' . $e->getMessage() . '<br />
                       Arquivo: ' . basename($e->getFile()) . '<br />
                       Linha: ' . $e->getLine() . '<br />';
       }
   }
}

$teste = new PDOMySQL; // linha 61

 

Catchable fatal error: Argument 1 passed to Conexao::__construct() must be an instance of ConfigDB, none given, called in C:\Program Files\xampp\htdocs\testes\poo\classes\db\class.conexao2.php on line 61 and defined in C:\Program Files\xampp\htdocs\testes\poo\classes\db\class.conexao2.php on line 33

Compartilhar este post


Link para o post
Compartilhar em outros sites

Precisa alterar a classe ConfigDB também:

class ConfigDB {
       private $_host = 'localhost';
       private $_database = 'teste';
       private $_usuario = 'root';
       private $_senha = '';

       public function __construct($host, $database, $usuario, $senha){
       	$this->_host 	 = $host;
       	$this->_database = $database;
       	$this->_usuario  = $usuario;
       	$this->_senha 	 = $senha;
      	}

      	public function getHost(){
      		return $this->_host;
      	}

      	public function getDatabase(){
      		return $this->_database;
      	}

      	public function getUsuario(){
      		return $this->_usuario;
      	}

      	public function getSenha(){
      		return $this->_senha;
      	}

       public function exibeErro($obj) {
               echo 'Falha ao realizar conexão à base de dados.<br /><br />
               Erro técnico: ' . $obj->getMessage() . '<br />
               Arquivo: ' . basename($obj->getFile()) . '<br />
               Linha: ' . $obj->getLine() . '<br />';
       }
}

 

Agora para utilizá-la:

$config = new ConfigDB('localhost', 'teste', 'root', '');
$teste = new PDOMySQL($config);

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.