Ir para conteúdo

POWERED BY:

Arquivado

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

LaBoss

Class Mysqli (Mais Uma)

Recommended Posts

Boas ppl fiz esta class à um tempo vou postar aqui para saber as vossas opiniões sobre ela e o que deve melhor nela, e se existirem bugs para reportarem

 

Funcionalidades:

  • Usa mysqli bind param por causa da SQL Injection
  • Gera a paginacao
  • Permite fazer select's complexos
  • Permite Filtrar
  • Permite Ordenar

 

Cumprimentos

 

Ficheiro class.Basedados.php

<?php

/** 
* @author LaBoss
* 
* 
*/
class BaseDados extends mysqli {
function __construct() {
	$hostname = DB_SERVIDOR;
	$username = DB_USER;
	$password = DB_PASS;
	$database = DB_NOME;
	$porta = DB_PORTA;

	@parent::__construct ( $hostname, $username, $password, $database, $porta );

	if ($this->connect_errno == 1045) {
		throw new RuntimeException ( 'Acesso Negado à base dados' );
	} elseif ($this->connect_errno == 1049) {
		throw new RuntimeException ( 'Erro ao selecionar a Base de Dados' );
	} elseif ($this->connect_errno == 2002) {
		throw new RuntimeException ( 'Servidor SQL Desconhecido' );
	} elseif ($this->connect_errno != 0) {
		throw new RuntimeException ( $this->connect_errno . $this->connect_error );
	}
}

private function CarregarParametros($arr) {
	$refs = array ();
	foreach ( $arr as $key => $value ) {
		$refs [$key] = &$arr [$key];
	}
	return $refs;
}

public function MontarWhere($Campos) {
	$SQLFiltro = "";
	for($i = 0; $i <= count ( $Campos ) - 1; $i ++) {
		if ($i == 0) {
			$SQLFiltro = " WHERE " . $Campos [$i];
		} else {
			$SQLFiltro .= " AND " . $Campos [$i];
		}
	}
	return $SQLFiltro;
}

public function MontarOrder($Dados) {
	$SQLOrdem = "";

	if ($Dados ["Campos"] [0] == "RAND") {
		return " ORDER BY RAND()";
	} else {
		for($i = 0; $i <= count ( $Dados ["Campos"] ) - 1; $i ++) {
			if ($i == 0) {
				$SQLFiltro = " ORDER BY " . $Dados ["Campos"] [$i];
			} else {
				$SQLFiltro .= "," . $Dados ["Campos"] [$i];
			}
		}
		return $SQLFiltro . " " . $Dados ["Ordem"];
	}
}

private function Paginacao($DadosPaginacao, $Query, $Parametros = array()) {
	$PaginaActual = empty ( $DadosPaginacao ["Actual"] ) ? 1 : ( int ) $DadosPaginacao ["Actual"];
	$Itens_PorPagina = empty ( $DadosPaginacao ["ItensPagina"] ) ? 15 : ( int ) $DadosPaginacao ["ItensPagina"];
	$PrimeiroRegisto = (($PaginaActual * $Itens_PorPagina) <= 0) ? 0 : ($PaginaActual * $Itens_PorPagina) - $Itens_PorPagina;

	$QueryTotal = preg_replace ( array ('/SELECT(.*)FROM /Asi', '/ORDER BY (.*)/i' ), array ('SELECT COUNT(*) AS Total FROM ', '' ), $Query, 1 );
	$TotalDados = self::Query ( $QueryTotal, array (), array (), $Parametros );
	$TotalRegistos = $TotalDados ["Dados"][0] ["Total"];

	$N_Total_Paginas = ceil ( $TotalRegistos / $Itens_PorPagina ); // Diz quantas paginas vai gerar


	$PaginaSeguinte = ($PaginaActual < $N_Total_Paginas) ? $PaginaActual + 1 : NULL;
	$PaginaAnterior = ($PaginaActual > 1 && $PaginaActual <= $N_Total_Paginas) ? $PaginaActual - 1 : NULL;

	return array ("SQLLimit" => "LIMIT {$PrimeiroRegisto}, {$Itens_PorPagina}", "InfosPaginacao" => array ("TotalRegistos" => $TotalRegistos, "ItensPorPagina" => $Itens_PorPagina, "TotalPaginas" => $N_Total_Paginas, "PaginaActual" => $PaginaActual, "PaginaAnterior" => $PaginaAnterior, "PaginaSeguinte" => $PaginaSeguinte, "PrimeiraPagina" => 1, "UltimaPagina" => $N_Total_Paginas ) );

}

public function Query($Query, $Where = array(), $Ordem = array(), $Parametros = array(), $Paginacao = array()) {
	$Colunas = array ();
	$Resultados = array ();
	$Linha = array ();
	$PaginacaoDados = array ();

	$WhereSQL = (count ( $Where )) ? self::MontarWhere ( $Where ) : "";
	$OrdemSQL = (count ( $Ordem )) ? self::MontarOrder ( $Ordem ) : "";

	$QueryFinal = $Query . $WhereSQL . $OrdemSQL;

	/*
	 * Paginacao
	 */
	if (count ( $Paginacao ) > 0) {
		$PaginacaoDados = self::Paginacao ( $Paginacao, $QueryFinal, $Parametros );
		$QueryFinal = $QueryFinal . " " . $PaginacaoDados ["SQLLimit"];
	}

	$stmt = parent::prepare ( $QueryFinal );
	if ($stmt) {

		/*
		 * Carrega os Parametros :P
		 */
		if (count ( $Parametros ) > 0) {
			call_user_func_array ( array ($stmt, 'bind_param' ), self::CarregarParametros ( $Parametros ) );
		}

		$stmt->execute ();
		$stmt->store_result ();
		/*
	 	 * Carrega todos os campos no Select
	 	 */
		$meta = $stmt->result_metadata ();
		while ( ($Campo = $meta->fetch_field ()) != false ) {
			$Colunas [] = &$Linha [$Campo->name];
		}
		call_user_func_array ( array ($stmt, 'bind_result' ), $Colunas );

		/*
		 * Carrega todos os Dados
		 */
		while ( $stmt->fetch () ) {
			$x = array ();
			foreach ( $Linha as $key => $val ) {
				$x [$key] = $val;
			}
			$Resultados [] = $x;
		}
		$Dados = array ("Dados" => $Resultados);
		$Infos = array ("InfosSQL" => array ("num_rows" => $stmt->num_rows, "affected_rows" => $stmt->affected_rows, "field_count" => $stmt->field_count, "sqlstate" => $stmt->sqlstate ) );
		$ArrPaginas = (count ( $PaginacaoDados ) > 0) ? array ("Paginacao" => $PaginacaoDados ["InfosPaginacao"] ) : array ();

		return array_merge ( $Dados, $ArrPaginas, $Infos );
	} else {
		throw new RuntimeException ( self::Erro () );
	}
}

public function Operacoes($Query, $Parametros = array()) {
	$Colunas = array ();
	$Resultados = array ();
	$Linha = array ();

	$stmt = parent::prepare ( $Query );
	if ($stmt) {

		/*
		 * Carrega os Parametros :P
		 */
		if (count ( $Parametros ) > 0) {
			call_user_func_array ( array ($stmt, 'bind_param' ), self::CarregarParametros ( $Parametros ) );
		}

		$stmt->execute ();
		$stmt->store_result ();

		$Infos = array ("InfosSQL" => array ("ID_Inserido" => $stmt->insert_id, "num_rows" => $stmt->num_rows, "affected_rows" => $stmt->affected_rows, "field_count" => $stmt->field_count, "sqlstate" => $stmt->sqlstate ) );

		return $Infos;
	} else {
		throw new RuntimeException ( self::Erro () );
	}
}

public function Erro() {
	if ($this->errno || $this->error) {
		return sprintf ( "Erro (%d): %s", $this->errno, $this->error );
	}
}

function __destruct() {
	parent::close ();
}
}

