Desenvolvimento - PHP

Trabalhando com Data Access Object (DAO) em PHP

Nesse artigo vou mostrar como um Data Access Object (DAO)funciona em PHP usando o banco de dados MySQL.

por Gregory Monteiro



Vamos primeiramente criar um banco de dados chamado “teste”. Ver listagem 1

Listagem 1. Código para criar um banco de dados no MySQL query

create database teste

Em seguida vamos criar uma tabela que será usada no nosso mapeamento. O nome da nossa tabela será “usuarios”. Essa tabela terá um id e os campos nome, login e senha. Ver Listagem 2.

Listagem 2. Código para criar a tabela usuarios no MySQL query

CREATE TABLE teste.usuarios (
id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
nome VARCHAR(45) NOT NULL,
login VARCHAR(45) NOT NULL,
senha VARCHAR(45) NOT NULL
)

Agora vamos criar a estrutura da classe DAO. Para isso vamos criar um arquivo chamado usuariosDAO.php e criar a nossa classe usuariosDAO. Ver listagem 3.

Listagem 3. Estrutura da classe usuarios

<?php
include_once("usuariosVO.php");
class usuariosDAO extends database{
}
?>

Perceba que a classe usuariosDAO herda da classe abstrata database para efetuar o nosso CRUD e nessa classe também fazemos a inclusão da classe que irá mapear os dados usuariosVO.

Vamos então adicionar os métodos padrões da classe DAO que são o __construct, __clone e __destruct. Ver listagem 4.

Os métodos __construct e __destruct.são padrões do php e são responsáveis por construir e destruir a instancia da nossa classe.

O método __clone evita que nossa classe seja clonada.

Listagem 4. Classe usuarios com os métodos __construct, __clone e __destruct.

<?php
include_once("usuariosVO.php");
class usuariosDAO extends database{
	public function __construct(){}
	private function __clone(){}
	
	public function __destruct() {
		foreach ($this as $key => $value) {
			unset($this->$key); 
		}
		foreach(array_keys(get_defined_vars()) as $var) {
			unset(${"$var"});
		}
		unset($var);
	}
}
?>

Na listagem 4 o método __destruct remove da memória todas as variáveis que foram setadas pela nossa classe.

Por último vamos criar os métodos para consulta, inserção, update e delete. Ver listagem 5.

Listagem 5. Métodos load, insert, update e delete.

<?php
include_once("usuariosVO.php");
class usuariosDAO extends database{
	public function __construct(){}
	private function __clone(){}
	
	public function __destruct() {
		foreach ($this as $key => $value) {
			unset($this->$key); 
		}
		foreach(array_keys(get_defined_vars()) as $var) {
			unset(${"$var"});
		}
		unset($var);
	}
	
	public function load($fields="*",$add=""){
		if(strlen($add)>0) $add = " ".$add;
		$sql = "SELECT $fields FROM usuarios$add";
		return $this->selectDB($sql,null,'usuariosVO');
	}
	
	public function insert($fields,$params=null){
		$numparams="";
		for($i=0; $i<count($params); $i++) $numparams.=",?";
		$numparams = substr($numparams,1);
		$sql = "INSERT INTO usuarios ($fields) VALUES ($numparams)";
		$t=$this->insertDB($sql,$params);
		return $t;
    }
	
	public function update($fields,$params=null,$where=null){
		$fields_T="";
		for($i=0; $i<count($fields); $i++) $fields_T.=", $fields[$i] = ?";
		$fields_T = substr($fields_T,2);
		$sql = "UPDATE usuarios SET $fields_T";
		if(isset($where)) $sql .= " WHERE $where";
		$t=$this->updateDB($sql,$params);
		return $t;
    }
	
	public function delete($where=null,$params=null){
		$sql = "DELETE FROM usuarios";
		if(isset($where)) $sql .= " WHERE $where";
		$t=$this->deleteDB($sql,$params);
		return $t;
    }
}
?>

Para explicar os métodos load, insert, update e delete vamos fazer um exemplo de cada um. Vamos criar o arquivo “index.php” e testar os métodos da classe usuariosDAO.

Como esse artigo é somente um exemplo não vou usar orientação a objeto para testar os métodos da classe database. Vamos primeiramente inserir valores na nossa tabela de usuarios. Ver listagem 6.

Listagem 6. Testando a inserção de valores no banco de dados.

<?php
require_once("conexao.php");
include_once("usuariosDAO.php");
$usuariosDAO = new usuariosDAO();

$fields = "nome,login,senha";
$params = array("Ingrid","login1","senha1");
$rs = $usuariosDAO->insert($fields,$params);
var_dump($rs);

