Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Fala galera beleza?
bom eu tenho algumas bibliotecas que me auxiliam para criação de novos sites e agora estou criando um para conexão e modificação de dados para o Mysql.
Bom o código é bem novo e estou adaptando e estou com uma dificuldade de como criar o select pois sabemos que é muito mais muito extenso e o objetivo é poder pegar todos os dados sem essa de "essa função não vou usar" e acabar limitando a classe.
Bom a principio esta assim:
<?php
/**
Classe para banco de dados.
@author Luiz Vinicius Rangel <vinicius@rgidentidadevisual.com.br> | Roberto Gadducci Filho <roberto@rgidentidadevisual.com.br>
@version 0.1
@copyright ®2012 - Todos os direitos reservados a RG Identidade Visual
*/
Class DB{
/**
* Selecionar banco de dados a se conectar
* @acess Privado
* @type Stirng
*/
private $db = 'class';
/**
* Verifica se existe conexão aberta
* @acess Privado
*/
private static $conn = null;
/**
* Dados para conexão do banco de dados
* @acess Privado
* @type String
*/
private $host = 'localhost';
private $db_user = 'root';
private $db_password = '';
private $conecta;
/**
* Tabela em que sera feita a query
* @acess Publico
* @type String
*/
public $tabela = '';
/**
* Recebe os parametros para interagir com as funções
* @acess Publico
* @type Array
*/
public $param = array();
/**
* Recebe os campos que serão selecionados, seleciona tudo por padrão
* @acess Publico
* @type String
*/
public $selectCampos = '*';
/**
* Clausula para condição, aceita WHERE
* @acess Publico
* @type String
*/
public $clausula = "";
/**
*
*/
public $lol = array();
/**
* Inicia conexão toda vez que a função DB é chamada
* @acess Publico
*/
public function __construct(){
if(is_null(self::$conn)){
try{
self::$conn = new PDO("mysql:host={$this->host};dbname={$this->db}", "{$this->db_user}", "{$this->db_password}", array("PDO::ATTR_ERRMODE" => "PDO::ERRMODE_EXCEPTION"));
} catch(PDOException $e){
self::$conn = die($e->getMessage());
}
}
return self::$conn;
}
/**
* Verifica se dentro da função do mysql há algum item
* retorna true se tiver algum caracter na string
* @acess Privado
*/
private function checkFunctionNull($string){
$check = explode("(", $string);
if(empty($check[1])){
return false;
}else{
return true;
}
}
/**
* Verifica se vai ser apenas uma função ou vai retornar algo
* @acess Privado
*/
private function checkFunctionSql($function){
$first_value = explode(")", $function);
$checktype = substr($first_value[0], 0, 1);
if($checktype == '('){
return false;
}else{
return true;
}
}
/**
* Função de proteger a DB contra SQL injection
* @acess Privado
*/
private function bind($dados, $pdo){
$string = explode("-->", $dados);
$array = array();
foreach($string as $s){
$values = explode(",", $s);
$array[$values[0]] = $values[1];
}
foreach($array as $k => $val){
if($this->checkFunctionNull($k)){
$campArray = explode("(", $k);
$campo = substr($campArray[1], 0, -1);
}else{
$campo = $k;
}
if(is_string($val)){
$param = PDO::PARAM_STR;
}else{
$param = PDO::PARAM_INT;
}
$pdo->bindValue($campo, $val, $param);
}
return $pdo;
}
/**
* Função responsável por gerar a sql, retorna array contendo a sql e os campos e valores separados para utilizar na @funcao Bind
* @acess Privada
*/
private function readData(){
$ret = array();
$sql = '';
$query = '';
$subconsulta = '';
$dadosArray = '';
$dadosString = '';
foreach($this->param as $k => $valores){
$equal = '=';
$separetor = ',';
if(is_array($valores)){
if($this->checkFunctionSql($valores[1])){
$campo = $k;
$value = $valores[1];
$dadosArray .= $valores[1].','.$valores[0].'-->';
}else{
$subconsulta .= ', '.$valores[1].', ';
$equal = '';
$campo = '';
$value = '';
$separetor = '';
}
}else{
$campo = $k;
if($this->checkFunctionNull($valores)){
$value = $valores;
}else{
$value = ':'.$k;
$dadosString .= '-->'.$value.','.$valores;
}
}
$query .= "{$campo} {$equal} {$value} {$separetor}";
}
$dadosStr = substr($dadosString, 3);
$dados = $dadosArray.$dadosStr;
$sql .= substr($query, 0, -2);
$sql .= ' '.$this->clausula;
$ret['sql'] = $sql;
$ret['dados'] = $dados;
return $ret;
}
/**
* Insere os dados da @var param no banco de dados @var db na tabela @var tabela
* Aceita variaveis de tipo Array
* @acess Publico
*/
public function insert($retorno = ''){
$sql = "INSERT INTO {$this->tabela} SET ";
$data = $this->readData();
$sql .= $data['sql'];
$pdo = self::$conn->prepare($sql);
$exe = $this->bind($data['dados'], $pdo);
if($exe->execute()){
if($retorno == 'true'){
return $sql;
}else if($retorno != ''){
echo "#ERRO -> Parâmetro inválido";
}
}else{
echo "#ERRO -> não foi possível inserir os dados na tabela {$this->tabela}, verifique os campos e valores informados!";
}
}
/**
* Deleta os dados da @var db na tabela @var tabela
* aceita String, valor pego da @var clausula
* @acess Publico
*/
public function delete($retorno = ''){
try{
$sql = "DELETE FROM {$this->tabela}";
$sql .= " {$this->clausula}";
$pdo = self::$conn->prepare($sql);
if($pdo->execute()){
if($retorno == 'true'){
return $sql;
}else if($retorno != ''){
echo "#ERRO -> Parâmetro inválido";
}
}else{
echo "#ERRO -> Não foi possível deletar os dados da {$this->tabela}";
}
}catch(PDOException $e){
throw new Exception($e->getMessage());
}
}
/**
* atualiza os dados da @var param no banco de dados @var db na tabela @var tabela
* Aceita variaveis de tipo Array
* @acess Publico
*/
public function update($retorno = ''){
try{
$sql = "UPDATE {$this->tabela} SET ";
$data = $this->readData();
$sql .= $data['sql'];
$pdo = self::$conn->prepare($sql);
$exe = $this->bind($data['dados'], $pdo);
if($exe->execute()){
if($retorno == 'true'){
return $sql;
}else if($retorno != ''){
echo "#ERRO -> Parâmetro inválido";
}
}else{
echo "#ERRO -> não foi possível atualizar os dados na tabela {$this->tabela}, verifique os campos e valores informados!";
}
}catch(PDOException $e){
throw new Exception($e->getMessage());
}
}
public function select(){
$sql = 'SELECT ';
$sql .= $this->selectCampos;
$sql .= ' FROM '.$this->tabela.' ';
$sql .= $this->clausula;
foreach($this->param as $param){
if(isset($param[3])){
$x = $param[3];
}else{
$x = '';
}
$sql .= ' '.$param[0].' '.$param[1].' :'.$param[0].' '.$x;
}
echo $sql;
}
/**
* Destroi a classe junto com a conexão
* @acess Publica
*/
public function __destruct(){
self::$conn = null;
}
}
?>
eu ainda vou trocar muitas coisas para economizar code mais o que peço de ajuda se concentra na função SELECT
o modo de uso estava desse modo
$db = new DB();
$db->tabela = 'user';
$db->clausula = 'WHERE';
$db->param = array(
array('id', '=', 23, 'AND'), //campo condiçao e valor.
array('nome', '!=', 'Igor')
);
$db->select();
agora por que eu simplesmente não fiz
$db->clausula = "WHERE id = 23 AND nome != Igor";
bom eu preciso passar um bind ainda para proteger os dados.
Eis a questão.
como proceder? para tratar tudo separado e ainda ter a possibilidade de colocar as função do mysql caso um HEX ou DATE_ADD etc..
vlw
o problema é que eu uso bastante as funções do mysql como citei duas acima e dentre outras e cada um com sua regra especifica para o UPDATE e INSERT eu consegui resolver e suprimir minhas necessidades mais para o SELECT é um pouco mais complicado..
pelo que você me passou ainda estaria muito crua e precisaria de algo a mais pra suprir toda essa necessidade..
Olha aew cara uma classe banco de dados que criei que atendeu todas a minhas necessidades, a grande vantagem dela eh que eh fácil de ser usada e ainda e o que mais o deixa legal eh o catch que cria a variável automaticamente para ser usada;
O que eu recomendo se usar esta classe é usar nomes únicos no banco de dados
Tipo não usar id para tabela cliente e usar id para tabela usuário
Usar tipo clt_id para tabela cliente e usr_id para tabela usuário
Outro detalhe que ela pode ser mudada o banco de dados a hora que quiser so fazer uma nova conexao
E o melhor de tudo que trabalha com pdo =d
<?php
/**
* db.class.php
*
* Classe para manipulação do Banco de dados
* Interface para GD
*
* @author Felipe Augusto Gonçavelves Basilio
* @version 1.0
*
* TODO:
*/
/*
* Classe de conexao com o banco de dados extende o PDO
*/
class DB__connect extends PDO
{
private static $instancia;
/*
* Funcao para conexao usando o PDO
* @return Object instancia objeto
*/
public static function PDOconnection($db_host, $db_user, $db_pass, $db_name) define(DB_HOST, $db_host);
define(DB_USER, $db_user);
define(DB_PASS, $db_pass);
define(DB_NAME, $db_name);
if (!isset(self::$instancia))
{
try
{
self::$instancia = new DB__connect("mysql:host=" . DB_HOST . ";dbname=" . DB_NAME, DB_USER, DB_PASS, array(
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"
));
self::$instancia->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch (PDOException $e)
{
exit('Não foi possível conectar: ' . $e->getMessage());
}
}
return self::$instancia;
}
}
/**
* Class para executar as query do banco de dados
*/
class DB__query
{
public static $conn,$echo_success = true,$show_anyway = false,$ignorecase = false,$num_row;
private static $output = NULL;
/**
* Construtor
* @param $string dados de conexao
* @return void
*/
public function __construct($db_host, $db_user, $db_pass, $db_name) self::$conn = DB__connect::PDOconnection($db_host, $db_user, $db_pass, $db_name);
}
/**
* SELECT
* @param array $table Tabela selecionada
* @param array $field Campos seleciionado
* @param string $addition Complemento da query
* @return array $output com todos os campos do SELECT
*/
public static function __SELECT($table, $field, $addition = NULL) $output = NULL;
if (is_array($field))
{
$field = implode(', ', $field);
}
else
{
if ($addition === NULL)
{
$addition = $field;
$field = "*";
}
}
try
{
$query = self::$conn->prepare("SELECT " . $field . " FROM " . $table . " " . $addition);
$query->execute();
self::$num_row = $query->rowCount();
}
catch (Exception $e)
{
echo "Erro ao tentar Fazer SELECT em $table: " . $e->getMessage();
return;
}
if ($query->rowCount() <= "0")
{
return;
}
else
{
for ($y = 0; $y < $query->columnCount(); $y++)
{
$name = $query->getColumnMeta($y);
$names[$y] = $name[name];
}
for ($k = 0; $fetch = $query->fetch(PDO::FETCH_BOTH); $k++)
{
for ($i = 0; $i < $query->columnCount(); $i++)
{
$output[$k][$names[$i]] = $fetch[$names[$i]];
}
}
}
self::$output = $output;
return $output;
}
/**
* Catch_
* Funcao de auxilio a funcao __SELECT
* @param string $field campo selecionado
* @param int $index usado para loop defaut 0
* @return Variavel GLOBALS sendo o nome do propio campo
*/
public static function catch_($field, $index = "0") foreach ($field as $newField)
{
$GLOBALS["$newField"] = self::$output[$index][$newField];
}
}
else
{
return $GLOBALS["$field"] = self::$output[$index][$field];
}
}
/**
* __INSERT
* Funcao para tratamento de dados quer serao inseridos
* @param string $table tabela selecionado
* @param array $field campos que quer inserir
* @param array $value_field valor para o campo selecionado
* @return function query__execute que ira executar a query
*/
public static function __INSERT($table, $field, $value_field) $field = array_map("self::trim_array", $field);
$value_field = array_map("self::trim_array", $value_field);
if (count($field) == count($value_field))
{
$insert = "INSERT INTO {$table} (" . implode(', ', $field) . ") VALUES ('" . implode('\', \'', $value_field) . "')";
}
else
{
trigger_error("Um Erro foi encontrado em sua query, o numero campos nao correspondem aos numeros de valores para o mesmo!.");
return;
}
}
else
{
$insert = "INSERT INTO {$table} (" . trim($field) . ") VALUES ('" . trim($value_field) . "') ";
}
return self::query__execute($insert, "Seus dados foram inseridos com sucesso!");
}
/**
* __UPDATE
* Funcao para tratamento de dados quer serao atualizados
* @param string $table tabela selecionado
* @param array $field campos que quer atualizar
* @param array $new_value_field novo valor para o campo selecionado
* @param string $addition complemento da query
* @return function query__execute que ira executar a query
*/
public static function __UPDATE($table, $field, $new_value_field, $addition = NULL) $set_values[$i] = trim($field[$i]) . " = '" . trim($new_value_field[$i]) . "' ";
}
if (count($field) == count($new_value_field))
{
$update = "UPDATE {$table} SET " . implode(', ', $set_values) . " " . $addition;
}
else
{
trigger_error("Um Erro foi encontrado em sua query, o numero campos nao correspondem aos numeros de valores para o mesmo!.");
return;
}
}
else
{
$update = "UPDATE {$table} SET " . trim($field) . " = '" . trim($new_value_field) . "' " . $addition;
}
return self::query__execute($update, "Dados foram atualizados com sucesso!");
}
/**
* __UPDATE
* Funcao para tratamento de dados quer serao atualizados
* @param string $table tabela selecionado
* @param string $where condicao para deletar a tabela
* @return function query__execute que ira executar a query
*/
public static function __DELETE($table, $where) $delete = "DELETE FROM {$table} WHERE {$where}";
return self::query__execute($delete, "Seus dados foram deletados com sucesso!");
}
/**
* __UPDATE
* Funcao para tratamento de dados quer serao atualizados
* @param string $query query a ser executada
* @param string $msg mensagem de retorno se ouver sucesso
* @return void
*/
private static function query__execute($query, $msg = "") $query = self::$conn->prepare($query);
if ($query && $query->execute())
{
self::$num_row = $query->rowCount();
if (self::$show_anyway === true)
{
self::$num_row = true;
}
if (self::$num_row)
{
if (self::$echo_success !== false)
{
echo "<div class='ok'>" . $msg . "</div>";
}
else
{
return;
}
}
else
{
return;
}
}
}
catch (Exception $e)
{
echo "<div class='no'> <i>Error Found</i> : " . $e->getMessage() . "</div>";
return;
}
return ;
}
private static function trim_array(&$value) return trim($value);
}
} ?>
Modo de usar
Tabela usada para executar exemplo
CREATE TABLE IF NOT EXISTS `dry_post` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`titulo` text,
`texto` text,
`link_post` text,
`thumb` text,
`data` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=127 ;
Primeiro conectamos no banco que quero executar nossas query
$conn = new DB__query($db_host, $db_user, $db_pass, $db_name);
INSERT
$thumb = "imagem.jpg";
$titulo = "Ola mundo"
$desc = "oie..!";
$url = "http://google.com.br";
$data = "01/01/2013";
$field = array("thumb","titulo","texto","link_post","data"); // << Nome dos campo no banco de dados
$values = array($thumb,$titulo,$desc,$url,$data); // << Variáveis que viram provavelmente de um POST ou GET
$insert = DB__query::__INSERT("dry_post", $field, $values);
**UPDATE**
$thumb = "imagem02.jpg";
$titulo = "tchau"
$desc = "tchau";
$url = "http://google.com.br";
$data = "01/01/2013";
$field = array("thumb","titulo","texto","link_post","data"); // << Nome dos campo no banco de dados
$values = array($thumb,$titulo,$desc,$url,$data); // << Variáveis que viram provavelmente de um POST ou GET
$insert = DB__query::__UPDATE("dry_post", $fields, $values, "WHERE id ='1'");
**SELECT**
//Selecionara todos os dados da tabela dry_post
DB__query::__SELECT("dry_post","*","ORDER BY id ASC LIMIT 5");
//Ira exibir todos os dados contidos na tabela;
for($i="0";$i < DB__query::$num_row; $i++)$conn->catch_(array("thumb","titulo","texto","link_post"),$i)
echo $thumb; //<< criado a partir do catch_
echo $titulo; //<< criado a partir do catch_
echo $texto; //<< criado a partir do catch_
echo $link_post; //<< criado a partir do catch_
}
DELETE
DB__query::__DELETE("dry_post","id = '1'");
OPÇÕES
Para efeito definir esta variáveis antes de executar a função..!
DB__query::$num_row << retorna quantas linhas foram afetadas com a execução da query @default void
DB__query::$echo_success << true = mostra mensagem de sucesso false = nao mostra mensagem de sucesso @default true
DB__query::$show_anyway << mostrar mensagem se $num_row for ou não maior que "0";
Uma sugestão: Eu não faria os comandos SQL na classe DB. Cadê a demanda de responsabilidades? Separe isso, ficará bem melhor. Tenha uma classe para manipular todo seu SQL, até por que essa sua classe tem como responsabilidade obter uma conexão, e no máximo efetuar ações na sua base de dados.
Eu ainda prefiro o seguinte:
Não to dizendo que é a mais certa, mas para MIM fica melhor, pois cada objeto terá responsabilidade única. É uma sugestão minha, cabe a cada um fazer do jeito que ache melhor!
>
Uma sugestão: Eu não faria os comandos SQL na classe DB. Cadê a demanda de responsabilidades? Separe isso, ficará bem melhor. Tenha uma classe para manipular todo seu SQL, até por que essa sua classe tem como responsabilidade obter uma conexão, e no máximo efetuar ações na sua base de dados.
Eu ainda prefiro o seguinte:
Não to dizendo que é a mais certa, mas para MIM fica melhor, pois cada objeto terá responsabilidade única. É uma sugestão minha, cabe a cada um fazer do jeito que ache melhor!
Como seria esta Classe para manipular SQL ??
Simples, cria uma classe, contendo alguns métodos, tais como: insert, update, delete. Você pode passar algumas regras de SQL por parametro do método, por exemplo:
Aí você "encapsula" seu SQL, passando somente o valor pra tal comando do SQL, exemplo prático:
<?
function select(array $param){
return "SELECT {$param['fields']} FROM {$param['table']} ORDER BY {$param['orderBy']}";
}
$db = new DB();
$db->fetchAll(select(array('fields' => "*", "table" => "products", "orderBy" => "title ASC")));
?>
Foi um exemplo bem básico, pra você ver como é a idéia.Tente fazer aí amigo, se não conseguir, eu lhe mostro como fiz a minha.
Mas neste teu exemplo e se eu quiser passar algo alem do orderby por exemplo um LEFT JOIN com um ORDER BY com LIMIT, por isso que eu deixei a var additional para o que se possa fazer qualquer função do banco de dados
no meu caso simplesmente ficaria assim, um exemplo aqui de galeria onde eu pego a imagem que estão relacionadas com o cliente.
$field = "dry_dados_img.img_id,
dry_dados_img.cliente_id,
dry_dados_img.img_name,
dry_dados_img.titulo,
dry_dados_img.destaque,
dry_dados_img.data,
dry_dados_cliente.empresa_cli";
$sql_additional = "LEFT JOIN dry_dados_cliente ON dry_dados_cliente.id = dry_dados_img.cliente_id ORDER BY cliente_id ='0' DESC , cliente_id LIMIT $inicio,$maximo";
DB__query::__SELECT("dry_dados_img",$field,$sql_additional);
No seu exemplo como que eu faria a mesma implementação???
Para que tanto underscode?
Ex: DB__query / __SELECT
E pense que você um dia poderá utilizar Postgres, Oracle, etc. e cada um possui suas variações de SQL. Como você faria? Editaria tudo??
>
Para que tanto underscode?
Ex: DB__query / __SELECT
E pense que você um dia poderá utilizar Postgres, Oracle, etc. e cada um possui suas variações de SQL. Como você faria? Editaria tudo??
Fiz com underscode pq achei mais legal =D, "existem problemas ???"
para usar outro Base de dados SQL teria que criar uma classe bem mais abrangente...!
Ohhh!! mais da um credito foi a primeira classe que eu fiz, onde eu utilizei ela =D
to aprendendo ainda, eu tava meio receoso que os cara iriam falar algo de eu ter usado o $GLOBALS;
Estou aprendendo ainda, mexo com o php a 1 ano e meio e PHPOO a uns 5 meses;
Mas to gostando do pessoal comentando melhoro cada vez mais =D valeu \0/
imagine quando precisar usar WHERE com subselect..
ou em conjunto do HAVING...
deixe-o aberto. Exemplo:
:seta:
function bind_param( $val, $type )
{
switch(type)
{
default:
case 'char':
$val = "'" . $val . "'"; // é formatado com as aspas.. Aproveita aqui e coloque um anti-injection...