?>

 

Ficheiro Demo.php

<?php
define("DB_SERVIDOR", "localhost");
define("DB_USER", "root");
define("DB_PASS", "");
define("DB_NOME", "testes");
define("BD_PREF", "");
define("DB_PORTA", 3306);

include "class.Basedados.php";
try {
$BD = new BaseDados ();

echo "<pre>";

print_r ( $BD->Operacoes ( "UPDATE utilizadores SET U_Login =  ? WHERE  U_ID = ?", array ("si", "DanielCris", 2 ) ) );

print_r ( $Inserido = $BD->Operacoes ( "INSERT INTO  utilizadores (U_Login) VALUES (?);", array ("s", "DanielCris" ) ) );

       print_r ( $BD->Query ( "SELECT * FROM utilizadores " ) );

       print_r ( $Inserido = $BD->Operacoes ( "DELETE FROM utilizadores WHERE U_ID = ?", array ("i", $Inserido ["InfosSQL"] ["ID_Inserido"] ) ) );


$Where = array("U_ID BETWEEN ? AND ?");
$Order = array("Campos" => array("U_ID"), "Ordem" => "ASC");
$Parametros = array("ii", 2, 9);
$Paginacao = array("ItensPagina" => 2, "Actual" => $_GET["p"]);

print_r ( 
	$BD->Query ( "SELECT * FROM utilizadores ", 
						$Where,
						$Order,
						$Parametros, 
						$Paginacao)
	);

} catch ( Exception $e ) {
echo $e->getMessage (), "\n";
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Funcionalidades:

  • Usa mysqli bind param por causa da SQL Injection
  • Gera a paginacao
  • Permite fazer select's complexos
  • Permite Filtrar
  • Permite Ordenar

ou seja, muita coisa para uma classe só.

 

não se esqueça do operador de visibilidade:

function __construct() {

 

não entendi esse método

private function CarregarParametros($arr) {

você recebe um array, e devolve outro array exatamente igual. Pra que ?

 

 

Uma coisa que "não gostei", é que você não ofereceu nem um singleton ou um registry para impedir q o cara instancie várias vezes desnecessariamente o banco.

 

Eu me confundiria com essa nomenclatura alternando entre maiusculas e minusculas, mas isso é só questão de gosto pessoal.

 

 

No mais ficou bacana, parabéns.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você tem razão mas eu agora vejo dificuldade nessa dos parâmetros se forem muitos torna-se quase imperceptível ver por isso vou tentar adoptar um sistema deste género:

 

array(

array("s", "daniel"),

array("i", 22)

);

 

É uma boa ideia essa do singleton vou adoptar isso na class :P

 

Obrigado pela critica construtiva :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não conhecia esse site vou colocar la sim mas depois de fazer as devidas alterações :P

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fica aqui a nova versão da class:

 

Alterações

  • Visibilidade do Construtor
  • Singleton
  • phpDocs
  • Novo método de passar parâmetros

 

<?php

/** 
* @author     Daniel Oliveira <daniel.scbo@gmail.com>
* @version    1.1 2011-08-16
* @package    BaseDados
* @copyright  Copyright (c) 2011 Daniel Oliveira
* @license    http://www.gnu.org/licenses/gpl.txt     GPL  
*/
class BaseDados extends mysqli {
private static $instancia;

public static function getInstancia() {
	if (empty ( self::$instancia )) {
		self::$instancia = new BaseDados ();
	}
	return self::$instancia;
}

public function __construct() {
	$hostname = DB_SERVIDOR;
	$username = DB_USER;
	$password = DB_PASS;
	$database = DB_NOME;
	$porta = DB_PORTA;

	@parent::__construct ( $hostname, $username, $password, $database, $porta );

	if ($this->connect_errno == 1045) {
		throw new RuntimeException ( 'Acesso Negado à base dados' );
	} elseif ($this->connect_errno == 1049) {
		throw new RuntimeException ( 'Erro ao selecionar a Base de Dados' );
	} elseif ($this->connect_errno == 2002) {
		throw new RuntimeException ( 'Servidor SQL Desconhecido' );
	} elseif ($this->connect_errno != 0) {
		throw new RuntimeException ( $this->connect_errno . $this->connect_error );
	}
}

private function CarregarParametros($arr) {

	$NovoArray = array ();
	$NovoArray [0] = "";
	for($i = 0; $i <= count ( $arr ) - 1; $i ++) {
		$NovoArray [0] .= $arr [$i] [0];
		$NovoArray [] = $arr [$i] [1];
	}

	$refs = array ();
	foreach ( $NovoArray as $key => $value ) {
		$refs [$key] = &$NovoArray [$key];
	}
	return $refs;
}

public function MontarWhere($Campos) {
	$SQLFiltro = "";
	for($i = 0; $i <= count ( $Campos ) - 1; $i ++) {
		if ($i == 0) {
			$SQLFiltro = " WHERE " . $Campos [$i];
		} else {
			$SQLFiltro .= " AND " . $Campos [$i];
		}
	}
	return $SQLFiltro;
}

public function MontarOrder($Dados) {
	$SQLOrdem = "";

	if ($Dados ["Campos"] [0] == "RAND") {
		return " ORDER BY RAND()";
	} else {
		for($i = 0; $i <= count ( $Dados ["Campos"] ) - 1; $i ++) {
			if ($i == 0) {
				$SQLFiltro = " ORDER BY " . $Dados ["Campos"] [$i];
			} else {
				$SQLFiltro .= "," . $Dados ["Campos"] [$i];
			}
		}
		return $SQLFiltro . " " . $Dados ["Ordem"];
	}
}

private function Paginacao($DadosPaginacao, $Query, $Parametros = array()) {
	$PaginaActual 		= empty ( $DadosPaginacao ["Actual"] ) ? 1 : ( int ) $DadosPaginacao ["Actual"];
	$Itens_PorPagina 	= empty ( $DadosPaginacao ["ItensPagina"] ) ? 15 : ( int ) $DadosPaginacao ["ItensPagina"];
	$PrimeiroRegisto 	= (($PaginaActual * $Itens_PorPagina) <= 0) ? 0 : ($PaginaActual * $Itens_PorPagina) - $Itens_PorPagina;

	$QueryTotal = preg_replace ( array ('/SELECT(.*)FROM /Asi', '/ORDER BY (.*)/i' ), array ('SELECT COUNT(*) AS Total FROM ', '' ), $Query, 1 );
	$TotalDados = self::Query ( $QueryTotal, array (), array (), $Parametros );
	$TotalRegistos = $TotalDados ["Dados"] [0] ["Total"];

	$N_Total_Paginas = ceil ( $TotalRegistos / $Itens_PorPagina ); // Diz quantas paginas vai gerar


	$PaginaSeguinte = ($PaginaActual < $N_Total_Paginas) ? $PaginaActual + 1 : NULL;
	$PaginaAnterior = ($PaginaActual > 1 && $PaginaActual <= $N_Total_Paginas) ? $PaginaActual - 1 : NULL;

	return array ("SQLLimit" => "LIMIT {$PrimeiroRegisto}, {$Itens_PorPagina}", "InfosPaginacao" => array ("TotalRegistos" => $TotalRegistos, "ItensPorPagina" => $Itens_PorPagina, "TotalPaginas" => $N_Total_Paginas, "PaginaActual" => $PaginaActual, "PaginaAnterior" => $PaginaAnterior, "PaginaSeguinte" => $PaginaSeguinte, "PrimeiraPagina" => 1, "UltimaPagina" => $N_Total_Paginas ) );

}

/**
 * Executa a Query na Base dados
 *
 * @param string $Query - Query MySQL
 * @param array $Where - Array com os dados para a filtragem Where
 * @param array $Ordem - Array com os dados para a ordenação dos dados
 * @param array $Parametros - Array com os parametros da query
 * @param arrat $Paginacao - Array com os dados para a paginacao
 * @return array $Dados - Dados vindo da BD
 */
public function Query($Query, $Where = array(), $Ordem = array(), $Parametros = array(), $Paginacao = array()) {
	$Colunas = array ();
	$Resultados = array ();
	$Linha = array ();
	$PaginacaoDados = array ();

	$WhereSQL = (count ( $Where )) ? self::MontarWhere ( $Where ) : "";
	$OrdemSQL = (count ( $Ordem )) ? self::MontarOrder ( $Ordem ) : "";

	$QueryFinal = $Query . $WhereSQL . $OrdemSQL;

	/*
	 * Paginacao
	 */
	if (count ( $Paginacao ) > 0) {
		$PaginacaoDados = self::Paginacao ( $Paginacao, $QueryFinal, $Parametros );
		$QueryFinal = $QueryFinal . " " . $PaginacaoDados ["SQLLimit"];
	}

	$stmt = parent::prepare ( $QueryFinal );
	if ($stmt) {

		/*
		 * Carrega os Parametros :P
		 */
		if (count ( $Parametros ) > 0) {
			call_user_func_array ( array ($stmt, 'bind_param' ), self::CarregarParametros ( $Parametros ) );
		}

		$stmt->execute ();
		$stmt->store_result ();
		/*
	 	 * Carrega todos os campos no Select
	 	 */
		$meta = $stmt->result_metadata ();
		while ( ($Campo = $meta->fetch_field ()) != false ) {
			$Colunas [] = &$Linha [$Campo->name];
		}
		call_user_func_array ( array ($stmt, 'bind_result' ), $Colunas );

		/*
		 * Carrega todos os Dados
		 */
		while ( $stmt->fetch () ) {
			$x = array ();
			foreach ( $Linha as $key => $val ) {
				$x [$key] = $val;
			}
			$Resultados [] = $x;
		}
		$Dados = array ("Dados" => $Resultados );
		$Infos = array ("InfosSQL" => array ("num_rows" => $stmt->num_rows, "affected_rows" => $stmt->affected_rows, "field_count" => $stmt->field_count, "sqlstate" => $stmt->sqlstate ) );
		$ArrPaginas = (count ( $PaginacaoDados ) > 0) ? array ("Paginacao" => $PaginacaoDados ["InfosPaginacao"] ) : array ();

		return array_merge ( $Dados, $ArrPaginas, $Infos );
	} else {
		throw new RuntimeException ( self::Erro () );
	}
}

/**
 * Executa operações como Updates, Inserts e Delete
 *
 * @param string $Query - Query MySQL
 * @param array $Parametros - Array com os parametros da query
 * @return array $Dados - Dados vindo da BD
 */
public function Operacoes($Query, $Parametros = array()) {
	$Colunas = array ();
	$Resultados = array ();
	$Linha = array ();

	$stmt = parent::prepare ( $Query );
	if ($stmt) {

		/*
		 * Carrega os Parametros :P
		 */
		if (count ( $Parametros ) > 0) {
			call_user_func_array ( array ($stmt, 'bind_param' ), self::CarregarParametros ( $Parametros ) );
		}

		$stmt->execute ();
		$stmt->store_result ();

		$Infos = array ("InfosSQL" => array ("ID_Inserido" => $stmt->insert_id, "num_rows" => $stmt->num_rows, "affected_rows" => $stmt->affected_rows, "field_count" => $stmt->field_count, "sqlstate" => $stmt->sqlstate ) );

		return $Infos;
	} else {
		throw new RuntimeException ( self::Erro () );
	}
}

public function Erro() {
	if ($this->errno || $this->error) {
		return sprintf ( "Erro (%d): %s", $this->errno, $this->error );
	}
}

function __destruct() {
	parent::close ();
}
}

?>

 

Exemplo:

 

<?php
define("DB_SERVIDOR", "localhost");
define("DB_USER", "root");
define("DB_PASS", "");
define("DB_NOME", "testes");
define("BD_PREF", "");
define("DB_PORTA", 3306);

include "class.Basedados.php";
try {
$BD = BaseDados::getInstancia ();
$Where = array ("U_ID = ?", "U_Login = ?" );
$Order = array ("Campos" => array ("U_ID" ), "Ordem" => "ASC" );
$Parametros = array (array ("i", 2 ), array ("s", "DanielCris" ) );
$Paginacao = array ("ItensPagina" => 2, "Actual" => (! isset ( $_GET ["p"] )) ? 0 : $_GET ["p"] );

echo "<pre>";
print_r ( 
	$BD->Query ( "SELECT * FROM utilizadores", $Where, $Order, $Parametros, $Paginacao ) );
echo "</pre>";

// Exemplo Operacoes
echo "<h1>Output Operações</h1><br>";
$ParametrosInsert = array (
							array ("s", "iMasters" ), 
							array ("s", md5("123456") ),  
							array ("s", "Forum iMasters" ));
       echo "<pre>";
print_r ( 
	$BD->Operacoes ( "INSERT INTO utilizadores (`U_Login`, `U_Password`, `U_Nome`) VALUES (?, ?, ?);", $ParametrosInsert));
echo "<pre>";
} catch ( Exception $e ) {

?>

 

Exemplo do Output do Exemplo

Array
(
   [Dados] => Array
       (
           [0] => Array
               (
                   [u_ID] => 2
                   [u_Login] => DanielCris
                   [u_Password] => 6ba19813d8fe1145922b11ba580e477f6ea0dfb7
                   [u_Nome] => Cristiano Perdigao
                   [u_Cidade] => 
                   [u_Email] => 
                   [u_Tlf] => 
                   [u_Estado] => P
                   [u_DataRegisto] => 
                   [u_UltimaVisita] => 
                   [u_IP] => 
                   [u_CaveActiva] => 
                   [u_Foto] => 
               )

       )

   [Paginacao] => Array
       (
           [TotalRegistos] => 1
           [itensPorPagina] => 2
           [TotalPaginas] => 1
           [PaginaActual] => 1
           [PaginaAnterior] => 
           [PaginaSeguinte] => 
           [PrimeiraPagina] => 1
           [ultimaPagina] => 1
       )

   [infosSQL] => Array
       (
           [num_rows] => 1
           [affected_rows] => 1
           [field_count] => 13
           [sqlstate] => 00000
       )

)

Output Operações

Array
(
   [infosSQL] => Array
       (
           [iD_Inserido] => 17
           [num_rows] => 0
           [affected_rows] => 1
           [field_count] => 0
           [sqlstate] => 00000
       )

)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você não documentou todas as funções, não trocou a visibilidade de todos os métodos, além do mais, você usa muito o 'self::', porque não usa o $this ? fica bem mais claro é limpo, esse self dá impressão que você está chamando um método estático.

 

Outra, qual o motivo de você estender a 'mysqli' ? você pode criar o objeto dela mesmo ali no construtor e atribuir a uma variável, ficaria bem mais limpo.

 

Não entendi também o seu 'CarregaParametros', o que ele faz ? você passa o array em um loop e retorna o mesmo no outro, ali, se for o que eu estou pensando, seria os valores a serem colocados na query ? se sim faça um if verificando se é ou não numérico, assim você usa aspas e não usa aspas em tais valores.

 

Outra coisa, 'eu' não gostei dessa sua nomenclatura, além de não ficar legar escrever os nomes dos métodos em português você usa UpperCamelCase, prefira usar o lowerCamelCase.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Posso usar $this acho que não há qualquer diferença nos dois métodos ou existe? Eu extendo o mysqli porque é uma questão de gosto nada mais :P

 

O CarregaParametros é para receber a array com os dados em formato array (array ("i", 2 ), array ("s", "DanielCris" ) ); e transformar em array("is", 2, "DanielCris"), para os enviar através de bind_param, esse ideia do if gostei vou implementar, a questao da nomenclatura e mesmo uma questao de gosto.

 

Vou tentar mudar a classicista para fazer métodos separados como, setWhere, setOrder e setParametros acho que será mais simples o uso da mesma!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fiz uma nova versão da class fica aqui:

 

Foi alterado o método de definir os paramentos, order, where e paginação.

<?php

/** 
* @author     Daniel Oliveira <daniel.scbo@gmail.com>
* @version    1.5 2011-08-25
* @package    BaseDados
* @copyright  Copyright (c) 2011 Daniel Oliveira
* @license    http://www.gnu.org/licenses/gpl.txt     GPL  
*/
class BaseDados extends mysqli {
private static $instancia;
private $_Parametros = array ();
private $_Where = array ();
private $_Order = array ();
private $_Paginacao = array ();

/**
 * Verifica se a classe ja foi iniciada e recupera a sua instância 
 */
public static function getInstancia() {
	if (empty ( self::$instancia )) {
		self::$instancia = new BaseDados ();
	}
	return self::$instancia;
}

/**
 * Construtor da CLASS
 */
public function __construct() {
	$hostname = DB_SERVIDOR;
	$username = DB_USER;
	$password = DB_PASS;
	$database = DB_NOME;
	$porta = DB_PORTA;

	@parent::__construct ( $hostname, $username, $password, $database, $porta );

	if ($this->connect_errno == 1045) {
		throw new RuntimeException ( 'Acesso Negado à base dados' );
	} elseif ($this->connect_errno == 1049) {
		throw new RuntimeException ( 'Erro ao selecionar a Base de Dados' );
	} elseif ($this->connect_errno == 2002) {
		throw new RuntimeException ( 'Servidor SQL Desconhecido' );
	} elseif ($this->connect_errno != 0) {
		throw new RuntimeException ( $this->connect_errno . $this->connect_error );
	}
}

/**
 * Carrega os parametros para definir na query
 *
 * @param array $arr - Array com os parametros da query
 * @return array $refs - Parametros Formatados
 */
private function CarregarParametros($arr) {

	$NovoArray = array ();
	$NovoArray [0] = "";
	for($i = 0; $i <= count ( $arr ) - 1; $i ++) {
		$NovoArray [0] .= $arr [$i] [0];
		if(is_numeric($arr [$i] [1])){
			$NovoArray [] = (int)$arr [$i] [1];
		} else {
			$NovoArray [] = $arr [$i] [1];
		}

	}

	$refs = array ();
	foreach ( $NovoArray as $key => $value ) {
		$refs [$key] = &$NovoArray [$key];
	}
	return $refs;
}

/**
 * Monta Where para definir na query
 *
 * @param array $arr - Array com os campos para filtrar da query
 * @return string $SQLFiltro - SQL do WHERE
 */
private function MontarWhere($Campos) {
	$SQLFiltro = "";
	for($i = 0; $i <= count ( $Campos ) - 1; $i ++) {
		if ($i == 0) {
			$SQLFiltro = " WHERE " . $Campos [$i];
		} else {
			$SQLFiltro .= " AND " . $Campos [$i];
		}
	}
	return $SQLFiltro;
}

/**
 * Monta Order para definir na query
 *
 * @param array $Dados - Array com os campos para ordenar da query
 * @return string $SQLFiltro - SQL do ORDER
 */
private function MontarOrder($Dados) {
	$SQLOrdem = "";

	if ($Dados ["Campos"] [0] == "RAND") {
		return " ORDER BY RAND()";
	} else {
		for($i = 0; $i <= count ( $Dados ["Campos"] ) - 1; $i ++) {
			if ($i == 0) {
				$SQLFiltro = " ORDER BY " . $Dados ["Campos"] [$i];
			} else {
				$SQLFiltro .= "," . $Dados ["Campos"] [$i];
			}
		}
		return $SQLFiltro . " " . $Dados ["Ordem"];
	}
}

/**
 * Mostra o total de registo na consulta
 *
 * @param string $Query - Query de consulta
 * @return int $Total - Total de registos encontrados
 */
private function TotalRegistos($Query){
	$QueryTotal 		= preg_replace ( array ('/SELECT(.*)FROM /Asi', '/ORDER BY (.*)/i' ), array ('SELECT COUNT(*) AS Total FROM ', '' ), $Query, 1 );
	$stmt = parent::prepare ( $QueryTotal ) or die($this->Erro);
	if ($stmt) {
		if (count (	 $this->_Parametros ) > 0) {
			call_user_func_array ( array ($stmt, 'bind_param' ), $this->CarregarParametros ( $this->_Parametros ) );
		}

		$stmt->execute ();
		$stmt->store_result ();
		$stmt->bind_result($Total);
		$stmt->fetch();
		return $Total;
	} else {
		return 0;
	}
}

/**
 * Monta paginacao de resultados
 *
 * @param array $DadosPaginacao - Dados para a paginação
 * @param string $Query - Query de consulta
 * @return array $Dados - Dados para realizar a paginação
 */
private function Paginacao($DadosPaginacao, $Query) {
	$PaginaActual 		= empty ( $DadosPaginacao ["Actual"] ) ? 1 : ( int ) $DadosPaginacao ["Actual"];
	$Itens_PorPagina 	= empty ( $DadosPaginacao ["ItensPagina"] ) ? 15 : ( int ) $DadosPaginacao ["ItensPagina"];
	$PrimeiroRegisto 	= (($PaginaActual * $Itens_PorPagina) <= 0) ? 0 : ($PaginaActual * $Itens_PorPagina) - $Itens_PorPagina;

	$TotalRegistos		= $this->TotalRegistos($Query);

	$N_Total_Paginas = ceil ( $TotalRegistos / $Itens_PorPagina ); // Diz quantas paginas vai gerar


	$PaginaSeguinte = ($PaginaActual < $N_Total_Paginas) ? $PaginaActual + 1 : NULL;
	$PaginaAnterior = ($PaginaActual > 1 && $PaginaActual <= $N_Total_Paginas) ? $PaginaActual - 1 : NULL;

	return array ("SQLLimit" => "LIMIT {$PrimeiroRegisto}, {$Itens_PorPagina}", "InfosPaginacao" => array ("TotalRegistos" => $TotalRegistos, "ItensPorPagina" => $Itens_PorPagina, "TotalPaginas" => $N_Total_Paginas, "PaginaActual" => $PaginaActual, "PaginaAnterior" => $PaginaAnterior, "PaginaSeguinte" => $PaginaSeguinte, "PrimeiraPagina" => 1, "UltimaPagina" => $N_Total_Paginas ) );
}

/**
 * Define o WHERE
 *
 * @param array $Where - Array com os campos para filtrar na query
 */
public function setWhere($Where) {
	if (is_array ( $Where )) {
		$this->_Where = $Where;
	} else {
		$this->_Where = array ();
	}
}

/**
 * Define o ORDER
 *
 * @param array $Order - Array com os campos para ordenar na query
 */
public function setOrder($Order) {
	if (is_array ( $Order )) {
		$this->_Order = $Order;
	} else {
		$this->_Order = array ();
	}
}

/**
 * Define os Parametros
 *
 * @param array $Parametros - Array com os parametros da query
 */
public function setParametros($Parametros) {
	if (is_array ( $Parametros )) {
		$this->_Parametros = $Parametros;
	} else {
		$this->_Parametros = array ();
	}
}

/**
 * Define a paginação
 *
 * @param array $Paginacao - Array com os dados da paginação
 */
public function setPaginacao($Paginacao) {
	if (is_array ( $Paginacao )) {
		$this->_Paginacao = $Paginacao;
	} else {
		$this->_Paginacao = array ();
	}
}

/**
 * Executa a Query na Base dados
 *
 * @param string $Query - Query MySQL
 * @param array $Where - Array com os dados para a filtragem Where
 * @param array $Ordem - Array com os dados para a ordenação dos dados
 * @param array $Parametros - Array com os parametros da query
 * @param arrat $Paginacao - Array com os dados para a paginacao
 * @return array $Dados - Dados vindo da BD
 */
public function Query($Query) {
	$Colunas = array ();
	$Resultados = array ();
	$Linha = array ();
	$PaginacaoDados = array ();


	$WhereSQL = (count ( $this->_Where )) ? $this->MontarWhere ( $this->_Where ) : "";
	$OrdemSQL = (count ( $this->_Order )) ? $this->MontarOrder ( $this->_Order ) : "";

	$QueryFinal = $Query . $WhereSQL . $OrdemSQL;

	/*
	 * Paginacao
	 */
	if (count ( $this->_Paginacao ) > 0) {
		$PaginacaoDados = $this->Paginacao ( $this->_Paginacao, $QueryFinal);
		$QueryFinal 	= $QueryFinal . " " . $PaginacaoDados ["SQLLimit"];
	}

	$stmt = parent::prepare ( $QueryFinal );
	if ($stmt) {

		/*
		 * Carrega os Parametros :P
		 */
		if (count ( $this->_Parametros ) > 0) {
			call_user_func_array ( array ($stmt, 'bind_param' ), $this->CarregarParametros ( $this->_Parametros ) );
		}

		$stmt->execute ();
		$stmt->store_result ();
		/*
	 	 * Carrega todos os campos no Select
	 	 */
		$meta = $stmt->result_metadata ();
		while ( ($Campo = $meta->fetch_field ()) != false ) {
			$Colunas [] = &$Linha [$Campo->name];
		}
		call_user_func_array ( array ($stmt, 'bind_result' ), $Colunas );

		/*
		 * Carrega todos os Dados
		 */
		while ( $stmt->fetch () ) {
			$x = array ();
			foreach ( $Linha as $key => $val ) {
				$x [$key] = $val;
			}
			$Resultados [] = $x;
		}
		$Dados = array ("Dados" => $Resultados );
		$Infos = array ("InfosSQL" => array ("num_rows" => $stmt->num_rows, "affected_rows" => $stmt->affected_rows, "field_count" => $stmt->field_count, "sqlstate" => $stmt->sqlstate ) );
		$ArrPaginas = (count ( $PaginacaoDados ) > 0) ? array ("Paginacao" => $PaginacaoDados ["InfosPaginacao"] ) : array ();

		return array_merge ( $Dados, $ArrPaginas, $Infos );
	} else {
		throw new RuntimeException ( $this->Erro);
	}
}

/**
 * Executa operações como Updates, Inserts e Delete
 *
 * @param string $Query - Query MySQL
 * @return array $Dados - Dados vindo da BD
 */
public function Operacoes($Query) {
	$Colunas = array ();
	$Resultados = array ();
	$Linha = array ();

	$stmt = parent::prepare ( $Query );
	if ($stmt) {

		/*
		 * Carrega os Parametros :P
		 */
		if (count ( $this->_Parametros ) > 0) {
			call_user_func_array ( array ($stmt, 'bind_param' ), $this->CarregarParametros ( $this->_Parametros ) );
		}

		$stmt->execute ();
		$stmt->store_result ();

		$Infos = array ("InfosSQL" => array ("ID_Inserido" => $stmt->insert_id, "num_rows" => $stmt->num_rows, "affected_rows" => $stmt->affected_rows, "field_count" => $stmt->field_count, "sqlstate" => $stmt->sqlstate ) );

		return $Infos;
	} else {
		throw new RuntimeException ( $this->Erro () );
	}
}

/**
 * Mostra Erros
 * 
 * @return string Erro gerado
 */
public function Erro() {
	if ($this->errno || $this->error) {
		return sprintf ( "Erro (%d): %s", $this->errno, $this->error );
	}
}

/**
 * __destruct()
 */
public function __destruct() {
	parent::close ();
}
}

?>

 

Fica aqui um exemplo:

 

<?php
try {
include "../Tunning.org/inc/config.inc.php";
echo "<pre>";

$BD = BaseDados::getInstancia ();
$Where = array ("U_ID = ?", "U_Login = ?" );
$Order = array ("Campos" => array ("U_ID" ), "Ordem" => "ASC" );
$Parametros = array (array ("i", 1 ), array ("s", "admin" ) );
$Paginacao = array ("ItensPagina" => 2, "Actual" => (! isset ( $_GET ["p"] )) ? 0 : $_GET ["p"] );

$BD->setWhere($Where);
$BD->setParametros($Parametros);
$BD->setOrder($Order);
$BD->setPaginacao($Paginacao);


print_r ( $BD->Query ( "SELECT * FROM utilizadores" ) );

// Exemplo Operacoes
echo "<h1>Output Operações</h1><br>";

$ParametrosInsert = array (array ("s", "iMasters" ), array ("s", md5 ( "123456" ) ), array ("s", "Forum iMasters" ) );
       $BD->setParametros($ParametrosInsert );
print_r ( $BD->Operacoes ( "INSERT INTO utilizadores (`U_Login`, `U_Password`, `U_Nome`) VALUES (?, ?, ?);", $ParametrosInsert ) );
?>

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.