Anda di halaman 1dari 7

Primeramente explicando o que CRUD: Create [criar], Retrieve [recuperar], Update [atualizar] e Delete [excluir].

. Quero deixar registrado que o foco aqui no a performance do sistema, ok?! Afinal de contas, as 'tags' que caracterizam esse artigo bem especfico;) Vamos iniciar, com este, um conjunto de 5 artigos explicando como fazer o famoso CRUD em php orientado objectos, de forma que no precisemos criar este conjunto de aces a quantidade de vezes que houver funes de acesso a base. Ou seja, nossos objectos estaro mais enxutos e no importando a regra de negcio, poderemos obter as informaes necessrias, puxadas no banco de dados, nas camadas acima, utilizando SEMPRE a mesma funo, modificando apenas os parmetros enviados. Basicamente, nas estruturas DAO, j tm os dados do objeto em questo. Como j sabemos para cada objeto temos a estrutura que receber cada dado referente sua tabela no banco. Alm disso temos tambm todas as aes deste objeto no sistema (inserts, updates, deletes, selects). Sabendo que este objeto tem um estrutura semelhando tabela do banco, podemos incrementar um pouco mais essas informaes a fim de que ela se comunique com nossas classes genricas, e execute o que est sendo solicitado. Por questo de organizao e segurana, deixei as classes CRUD dentro do objeto de conexo com o banco. E nos objetos (DAO) ns importamos as classes e alimentamos os parmetros. Vamos l, trazendo o cdigo referente a um funcionrio (funcionarioDAO.php), j no padro de acesso s classes genricas:


class funcionario{ private $nome_tabela var $id_funcionario; = = 'tb_funcionario'; 'fun_nome,fun_data';

private $camposInsert var $fun_nome; var $fun_data;

public function setDados($id_funcionario,$fun_nome,$fun_data){

if (isset($id_funcionario)){ $this->id_funcionario = $id_funcionario ; }else{$this->id_funcionario = null; } $this->fun_nome $this->fun_data = = $fun_nome $fun_data ; ;

public function getId(){ return $this->id_funcionario;}


public function getNome() public function getDataBr() { return $this->fun_nome; } { /*modelo brasil (00/00/0000 00:00)*/ $temp return

= explode(' ',$this->fun_data); $temp_data = explode('-',$temp[0]); $data =


$temp_data[2].'/'.$temp_data[1].'/'.$temp_data[0]; $hora = $temp[1];

$data.' '.$hora ; }
public function getDataEn() { return $this->fun_data; } }

public function getNomeTabela() { return $this->nome_tabela;


public function getNomeCampos() { return $this->camposInsert; }

public function getValorCampos() >fun_nome."','".$this->fun_data."' "; }

{ return "'".$this-

public function Salvar($objeto,$db){ $db->insertObjectToDB($objeto); }


public function Atualizar($objeto,$db){ $db->updateObjectToDB($objeto); } public function Pegar($fields,$values,$db){ return $db->selectDataDb($thispublic function PegarTodos($fields,$values,$db){ return $db-

>getNomeTabela(),$fields,$values);} >selectDatasDb($this->getNomeTabela(),$fields,$values); }
public function Deletar($fields,$values,$db){ $db->DeleteDataDb($this>getNomeTabela(), $fields,$values); }


Observe que adicionamos mais duas variveis privadas, no objeto, uma que traz o nome da tabela no banco, e a outra trazendo os fields (campos), em sequncia como utilizamos nos inserts em sql. Tambm inserimos duas funes para trazer os valores dessas duas variveis.

Adicionamos tambm uma funo ( getVAlorCampos() ) que retorna uma string com alguns dados na mesma seqncia da varivel privada referente aos campos da tabela ($camposInsert), para inserir os dados. A outras variveis e funes so comuns aos DAOs. Na funo salvar ns enviamos o objeto em questo, j alimentado, e a varivel de referencia ao banco, que traz as classes genricas. Observe que necessrio um padro de nomenclaturas entre o objeto (nome dele mesmo) e o nome da tabela e seus campos. Para tornar o fluxo de informao vivel numa classe genrica temos que usar estes padres: Nome dos objetos: funcionarioDAO,clienteDAO,produtoDAO. Nome da classe:funcionario,cliente,produto (respectivamente) Nome das tabelas: tb_funcionario,tb_cliente,tb_produto (respectivamente). Nome das pginas: funcionario.php,cliente.php,produtos.php (respectivamente). Adotando este padro ser possvel acessar qualquer tabela baseada no objeto enviado, pois o nome ser lido a partir do objeto inserido na classe, e o fluxo automtico de pginas no sistema. Vejamos como a classe de insero construda, esta classe estar dentro do objeto banco.php (que traz consigo tambm a abertura de fechamento do banco Mysql):


} } //class class Banco{ private $local; private $user; private $senha; private $msg0; private $msg1; private $nome_db; private $db; public function __construct(){ $this->local $this->user $this->senha $this->msg0 $this->msg1 dados!'; $this->nome_db } public function abrir(){ $this->db = mysql_connect($this->local,$this->user,$this>senha) or die($this->msg0); mysql_select_db($this->nome_db,$this->db) or die($this->msg1); } public function fechar(){ //analisar se o mysql_close precisa ser colocado numa varivel $closed = mysql_close($this->db); $closed = NULL; } public function insertObjectToDB($objeto){ $db = new Banco(); $db->abrir(); $sql = "INSERT INTO ".$objeto->getNomeTabela()."(".$objeto>getNomeCampos().") VALUES ( ".$objeto->getValorCampos().")"; $query = mysql_query($sql) or die ($sql.' '.mysql_error()); $db->fechar(); unset($objeto); $temp_id = explode('_',$objeto->getNomeTabela()); header('location: '.$temp_id[1].'.php?msg=Inserido'); = 'db_sistemaqualquer'; = = = = = 'localhost'; 'root'; ''; 'Conexo falou, erro: '.mysql_error(); 'No foi possvel selecionar o banco de

