LaBoss 0 Denunciar post Postado Agosto 11, 2011 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
William Bruno 1501 Denunciar post Postado Agosto 12, 2011 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
LaBoss 0 Denunciar post Postado Agosto 12, 2011 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
JCMais 75 Denunciar post Postado Agosto 12, 2011 Não se esqueça que temos o Imasters Code, seria interessante você colocar lá também. ;) Compartilhar este post Link para o post Compartilhar em outros sites
LaBoss 0 Denunciar post Postado Agosto 13, 2011 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
LaBoss 0 Denunciar post Postado Agosto 16, 2011 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
Andrey Knupp Vital 136 Denunciar post Postado Agosto 20, 2011 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
LaBoss 0 Denunciar post Postado Agosto 20, 2011 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
Andrey Knupp Vital 136 Denunciar post Postado Agosto 20, 2011 Mas não é necessário o extends. Ali no seu método CarregaParametros, não está transformando nada, pelo menos no que vejo ! Compartilhar este post Link para o post Compartilhar em outros sites
LaBoss 0 Denunciar post Postado Agosto 25, 2011 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