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 MonteiroVamos 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.
Figura 1. Resultado para cada insert feito.
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.
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.
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.
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