Simples assim, a classe recebe via parmetro o objeto que quer inserir no banco. A string SQL montada automaticamente de acordo com os dados que j existem no objeto (neste caso sem wheres, mas nos prximos artigos mostraremos como montar as strings SQL com 1 ou mais wheres). E com os prprios dados que vem do objeto, obedecendo os padres de nomenclaturas adotados previamento j direciona para prxima pgina aps a insero. Agora o mais simples, o formulrio de insero:

<html> <head> <title>Cadastro de Funcion&aacute;rio</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> </head> <body> <?php if (!$_POST){ $msg

= @$_REQUEST['msg'];

if (isset($msg)){ echo '<font color="red"> '.$msg.'</font><br><br>';

}
$link = explode('/',$_SERVER ['REQUEST_URI']); $qtd = count($link); echo '<br>'; ?> <form action="<?php echo $link[$qtd-1]; ?>" method="post">

<table width="50%" border="0" cellspacing="0" cellpadding="0">


<tr> <td width="17%">Nome</td> <td width="49%"><input name="txtNome" type="text" id="txtNome" </tr> <tr> <td> </td> <td> </td> </tr> <tr> <td> </td> <td><input type="submit" name="Submit" value="Enviar"></td> </tr> <tr> <td> </td> <td> </td> </tr>

size="50"></td>

</table>
</form>

<?php }else{ require('uses/banco.php'); $db = new Banco(); require('uses/funcionarioDAO.php'); $fun_nome = = $_POST['txtNome']; date('Y-m-d H:i:s');

$fun_data

$func = new funcionario(); $func->setDados(null,$fun_nome,$fun_data); $func->salvar($func,$db); } ?> </body> </html>

Portanto, instanciamos o $func, onde alimentamos o objeto com os dados fornecidos pelo formulrio, e depois salvamos enviando ele mesmo ($func) e a instncia do objeto do banco ($db), via parmetro. S para clarear, utilizamos o $_SERVER ['REQUEST_URI'] para dar o refresh automtico, para no precisar se preocupar com mais este campo do formulrio, deixando mais dinmico. Bom, isso a, espero ter contribudo com uma programao mais prtica e sem frameworks pesados e muitas vezes desnecessrios.