$fields = "nome,login,senha";
$params = array("Marilia","login2","senha2");
$rs = $usuariosDAO->insert($fields,$params);
var_dump($rs);

$fields = "nome,login,senha";
$params = array("Carlos","login3","senha3");
$rs = $usuariosDAO->insert($fields,$params);
var_dump($rs);

$fields = "nome,login,senha";
$params = array("Georgia","login4","senha4");
$rs = $usuariosDAO->insert($fields,$params);
var_dump($rs);
?>

Como vemos na listagem 6 o método insert recebe uma string com os campos a serem inseridos e um array com os valores que serão inseridos e retorna o id de cada inserção

Veja nas figuras 1 e 2 o resultado.

Resultado para cada insert feito

Figura 1. Resultado para cada insert feito.

Resultado no banco de dados

Figura 2. Resultado no banco de dados.

Vamos agora testar o método load para visualizar o que foi inserido na tabela. Ver listagem 7.

Listagem 7. Retornando todos os valores da tabela usuarios

<?php
require_once("conexao.php");
include_once("usuariosDAO.php");
$usuariosDAO = new usuariosDAO();

$arr = $usuariosDAO->load();
foreach ($arr as $key => $row){
	echo $row->getId() . " - " . $row->getNome() . " - "
             . $row->getLogin() . " - " . $row->getSenha() . "<br>\n";
}

$fields = "id,nome";
$add = "WHERE id = 1";
$arr = $usuariosDAO->load($fields,$add);
echo "<br>\n" . $arr[0]->getId() . " - " . $arr[0]->getNome() . "<br>\n";
?>

O método load você pode retornar todos os valores da tabela usuarios, sem passar nenhum parâmetro ou pegar alguns valores específicos. Na listagem 7 demonstrei as duas formas de usar. Veja na figura 3 o resultado.

Resultado do método load

Figura 3. Resultado do método load.

Na listagem 7 vamos testar o método update e alterar o login e senha do usuário com id igual a 2.

Listagem 8. Testando o método update e retornando os valores da tabela usuários

<?php
require_once("conexao.php");
include_once("usuariosDAO.php");
$usuariosDAO = new usuariosDAO();

$fields = array("login","senha");
$params = array("teste login","teste senha",3);
$where = "id = ?";
$rs = $usuariosDAO->update($fields,$params,$where);
var_dump($rs); /* Número de linhas afetadas */

echo "<br>\n";
$arr = $usuariosDAO->load();
foreach ($arr as $key => $row){
	echo $row->getId() . " - " . $row->getNome() . " - "
             . $row->getLogin() . " - " . $row->getSenha() . "<br>\n";
}
?>

Na listagem 8 o método update recebe os parâmetros $fields, $params e $where.

  • $fields - recebe um array com os campos que serão alterados.
  • $params - recebe os valores dos parâmetros, inclusive os valores dos parâmetros passados na condição where.
  • $where - recebe uma string que fará a condição para o update.

Confira o resultado do comando update na figura 4.

Resultado do método update

Figura 4. Resultado do método update.

Por fim vamos excluir um registro da nossa tabela com o método delete. Ver listagem 9.

Listagem 9. Testando o método delete e retornando os valores da tabela usuários

<?php
require_once("conexao.php");
include_once("usuariosDAO.php");
$usuariosDAO = new usuariosDAO();

$where = "id = ?";
$params = array(3);
$rs = $usuariosDAO->delete($where,$params);
var_dump($rs); /* Número de linhas afetadas */

echo "<br>\n";
$arr = $usuariosDAO->load();
foreach ($arr as $key => $row){
	echo $row->getId() . " - " . $row->getNome() . " - "
             . $row->getLogin() . " - " . $row->getSenha() . "<br>\n";
}
?>

Na listagem 9 o método delete recebe os parâmetros $where e $params.

  • $where - recebe uma string que fará a condição para o delete.
  • $params - recebe os valores dos parâmetros da condição where.

Confira o resultado do comando delete na figura 5.

Resultado do método delete

Figura 5. Resultado do método delete.

Fico por aqui e bons códigos.

Você pode fazer download do código fonte do exemplo nesse link

Gregory Monteiro

Gregory Monteiro - Programador/administrador dos sites da DevMedia. Formado em sistemas de informação. Certificados SEO pela mestreseo e ietv. Certificado CMMI pela FIOCRUZ. Curso de web developer pela microcamp. Administrador de redes. Conhecimentos em C#, VB.NET, ASP, PHP, JSP, HTML, XHTML, HTML5, Ajax, CSS3, jQuery, JavaScript, SQL Server, MySQL, Firebird, IIS 6/7, NGINX, Linux, WPF