0

Criando Cláusulas SQL Dinamicamente

criado por Alfred R. Baudisch em 24/08/2005 12:02am
Código de exemplo de uso da classe:

<?php
// Inclui o arquivo da classe
require "clausulas_sql.class.php";

// Define a classe
$sql = new clausulas_sql;

// Campos e dados para a cláusula INSERT exemplo
$campos = array("nome", "cidade", "telefone");
$dados = array("Antonio Carlos", "São Paulo", "(11) 9999-9999");

// Gera a cláusula SQL INSERT
$insert = $sql->gera_insert("tabela_agenda", $campos, $dados);

// Campos e dados para a clausula UPDATE
$campos = array("cliente", "produto", "valor", "quantidade");
$dados = array("Alfred", 2, 540);

// Gera a cláusula SQL UPDATE
$update = $sql->gera_update("tabela_carrinho", $campos, $dados, "WHERE loja = 36");

// Usa as cláusulas na função de banco de dados desejada...
?>

Vamos então às explicações de uso:
As funções gera_insert e gera_update possuem 3 argumentos comuns:
- $tabela: string com o nome da tabela do banco de dados onde os dados serão inseridos / atualizados;
- $campos: array com os nomes dos campos da tabela a serem usados
- $valores: array com os valores a serem inseridos / atualizados para cada campo fornecido em $campos. Deve ser colocado na mesma ordem que o array $campos, ou seja, por exemplo, se $campos[3] for "cliente", então $valores[3] deve conter o nome do cliente.

A gera UPDATE possui um argumento extra, chamado $sentenca.
Se fosse simplesmente usa UPDATE tabela SET campo = valor;, todos os campos dessa tabela serão atualizados. Então, em $sentença, você deve especificar o WHERE de que itens da tabela serão atualizadas.

No exemplo acima, os valores gerados, são:
- $insert:
INSERT INTO tabela_agenda (nome, cidade, telefone) VALUES ('Antonio Carlos', 'São Paulo', '(11) 9999-9999');

- $update:
UPDATE tabela_carrinho SET cliente = 'Alfred', produto = 2, valor = 540, quantidade = NULL WHERE loja = 36;

Veja que quando você coloca um inteiro nos valores, ele não coloca as aspas. E quando você fornece um campo, mas não coloca nenhum valor para esse item, é colocado NULL na cláusula SQL.

Na próxima página, explicarei melhores usos para essa classe.

Comentários:

Mostrando 1 - 10 de 14 comentários
Josue Samuel disse:

...é isso aí, meu caro!!!

gostei da idéia. Eu ainda não havia me despertado para isso.

realmente não sei se vou usar devido a outra opções interessantes relatadas nos comentários.

... mas espere um pouco, não ache isso ruim e nem que estou menospresando seu trabalho. Através dele eu aprendi algo contigo e, através dos comentários, aprendi mais outras coisas.

por fim, não sei como vc lidou com essas críticas da galera toda, porém é sempre bom ter em mente que essas 'rejeições' foram para o trabalho e não para vc. ENCARE isso como um processo de engrandecimento: a gente se expõe mostrando o que sabemos e a comunidade colabora.

viva longa à comunidade com seus eternos colaboradores!!!
06/01/2006 5:19am (~19 anos atrás)

Facilita o trabalho de qualquer programador. É a prova concreta de que Programar Orientado a objetos é essencial nos dias atuais.
22/09/2005 12:30am (~19 anos atrás)

bem bacana o artigo
14/09/2005 2:29pm (~19 anos atrás)

Diego Hellas disse:
Olha, acho que so esta ficando mais facil de haver bugs nesse script, por que caso vc tenha que modificar alguma coisa vai ter que passar revisando o seu código, e acho que está mais vulnerável a bugs.
05/09/2005 3:38pm (~19 anos atrás)

Rui disse:
Procure utilizar AR active record.
02/09/2005 10:36am (~19 anos atrás)

Rui disse:
Em tempo: use SQL normal mesmo separado em uma segunda classe. DAO. Só tome cuidado com o anemic domaim (ambos patterns Martin Fowler).
02/09/2005 8:12am (~19 anos atrás)

Rui disse:
Não vejo como isso pode ser mais prático.
Você está apenas "quebrando" o SQL e com isso inserindo possíveis bugs.

Muito mais prático seria, se todos programassem OO, criar um framework para persistência de objetos.

Utilize reflexão para obter os atributos do objeto e na sequência crie comandos sql *realmente* dinâmicos. Algo que o ezpdo faz de forma bem porquinha (performance baixa).

Desculpa se fui rude. Criei um user, verifiquei o meu e-mail, escrevi... enfim, *tentei* colaborar. Só falei isso com o intuito de mudar um pouco a visão de que *tudo* escrito com php tem "bad smell".

Nota: 10 pela dediação, 0 para o código/idéia.
02/09/2005 8:09am (~19 anos atrás)

GILSON SOARES disse:
estou ainda só começando mas estou gostando da franquesa dessa comunidade....valeu mesmo
01/09/2005 5:44pm (~19 anos atrás)

mto bom seu artigo.. ajuda mto.. queria apenas coloca um comentario, é q ta faltando um ; depois de

mysql_query($query);
31/08/2005 10:08pm (~19 anos atrás)

Adler Medrado disse:
Eu achei interessante seu artigo.
Outra maneira de fazer isso, que é a maneira que eu uso, é que para cada tabela do banco eu tenho uma classe que a representa. esta classe é filha de uma classe que implementa os metodos montarInclusao() e montarAlteracao().
Estes métodos montam o comando SQL de acordo com os atributos que tiveram algum valor atribuido pelos métodos set referentes a cada um deles. Por exemplo, na classe eu tenho um atributo nome, entao eu tenho um método setNome() e getNome().
o Set eu seto o valor e o get eu obtenho o valor de determinado atributo. Com isso eu verifico quais atributos tem valor e monto o comando.

É isso.
um abraço a todos.
31/08/2005 3:50pm (~19 anos atrás)

Novo Comentário:

(Você pode usar tags como <b>, <i> ou <code>. URLs serão convertidas para links automaticamente.)