SQL somente dentro das CLASSES
Pouco tempo atrás começamos a adotar um novo padrão, onde basicamente falando, qualquer SQL que for executado em um site ou sistema deve ficar dentro da classe. Para cada tabela existe uma classe, por exemplo para a tabela “usuario”, o nome da classe passa a ser “Usuario”.
Ok, mas qual a vantagem em fazer isso?
- Como todo SQL fica confinado dentro da classe, caso queira fazer migração de banco de dados, basta alterar dentro das classes, não precisando sair catando SQL pelos arquivos PHP.
- Padronização dos SQL’s e métodos que retornam ou inserem no banco. Lembrando que essa padronização acaba obrigando o programador a fazer de uma única forma.
- Pode ser criado um gerador de códigos para esse padrão, pois como é feito de forma única, não precisa-se mais criar classes, dessa forma o programador, foca boa parte de seu tempo na regra de negócio (Obs.: Esse gerador de códigos está quase pronto, e está sendo feito por Eliton José da Silva, que por sinal está ficando muito bom)
- Pode-se trabalhar com dois programadores em um mesmo módulo do software, onde um pode mexer com a regra de negócio dentro da classe (Esqueci de mencionar que toda regra de negócio deve ficar dentro da classe) e outro no script que chama os métodos da classe só exibindo na tela dados já trabalhados na classe ou executar métodos para inserir dados.
Bom, esses são alguns dos inúmeros benefícios que obterá em usar esse padrão.
Vou colocar alguns exemplos:
No script que instância métodos da classe faremos da seguinte forma para inserir um registro:
session_start();
/* Importando Classes que serão usadas no sistema */
include “../_classe/classeUsuario.php”;
include “../_include/config.php”;
/* Instanciando o Objeto Usuário */
$objetoUsuario = new Usuario();
if($_POST['enviar']) {
$objetoUsuario->setUsuarioLogin($_POST['usuarioLogin']);
$objetoUsuario->setUsuarioNome($_POST['usuarioNome']);
$objetoUsuario->setUsuarioFuncao($_POST['usuarioFuncao']);
$objetoUsuario->setUsuarioEmail($_POST['usuarioEmail']);
$objetoUsuario->setUsuarioSenha($_POST['usuarioSenha']);
$objetoUsuario->setUsuarioTelefone($_POST['usuarioTelefone']);
$objetoUsuario->setUsuarioCelular($_POST['usuarioCelular']);
if($_POST['acao'] == ‘a’) {
$objetoUsuario->setUsuarioCodigo($_POST['usuarioCodigo']);
$objetoUsuario->alteraUsuario();
}
else {
$objetoUsuario->carregaUsuario();
if(count($objetoUsuario->getVetorUsuario()) == 0) {
$objetoUsuario->insereUsuario();
}
else {
?>
Usuário já existe
}
}
unset($_POST['acao']);
?>
Cadastrou com sucesso!
}
Lembrando que esses dados são submetidos por um formulário com o “method=’post’”
Agora vamos para a classe que possui os dois métodos utilizados no script acima:
/***********************************
Autor: Andrey Pedro Lefkum
andrey@andrey.eti.br
www.andrey.eti.br
Classe: Usuário
Classe para ações do usuário no
sistema.
***********************************/
class Usuario {
/* Metodo Construtor */
function Usuario() {
}
/* Fim Metodo construtor */
/* variáveis da classe */
var $usuarioCodigo;
var $usuarioNome;
var $usuarioEmail;
var $usuarioTelefone;
var $usuarioCelular;
var $usuarioLogin;
var $usuarioSenha;
var $resultado;
var $vetorUsuario;
var $ordem;
/* Fim variáveis da classe */
/* Metodos Get’s and Set’s */
function getusuarioCodigo() {
return $this->usuarioCodigo;
}
function setusuarioCodigo($usuarioCodigo) {
$this->usuarioCodigo = $usuarioCodigo;
}
function getUsuarioNome() {
return $this->usuarioNome;
}
function setUsuarioNome($usuarioNome) {
$this->usuarioNome = addslashes($usuarioNome);
}
function getUsuarioEmail() {
return $this->usuarioEmail;
}
function setUsuarioEmail($usuarioEmail) {
$this->usuarioEmail = addslashes($usuarioEmail);
}
function getUsuarioTelefone() {
return $this->usuarioTelefone;
}
function setUsuarioTelefone($usuarioTelefone) {
$this->usuarioTelefone = addslashes($usuarioTelefone);
}
function getUsuarioCelular() {
return $this->usuarioCelular;
}
function setUsuarioCelular($usuarioCelular) {
$this->usuarioCelular = addslashes($usuarioCelular);
}
function getUsuarioLogin() {
return $this->usuarioLogin;
}
function setUsuarioLogin($usuarioLogin) {
$this->usuarioLogin = addslashes($usuarioLogin);
}
function getUsuarioSenha() {
return $this->usuarioSenha;
}
function setUsuarioSenha($usuarioSenha) {
$this->usuarioSenha = md5($usuarioSenha);
}
function getOrdem() {
return $this->ordem;
}
function setOrdem($ordem) {
$this->ordem = $ordem;
}
function getBuscar() {
return $this->buscar;
}
function setBuscar($buscar) {
$this->buscar = $buscar;
}
function getResultado() {
return $this->resultado;
}
function setResultado($resultado) {
$this->resultado = $resultado;
}
function getVetorUsuario() {
return $this->vetorUsuario;
}
function setVetorUsuario($vetorUsuario) {
$this->vetorUsuario = $vetorUsuario;
}
function getUsuarioFuncao() {
return $this->usuarioFuncao;
}
function setUsuarioFuncao($usuarioFuncao) {
$this->usuarioFuncao = $usuarioFuncao;
}
function getSql() {
return $this->sql;
}
function setSql($sql) {
$this->sql = $sql;
}
/* Fim Metodo Get’s and set’s */
/* Metodos de acoes da classe */
function insereUsuario() {
$sql = “INSERT INTO usuario
(usuarioLogin
,usuarioNome
,usuarioSenha
,usuarioTelefone
,usuarioCelular
,usuarioEmail
,usuarioFuncao
)
VALUES
(
‘”.$this->getUsuarioLogin().”‘
,’”.$this->getUsuarioNome().”‘
,’”.$this->getUsuarioSenha().”‘
,’”.$this->getUsuarioTelefone().”‘
,’”.$this->getUsuarioCelular().”‘
,’”.$this->getUsuarioEmail().”‘
,’”.$this->getUsuarioFuncao().”‘
)
“;
$resultado = mysql_query($sql) or die(”alert(’”.mysql_error().”‘);”);
if($resultado) {
$objetoLog = new Log();
$objetoLog->setLogTabela(’usuario’);
$objetoLog->setLogSql($sql);
$objetoLog->setLogDataHora(date(”Y-m-d H:i:s”));
$objetoLog->insereLog();
}
$this->setResultado($resultado);
}
function carregaSql() {
$sql = “SELECT usuarioCodigo
,usuarioLogin
,usuarioNome
,usuarioSenha
,usuarioEmail
,usuarioTelefone
,usuarioCelular
,usuarioFuncao
FROM usuario
WHERE 1 “;
if($this->getUsuarioNome()) {
$sql .= ” AND usuarioNome LIKE ‘%”.$this->getUsuarioNome().”%’ “;
}
if($this->getusuarioCodigo()) {
$sql .= ” AND usuarioCodigo = ‘”.$this->getusuarioCodigo().”‘ “;
}
if($this->getOrdem()) {
$sql .= “ORDER BY “.$this->getOrdem();
}
else {
$sql .= “ORDER BY usuarioNome “;
}
$this->setSql($sql);
}
function carregaUsuario() {
$this->carregaSql();
$sql = $this->getSql();
$resultado = mysql_query($sql) or die(”alert(’”.mysql_error().”‘);”);
while($linha = mysql_fetch_object($resultado)) {
$vetorUsuario['usuarioCodigo'] [$linha->usuarioCodigo] = $linha->usuarioCodigo;
$vetorUsuario['usuarioLogin'] [$linha->usuarioCodigo] = $linha->usuarioLogin;
$vetorUsuario['usuarioNome'] [$linha->usuarioCodigo] = $linha->usuarioNome;
$vetorUsuario['usuarioSenha'] [$linha->usuarioCodigo] = $linha->usuarioSenha;
$vetorUsuario['usuarioTelefone'][$linha->usuarioCodigo] = $linha->usuarioTelefone;
$vetorUsuario['usuarioCelular'] [$linha->usuarioCodigo] = $linha->usuarioCelular;
$vetorUsuario['usuarioEmail'] [$linha->usuarioCodigo] = $linha->usuarioEmail;
$vetorUsuario['usuarioFuncao'] [$linha->usuarioCodigo] = $linha->usuarioFuncao;
}
$this->setVetorUsuario($vetorUsuario);
}
function alteraUsuario() {
$sql = “UPDATE usuario
SET usuarioLogin = ‘”.$this->getUsuarioLogin().”‘
,usuarioNome = ‘”.$this->getUsuarioNome().”‘
,usuarioTelefone = ‘”.$this->getUsuarioTelefone().”‘
,usuarioCelular = ‘”.$this->getUsuarioCelular().”‘
,usuarioEmail = ‘”.$this->getUsuarioEmail().”‘
,usuarioFuncao = ‘”.$this->getUsuarioFuncao().”‘
WHERE usuarioCodigo = “.$this->getusuarioCodigo();
if($this->getUsuarioSenha() != md5(”")) {
$this->alteraSenha();
}
$resultado = mysql_query($sql) or die(mysql_error());
if($resultado) {
$objetoLog = new Log();
$objetoLog->setLogTabela(’usuario’);
$objetoLog->setLogSql($sql);
$objetoLog->setLogDataHora(date(”Y-m-d H:i:s”));
$objetoLog->insereLog();
}
}
function alteraSenha() {
$sql = “UPDATE usuario
SET usuarioSenha = ‘”.$this->getUsuarioSenha().”‘
WHERE usuarioCodigo = ‘”.$this->getusuarioCodigo().”‘ “;
$resultado = mysql_query($sql) or die(mysql_error());
if($resultado) {
$objetoLog = new Log();
$objetoLog->setLogTabela(’usuario’);
$objetoLog->setLogSql($sql);
$objetoLog->setLogDataHora(date(”Y-m-d H:i:s”));
$objetoLog->insereLog();
}
}
/* Fim metodo de acoes */
}
/* Fim classe */
?>
Autor: Andrey Pedro Lefkum
Obs.: Nesse exemplo não cheguei ao nível de explicar o que a Orientação Objetos.
December 18th, 2006 at 3:11 pm
Opa Andrey,
Massa cara, eu passei a adotar uma coisa assim também, principalmente aquele registro de log. Na verdade eu criei uma classe padrão para conexão com banco e dai em todas as classes que acessam banco eu dou um extends. O bom disso é que dá pra reaproveitar né, e também é possível rastrear todos os SQLs já que qualquer requisição que é feita passa pelo método executeSql() que nada mais é que uma função que retorna mysql_query() e gera log se tiver habilitada a opção. Pra manutenção isso é muito bom
Show de bola cara!
December 19th, 2006 at 9:27 am
Bacana Anderson, a questão de desenvolver com Orientação Objetos acaba automaticamente reduzindo códigos, e reaproveitando com o famoso ctrl C + ctrl V. Isso teóricamente não é correto, mas como acaba se utilizando de forma padronizada, algumas partes sempre se repetem nas classes.
E essa questão dos LOG’s, é ótima! Como toda alteração que é feita no banco é registrada, você tem como saber quem foi que fez certa “CAGADA”, ou até mesmo saber se a alteração foi feita diretamente no Banco de Dados para uma possível troca de senha.
É isso ae, valeu pelo Comentário ae Anderson!
Att.,
Andrey