Escolar Documentos
Profissional Documentos
Cultura Documentos
6 02 2007
Olá pessoas : )
Bom, ontem me peguei pensando em algo para escrever aqui no blog, e me ocorreu que
nunca encontrei muitos textos por ai falando sobre a utilização de DAO com PHP, e que
por ser algo que venho usando há algum tempo agora, e que me ajuda bastante, decidi
escrever um texto que procura explicar como um DAO funciona, e como pode ser
utilizado.
Indice
0. Introdução
1. Como funciona?
2. A classe VO (Value Object)
3. A classe DAO (Data Access Object)
4. Utilização
5. Considerações Finais
6. Bibliografia
0. Introdução
Por muitas vezes, o desenvolvedor de sistemas, se depara com um grande
problema quando necessita atualizar a base de dados da sua aplicação, ou
modificar uma query em algum lugar. Quando o sistema fica grande demais, as
queries se perdem em meio ao código, e tudo se torna uma grande bagunça. Há
casos, em que o desenvolvedor precisa migrar o software de um SGDB para outro,
e ai da-lhe correria para encontrar todas as queries e corrigi-las para
funcionar com o novo SGDB.
Para resolver esse tipo de problema, foi criado um padrão, para centralizar as
queries, e permitir que alterando apenas a classe referente a tabela no banco,
possamos ter a aplicação rodando sem problemas.
1. Como funciona?
A idéia por trás do DAO, é bastante simples: transformar as tabelas de nosso
banco de dados em classes VO, e as ações que podemos realizar em classes DAO.
As explicações e exemplos dados nesse texto, irão se basear todos na seguinte
estrutura de base de dados, utilizando MySQL como SGDB de escolha.
nome varchar(30),
sobrenome varchar(30),
endereco varchar(50),
telefone varchar(20)
id_cliente int,
numero_conta varchar(12),
numero_agencia varchar(8),
tipo_conta varchar(20),
) engine=INNODB;
A partir daqui, iremos criar as classes VO e DAO de cada uma dessas tabelas, e
então demonstrar uma maneira simples de utilização, que pode ser aprimorada,
em combinação com outros patterns, ou até mesmo com a utilização da
imaginação. Ficará então, ao critério do leitor.
<?php
class ClienteVO {
/**
* @var integer
*/
/**
* @var string
*/
/**
*
* @var string
*/
/**
* @var string
*/
/**
* @var string
*/
/**
* @return integer
*/
return $this->id_cliente;
/**
* @return void
*/
$this->id_cliente = $id_cliente;
/**
* @return string
*/
return $this->nome;
/**
* @return void
*/
$this->nome = $nome;
/**
* @return string
*/
return $this->sobrenome;
}
/**
* @return void
*/
$this->sobrenome = $sobrenome;
/**
* @return string
*/
return $this->endereco;
/**
* @return void
*/
$this->endereco = $endereco;
/**
* @return string
*/
return $this->telefone;
/**
* @return void
*/
$this->telefone = $telefone;
?>
Deve ser criada uma classe do mesmo tipo para a tabela ‘conta’. Não colocarei
o código aqui, para evitar de prolongar o texto demais com código.
Aconselho ao leitor, criar a classe da tabela ‘conta’ manualmente, para pegar a prática
do funcionamento da classe, e memorizar o seu layout.
Agora que as classes estão criadas, vamos partir para a criação das classes
DAO, pois sem elas, as classes VO nos são inúteis.
<?php
class ClienteDAO {
/**
*/
$values = array(
addslashes( $objVo->getNome( ) ),
addslashes( $objVo->getSobrenome( ) ),
addslashes( $objVo->getEndereco( ) ),
addslashes( $objVo->getTelefone( ) )
);
addslashes( $objVo->getNome( ) ),
addslashes( $objVo->getSobrenome( ) ),
addslashes( $objVo->getEndereco( ) ),
addslashes( $objVo->getTelefone( ) )
);
mysql_query( $sql );
$objVo->setId_cliente( mysql_insert_id( ) );
return $objVo;
/**
*/
$return = array( );
return $return;
/**
*/
$id
);
return $return;
{
if ( !$objVo->getId_cliente( ) )
endereco="%s", telefone="%s"
addslashes( $objVo->getNome( ) ),
addslashes( $objVo->getSobrenome( ) ),
addslashes( $objVo->getEndereco( ) ),
addslashes( $objVo->getTelefone( ) )
);
mysql_query( $sql );
if ( $objVo->getId_cliente( ) == null )
$objVo->getId_cliente( )
);
mysql_query( $sql );
{
if ( $objVo->getId_cliente( ) !== null ) {
$this->update( $objVo );
} else {
$this->insert( $objVo );
?>
Nessa classe DAO, voce pode criar por exemplo um método de busca que receba um
objeto VO como parametro, ou um método que receba um nome de campo e um valor,
ou que receba um valor para limit na query, então use a imaginação quando for
criar os métodos que lhe forem ser úteis.
Podemos ver que, as queries estão todas nesse arquivo, então quando existir a
necessidade de utilizar um novo SGDB por exemplo, basta escrever as classes
DAO para esse novo SGDB, e o sistema deverá funcionar normalmente.
A seguir, veremos como utilizar as classes DAO/VO, em um exemplo bastante
simples.
4. Utilização
Tendo os DAOs e VOs criados, podemos utiliza-los de maneiras diversas. No
exemplo que montei acima, utilizei as funções de mysql diretamente no DAO, sem
estabelecer nenhuma conexão, pois assumi que a conexao será inicializada no
começo da execução do script. Caso o leitor deseje, pode criar uma forma de
inicializar a conexão, ao instanciar a classe DAO por exemplo.
Irei criar agora então, um simples formulário para cadastro de clientes, que
faz um submit para a própria página, e utiliza método POST.
<?phpif( isset($_POST['enviar']) ) {
mysql_connect('localhost','root','');
mysql_select_db('daoTutorial');
// Incluir classe VO
include_once('clientevo.class.php');
include_once('clientedao.class.php');
$cliente->setNome( $_POST['nome'] );
$cliente->setSobrenome( $_POST['sobrenome'] );
$cliente->setTelefone( $_POST['telefone'] );
$cliente->setEndereco( $_POST['endereco'] );
?>
<html>
<head>
</head>
<body>
<form method='POST'>
</form>
</body>
</html>
mysql_connect('localhost','root','');
mysql_select_db('daoTutorial');
// Incluir classe VO
include_once('clientevo.class.php');
include_once('clientedao.class.php');
$clientes = $clienteDAO->getAll( );
echo '<hr><br>';
?>
5. Considerações finais
Os exemplos apresentados, não dão muita importancia a segurança, embora
apresentem algumas boas práticas de programação, como procurar comentar o
código. Percebam que uma medida de segurança é tomada, ao usar o comando
addslashes nas queries SQL, para evitar injection, mas isso apenas pode não
ser o bastante. Uma filtragem dos dados mais bem feita com certeza se faz
necessária. Veja também que no método de update, não é feita nenhuma
verificação, para saber se o registro realmente existe na base de dados, antes
de tentar atualizar, o que pode causar problemas.
A pattern DAO pode ser combinada com outras patterns, para desenvolvimento de
sistemas de todos os portes, e é bastante interessante pois concentra toda a
relação com o banco de dados em um só lugar, e permite que o filtro das
informações que são enviadas, possa ser feito nesse mesmo lugar, facilitando a
tomada de medidas de segurança no desenvolvimento.
6. Bibliografia
Não consigo me lembrar exatamente que textos li para me aprofundar nesse
assunto, nem quais sites visitei, já que há algum tempo que utilizo isso. Devo
agradecer ao Carlos (que provavelmente nem vai ler esse texto), pois ele me
apresentou o conceito de DAO. Talvez possa encontrar algo no google, que possa
ter informações interessantes. Encontrei um texto no site da IBM,que parece
interessante:
http://www-128.ibm.com/developerworks/java/library/j-dao/
http://en.wikipedia.org/wiki/Data_Access_Object