quarta-feira, 23 de outubro de 2019

Utilizando JQuery para fazer requisições via Ajax e utilizando PHP para devolver dados JSON

Olá, pessoal. Mais uma vez. Desse vez vamos falar de algo muito maneiro.

Muitas das vezes precisamos fazer uma consulta no servidor sem a necessidade de recarregar ou mudar a página que estamos. Um exemplo seria a realização de login no nosso site.

Então repare no seguinte, a execução no servidor não poderá ser a partir do atributo action de um formulário. Isso faria com que o resultado da execução no servidor substitua nossa página atual. O que a gente quer é solicitar a execução de um programa no servidor e receber a resposta em uma variável de nossa página. Isso é possível através de uma técnica chama AJAX.

Eu tenho um post que explica como realizar essa operação com javascript, porém o código é pouco árduo. Para nossa sorte existe um framework que facilita nossa vida com sua função pronta para realizarmos operações em AJAX. Afinal, o quê significa AJAX? AJAX significa Assinchronous Javascript and XML. O AJAX foi utilizado inicialmente para transferência de dados usando a estrutura XML mas hoje server para enviar qualquer texto em qualquer formato.

Vamos supor que precisemos validar os dados de login de um determinado usuário. A validação é realizada lá no lado do servidor no entanto nós não queremos modificar a página atual, nós s´queremos verificar as credenciais são válidas. Caso elas estejam válidas nós vamos remover da página o formulário de login e mostrar a frase "Bem vindo, <nome do usuário>.

Isso é interessante pelo fato de carregarmos a página toda de novo, ela irá permanecer com a aparência original excetuando o formulário que não estará mais presente até que seja feito o logoff.

Veja o código a seguir como exemplo.

<html>     <body>         <h1>Meu Site</h1>         <h3>Joselmo</h2>         <div id="login">             Usuário: <input type="text" id="usu" />             Senha: <input type="password", id="senha" />             <button onCLick="fazLogin();">Entrar</button>         </div>         <div id="dados"></div>     </body> </html>


Repare que o nossos campos não estão dentro de nenhum formulário. O botão que que irá executar uma função javascript de nome "fazLogin".

Até aqui não tem nada de mais. A magia vai acontecer na função fazLogin, que irá realizar a operação Ajax. Para tal vamos utlizar o framework JQuery. Você poderá baixar a última versão do jquery do site jquery.com e incluí-lo no seu código. Você pode optar por usar o framework diretamente da internet, com ofoi feito no exemplo a seguir, no entanto irá precisar estar on-line para realizar seus testes.

Veja como fica.

<html>     <head>         <script src="https://code.jquery.com/jquery-3.4.1.js"></script>         <script>             function fazLogin() {             }         </script>     </head>     <body>         <h1>Meu Site</h1>         <h3>Joselmo</h2>         <div id="login">             Usuário: <input type="text" id="usu" />             Senha: <input type="password", id="senha" />             <button onCLick="fazLogin();">Entrar</button>         </div>         <div id="dados"></div>     </body> </html>


Agora vamos escrever nossa função fazLogin. Essa função irá pegir a execução do programa validaLogin.php no servidor. Isso será feito usando-se o método ajax do jquery e para isso precisaremos passar os vlores dos dados que queremos enviar, informar a url, o méthodo e que tipo de informação esperamos com resposta.

Veja como fica.

<html>     <head>         <script src="https://code.jquery.com/jquery-3.4.1.js"></script>         <script>             function fazLogin() {                 // Pega os valores dos campos                 var usuario = $("#usu").val();                 var senha = $("#senha").val();                 // Executa ajax esperando um dado do tipo json, que irá  // retornar em resultado                 $.ajax({                     method: "post",                     url: "validaLogin.php",                     data: { usu: usuariosen: senha},                     dataType: "json",                     success: function (resultado) {                         // Caso não haja erro comparo o código do json                         // retornardo com "000" indicando que o                         // login é válido                         if(resultado.codresp == "000") {                             // Login válido. Esconde div de credenciais.                             $("#login").hide();                         }                         else {                             // Avisa que os dados são inválidos                             alert("Dados inválidos.");                         }                 });             }         </script>     </head>     <body>         <h1>Meu Site</h1>         <h3>Joselmo</h2>         <div id="login">             Usuário: <input type="text" id="usu" />             Senha: <input type="password", id="senha" />             <button onCLick="fazLogin();">Entrar</button>         </div>         <div id="dados"></div>     </body> </html>



A primeira coisa que fazemos é pegar os valores dos campos usuário e senha. Repare que não foi usado o comando javascript document.getElementById, foi usado uma forma que eu considero mais elegante, uma vez que estamos usando o JQuery. Para acessarmos atributos e métodos de um determinado objeto da página nós usamos o '$' para indicar que estamos usano funções do JQuery, depois, dentro dos parênteses, nós usamos o id do objeto precedido pelo símbolo '#'. Assim, como quero acessar informações do objeto cujo id é 'usu' eu executo o comando $("#usu"). Depois é usar o '.' para colocarmos as funções ou aributos que desejamos acessar, no caso eu usei a função 'val()'. Essa função pega o valor atual contido no atributo 'value' do objeto.

Observação: Preste atenção no que vou dizer (escrever), o value no html pode ser um valor mas ele pode ter ser alterado a qualquer momento por um código html ou pelo usuário, isso fará com que o valor atual dele não seja igual ao que estar descrito no html.

Uma vez que temos os valores a serem enviados ao servidor podemos executar a função ajax do JQuery. Isso é feito usando o comando $.ajax(). Dentro dos parênteses nós passamos algumas informações que precisam estar entre chaves "{}". Essas informações não precisam estar na ordem que se apresentam no exemplo mas precisam ser descritas separadas por vírgula e seus dados devem ser precedidos por ":".

O primeiro valor a ser passado para a função ajax, no nosso caso,  foi o método.

method: "post",

Existe uma vírgula no final indicando que haverá outro parâmetro a ser passado. Depois foi informada a url a ser executada, ou seja que programa quero executar no servidor.

url: "validaLogin.php",

Depois foram passados os dados que validaLogin.php precisa para executar. As palavras a esquerda do ":" é o nome do índice que será buscado pelo $_POST dentro do validaLogin.php e o que está a direita do ":" é o valor que está sendo passado. No nosso caso esse valor está dentro de uma variável, por isso colocamos a variável (usuario e senha).

data: { usu: usuariosen: senha},

Em seguida informamos o tipo de dado que o ajax espera receber. No caso o programa validaLogin irá devolver uma informação no formato JSON ,faleremos sobre ele mais adiante, por isso esse argumento está como json.

dataType: "json",

Esses são os parâmetros básicos, porém uma vez que o programa lá no servidor tenha sido executado com sucesso como iremos processar a resposta dele? Para isso existe o argumento "success". Nesse argumento informamos qual função deverá ser processada no caso de uma execução bem sucedida no servidor. Depois falaremos no caso de  ocorrer erro.

success: function (resultado) {

O que está sendo dito na linha acima é que caso a execução no servidor tenha ocorrido sem problemas, então executar uma função anônima passando o valor de retorno dentro da variável resultado. Repare que existe a apalavra reservada function porém a função não tem nome, por isso ela é anônima.

Essa função será executada com oqualquer uma outra, a diferença é que ela só será executada quando a função ajax for executada sem erro.

JSON

Como dissemos antes, o programa validaLogin.php vai devolver um objeto JSON. Um objeto json nada mais é do que um texto com uma estrutura com nome da posição e o valor da posição, sendo que o valor da posição pode ser uma estrutura json também. Olhe o exemplo a seguir.


[ { "nome": "Joselmo", "telefone": "9999-9999", "idiomas": { "ingles": "Sim", "Espanhol": "Não" } }, { "nome": "Maria", "telefone": "1111-9999", "idiomas": { "ingles": "Não", "espanhol": "Sim" } } ]


O objeto começa com '[' e termina com ']'. Os seus elementos começam com '{' e terminam com '}'. O que separa um elemento do outro são as vírgulas.

No nosso exemplo existem dois registros. Um registro com os dados de Joselmo e outro com dados de Maria.

No javascript a forma como esses dados são acessados são basicamente pelo nome da variável que contem o elemento JSON e nome do da informação com um '.' entre os dois. Por exemplo, supondo que a variável "candidato" tenha apenas um registro no formato json, então, poderemos acessar o campo nome da seguinte forma: candidato.nome

E para acessar o campo espanhol seria: candidato.idiomas.espanhol

Agora, se a variável fosse de nome listaCandidatos e queremos pegar o nome do primeiro candidato, então usariámos: listaCandidatos[0].nome

Para o nosso programa validaLogin.php haverá duas informações em um único registro de retorno. O primeiro é um código informando que os dados do login estão corretos, e o segundo que será o nome completo do usuário. O nome do primeiro campo será codresp e o segundo será msg. Quando codresp for "000" irá significar que o login está válido e o nome completo estará em msg. Assim, uma resposta válida apareceria da seguinte forma:


[ { "codresp": "000", "msg": "Maria das Couves da Serra", } ]

Qualquer valor diferente de "000" para codresp indicará que o login não está válido.

É por isso que o código javascript na função ajax verifica se o o código de retorno é "000", pois se for verdade deveremos fazer com que a div que contem os campos para login desapareça.

if(resultado.codresp == "000") {


Para fazer com que um determinado elemento não apareça mais na página podemos usar função hide() do JQuery.

$("#login").hide();



No Lado do Servidor

Pois bem, galera, do lado do servidor teremos o seguinte código:

<?php // Pego informações enviadas pelo ajax $usuario = $_POST['usu']; $senha = $_POST['sen']; // Cria um array vazio $retorno = array(); // Monto query de consulta $sql = "Select nome From USUARIO ". "Where email = ? ". "and senha = sha2(?,0)"; // Faço login no banco de dados meusite utilizando a senha
// da aplicação, no meu caso "msite" $con = new mysqli('localhost','msite','12#*aB','meusite'); // Preparo o comando sql $cmdprep = $con->prepare($sql); // Passo os valores para a query $cmdprep->bind_param('ss', $usuario, $senha); // Executo o comando $cmdprep->execute(); // Defino a variável que recebera a resposta // do bando de dados $cmdprep->bind_result($nome); // Pega valor retornado da execução if($cmdprep->fetch()) { // Retornou um valor, logo acho // usuário e senha correspondentes $retorno['codresp'] = '000'; $retorno['msg'] = $nome;
    session_start(); $_SESSION['logado'] = true; $_SESSION['nome'] = $nome;
} else { // Fetch não retornou nenhuma linha, // logo usuário e senha não batem $retorno['codresp'] = '001'; $retorno['msg'] = 'Login inválido'; } echo json_encode($retorno);

A primeira coisa que faço é pegar os valores passados pelo ajax, repare bem que estou usando $_POST pelo fato do método utilizado (olhe o código do lado cliente) foi o post. Além disso as variáveis utilizadas para a passagem dos valores foram 'usu' e 'sen', por isso os índices usados dentro do $_POST foram esses.

$usuario = $_POST['usu'];
$senha = $_POST['sen'];

Como o meu retorno tem que ser um JSON eu crio um array, esse array mais tarde será transformado em uma estrutura JSON com a função json_encode do PHP. O array é criado vazio com a função array().

$retorno = array();

O comando seguinte é colocar na variável $sql ( a variável pode ter o nome que você quiser) o comando sql que será utilizado para pegar o nome do usuário e, claro, validar o usurário e senha. No meu site o que identifica o usuário é a senha dele, por isso

Você pode perceber que na senha eu utilizo a função do mysql sha2 para encriptar a senha digitada pelo usuário. Quando a senha foi gravada no banco foi utilizada essa função o que faz com que seu valor da senha não seja legível, esse código gerado não pode ser transformado novamente no valor original e por isso a única forma de comparar se a senha digitada é igual a que está no manco é comprando o código gerado pelo sha2 da senha digitada com o código que está gravado no banco.

Além da senha precisamos comparar também o usuário. Não pode ser apenas o usuário e nem só a senha para validar no banco de dados, isso pelo fato de um usuário poder ter escolhido uma senha igual a de outro usuário.

$sql = "Select nome From USUARIO ".
"Where email = ? ".
"and senha = sha2(?,0)";


Depois faço conexão com o banco de dados, eu uso a senha da aplicação para fazer a conexão não os dados informados pelo usuário do sistema. O usuário do sistema tem seus dados gravados em uma tabela específica, no meu caso é na tabela USUARIO.

$con = new mysqli('localhost','msite','12#*aB','meusite');


Depois preparo o comando no banco de dados utilizando a função prepare() do mysql. A função prepare() solicita ao banco de dados que faça uma primeira validação e prepare o ambiente para a execução da query.

$cmdprep = $con->prepare($sql);


Agora preciso substituir as '?' da minha query pelos valores recebidos.

$cmdprep->bind_param('ss', $usuario, $senha);

As duas '?' esperam ser trocadas por valores do tipo string, por coloco os 'ss', um 's' para cada interrogação e em seguida coloco as variáveis, separadas por vírgula, que contém os valores que substituirão as '?'.

$cmdprep->bind_param('ss', $usuario, $senha);


Agora é executar a query.

$cmdprep->execute();


Existem várias formas de receber o valor retornado do banco de dados, eu vou utilizar a função bind_result() para esse caso. Essa função diz para o PHP onde ele deve armazenar os valores retornas do banco quando a função fetch() for executada. No meu caso ele vai colocar o valor retornado na variável $nome.

$cmdprep->bind_result($nome);

Agora executo o fetch() para que caso ele tenha achado o usuário com os dados informados ele coloque o nome achado na variável informada no bind_result(), no caso $nome. O fetch() está dentro de um if porque caso não seja encontrado o usuário com os valores informados o fetch() retornará false, fazendo com que os comandos no else sejam executado.

if($cmdprep->fetch()) {
$retorno['codresp'] = '000';
$retorno['msg'] = $nome;
session_start();
$_SESSION['logado'] = true;
$_SESSION['nome'] = $nome;
}
else {
$retorno['codresp'] = '001';
$retorno['msg'] = 'Login inválido';
}

Caso o fetch() execute com sucesso, o que significa que encontrou o email e a senha, eu coloco o valor "000" no array $retorno para o índice "codresp" para indicar que o login foi realizado com sucesso, coloco o o nome achado do usuário também no array $retorno no índice "msg".

É importante lembrar que algumas páginas no site só poderão ser acessadas se o usuário estiver logado. Para que outras páginas possam saber se o usuário está logado eu criei uma variável de sessão de nome "logado" e coloquei o falor true nela.

Para criarmos uma variável de sessão antes precisamos iniciar a cessão.

session_start();

Depois atribuímos um valor à nossa variável de sessão.

$_SESSION['logado'] = true;

Também guardo na sessão o nome do usuário, assim qualquer página poderá mostrar o nome do usuário.

$_SESSION['nome'] = $nome;



Agora, se o fetch falhar, ou seja, não encontrar o usuário, então vamos fazer o código de resposta ser "001" e a mensagem de retorno igual "Login inválido".

$retorno['codresp'] = '001';
$retorno['msg'] = 'Login inválido';


Depois de tudo feito podemos devolver para a página o resultado de nossa execução. O Ajax executado pela página espera receber uma estrutura JSON e por isso executamos a função json_encode() e um array para transformar o array em uma estrutura JSON.

echo json_encode($retorno);



O Logoff


O logoff deixarei por sua conta mas darei umas dicas.

Bote um botão, ou uma div ou uma imagem, perto do nome do usuário na sua página, para que seja pressionada pelo usuário. Quando ele for pressionado é porque o usuário quer fazer o logoff da página. Semelhante ao login você irá realizar uma operação Ajax para executar um programa PHP para realizar o logoff, pode ser um nome como fazLogoff.php.

Se o Ajax for realizado com sucesso você esconde a div com o nome e o botão, e depois mostra a div com os campos para login.

No lado do servidor você irá criar o programa PHP dito anteriormente. Ele deverá iniciar a sessão e depois colocar o valor false na variável de sessão "logado" e vazio na variável de sessão "nome".  Depois retornar o JSON com codresp igual a "000" e "msg" igual a "Logoff realizado com sucesso".

Muito bem galera, ficou extenso mas ficou chupetinha.

É isso. Espero ter ajudado. Um forte abraço.

segunda-feira, 14 de outubro de 2019

Trabalhando com Sessão em PHP

Olá mais uma vez, pessoal.

Agora vamos falar de mais um ponto que é chupetinha. Vamos falar de Sessão.

Muitas das vezes precisamos manter uma determinada informação disponível para ser usada em todo o nosso site ou para ser usada por outras páginas sem que o usuário tome conhecimento. Uma solução poderia ser o uso der cookie, porém algumas informações precisam ser mantidas no servidor por uma questão de segurança, e nesse caso o uso de sessão é a indicada.

Trabalhar com sessão é como trabalhar com uma variável que está disponível para uso em qualquer página que criamos em nosso site.

Os valores guardados na sessão irão permanecer enquanto o navegador permanecer aperto ou até que você as apague explicitamente, usando um comando para isso.

Uma sessão está associada a uma janela, não aba, do seu navegador. Você terá duas sessões distintas em janelas diferentes do seu navegador ou navegador diferente.



Vamos, como de costume, ao passo-a-passo de como usar variáveis de sessão.


1)  Iniciar a sessão

A primeira coisa que você precisa fazer é executar um comando PHP que disponibiliza as variáveis de sessão para você. Esse comando é o session_star().

/********************************************     Iniciando a sessão ********************************************/
session_start();



O comando session_start() inicia uma nova sessão caso ainda não esteja iniciada, e caso já haja uma sessão iniciada ela disponibiliza as suas variáveis.


2)  Utilizar as variáveis de sessão

Depois de iniciar a sessão você poderá criar, alterar, ler ou apagar uma variável da sessão.

Nós acessamos uma determinada variável utilizando um array de nome $_SESSION. Repare nas letra maiúsculas, te que ser assim, se escrever com alguma letra minúscula não funciona. Lembre-se de que o PHP é case sensitive, ou seja faz distinção entre letras maiúsculas e minúscula, elas não representam a mesma coisa.

Para criar ou alterar uma variável se usa um mesmo formato de comando. No exemplo abaixo, por exemplo, se a variável de sessão 'nomeUsuario' não existir ela será criada e se já existir ela terá seu valor alterado para Joselmo.

/********************************************     Iniciando a sessão ********************************************/
session_start();
$_SESSION['nomeUsuario'] = 'Joselmo';
//



Para efetuar a leitura do valor de uma variável de sessão nós fazemos operações consultando o valor contido no array $_SESSION. Veja.

/********************************************     Iniciando a sessão ********************************************/
session_start();
nome = $_SESSION['nomeUsuario']; // Pego valor da variável de sessão
echo $nome; // Imprime o nome contido na variável de sessão 'nomeUsuario'


Caso você não queira mais deixar um determinada variável disponível, por qualquer motivo que seja, sem destruir todas as outras variáveis de sua sessão você deverá fazer uso da função unset().


/********************************************     Iniciando a sessão ********************************************/
session_start();
$nome = $_SESSION['nomeUsuario']; // Pego valor da variável de sessão
echo $nome; // Imprime o nome contido na variável de sessão 'nomeUsuario'
unset($_SESSION['nomeUsuario']); // Após essa linha a variável de sessão
// 'nomeUsuario' não existirá mais.



Se em um determinado momento você desejar destruir todas as variáveis de uma sessão você poderá fazê-lo usando a função session_unset(). Essa função apaga todas as variáveis da sua sessão.

/********************************************     Iniciando a sessão ********************************************/
session_start();
$nome = $_SESSION['nomeUsuario']; // Pego valor da variável de sessão
echo $nome; // Imprime o nome contido na variável de sessão 'nomeUsuario'
session_unset(); // Após essa linha todas as variáveis de sessão
// não existirão mais.




Vamos ao exemplo de Login usando sessão.

O nosso programa PHP recebe dois parâmetros enfiados pelo método POST, um deles é o login e o outro é a senha. Precisamos validar o acesso e devolver o nome do usuário caso o login tenha sido realizado com sucesso ou vazio ("") caso os dados não confiram com a base de dados.

Como a senha está criptografada na base de dados com a função sha2, teremos que usar essa função na base de dados para realizar a consulta.


session_start();

$email = $_POST['email'];
$senha = $_POST['senha'];

$sql = "Select nome From USUARIO Where email = ? and senha = sha2(?,0)";
$con = new mysqli('localhost','root','','meusite');
$cmdprep = $con->prepare($sql);
$cmdprep->bind_param('ss',$email,$senha);
$cmdprep->execute();
$cmdprep->bind_result($nome);
if($cmdprep->fetch()) {
$_SESSION['logado'] = true;
$_SESSION['nome'] = $nome;
echo $nome;
}
else {
echo "";
}




Em todas as páginas você poderia estar incluindo em um determinado arquivo PHP para colocar a mensagem "Bem vindo, ...!"  caso ele esteja logado. Para isso poderemos usar um exemplo como esse abaixo.



session_start();

// Testo a existência da variável de sessão para evitar
// erro caso a variável de sessao não exista.
if (isset($_SESSION['logado'])) {
// A variável de sessão existe
// Verifico se o usuário está logado
if($_SESSION['logado'] == true) {
// Coloca mensagem semelhante a 'Bem vindo, Joselmo!'
// e sai do programa para não botar mensagem 'Faça login'.
echo "Seja bem vindo, " . $_SESSION['nome'] ."!" ;
exit;
}
}
echo 'Faça login';



Você poder ter páginas que só podem ser acessadas se o usuário estiver logado. Nesse caso você poderá fazer uso da função include() ou include_once() de um arquivo que teste se o usuário está logado. Como esse exemplo a seguir.

session_start();

// Testa a existência da variável de sessão para evitar
// erro caso a variável de sessao não exista.
if (! isset($_SESSION['logado'])) {
// A variável de sessão NÃO existe
// Ir para a página inicial
header("Location: index.php");
}

// Verifica se o usuário está logado
if($_SESSION['logado'] != true) {
// A variável de sessão NÃO existe
// Ir para a página inicial
header("Location: index.php");
}

// Continua o seu código





E para fazer logof você poderia usar algo semelhante ao exemplo abaixo.

session_start();
session_unset();
header("Location: index.php");


É isso aí meus queridos amigos. Fala sério, esses exemplos são ou não são chupetinha?

Afinal, la garantia soy Jo (yo).

Aquele abraço e até a próxima.



domingo, 2 de junho de 2019

Criando Bean e Dao em PHP

Olá, galerinha.

Bem, muitas vezes precisamos montar um site que acessa alguma tabela para que possamos coletar dados para apresentar na página, ou para realizar alguma tarefa específica, e não é raro termos que montar rotinas para realizar as operações CRUD nas tabelas.

A melhor forma de fazermos isso é montando classes de objetos que representem os dados da tabela e DAO para realização das operações CRUD.

Por que usar essas essas classe? As vantagens são muitas, reutilização, facilidade de manutenção, padrão, diminuição no tempo de desenvolvimento, diminuição de custo de construção.

Para começar vamos usar a tabela mostrada n modelo a seguir como base para a criação das nossas classes Bean e DAO.



Classe Bean

O que é uma classe Bean? Um Bean é uma classe que contém apenas atributos privados e os métodos de acesso para esses atributos, ou seja, é uma classe que não tem nenhum comportamento para realização de tarefas. O único objetivo é receber dados e fornecer os mesmos dados recebidos.

Quando lemos alguma linha de uma tabela precisamos guardar os valores retornados em algum lugar, esse lugar é o Bean.

Por padrão o nome da classe Bean é o mesmo da tabela, além disso toda classe deve ter seu nome iniciado com letra maiúscula, então o nome da nossa classe será Produto. Veja como fica representado na imagem de um UML.



Você pode observar o sinal '-' antes de cada atributo, isso indica que os mesmos são privados. Por outro lado você pode ver o sinal '+' antes de cada método, o que indica que todos são públicos. Então, como pode ser deduzido, a única forma de termos acesso aos valores dos atributos, seja para escrever ou ler nos mesmos, é através dos métodos. Por isso o nome método de acesso.

Por padrão de nomenclatura os métodos e atributos começam com letra minúscula e a cada mudança de palavra colocamos uma letra maiúscula. Além disso os métodos de acesso só podem ser de dois tipos, ou são de escrita ou são de leitura. Caso sejam de escrita deverão ter o prefixo set e se forem de leitura deverão ter o prefixo get e, em qualquer dos casos, após o prefixo deverá ter o nome do atributo iniciado com letra maiúscula.

Criar uma classe no PHP é fácil se você já conhece algo de orientação a objeto. Mas se não, aí é só criar um arquivo com o código a seguir. O nome do arquivo deverá ser o mesmo nome da classe, lembrando que precisa começar com letra maiúscula e ter a extensão php.


<?php class Produto {     private $codigo;     private $descricao;     private $preco;
    /********************************************      Get of atribute codigo     ********************************************/     public function getCodigo() {         return $this->codigo;     }
    /********************************************      Set of atribute codigo     ********************************************/     public function setCodigo($codigo) {         $this->codigo = $codigo;     }
    /********************************************      Get of atribute descricao     ********************************************/     public function getDescricao() {         return $this->descricao;     }
    /********************************************      Set of atribute descricao     ********************************************/     public function setDescricao($descricao) {         $this->descricao = $descricao;     }
    /********************************************      Get of atribute preco     ********************************************/     public function getPreco() {         return $this->preco;     }
    /********************************************      Set of atribute preco     ********************************************/     public function setPreco($preco) {         $this->preco = $preco;     } }
?>




Classe DAO

A classe DAO (Database Access Object) é responsável por executar todas as operações na base de dados. Ela tem ser capaz de rea lizar as operações de criação, leitura, atualização e deleção de dados na tabela. Essas operações chamamos de CRUD (Create, Read, Update, Delete).

O UML que representa essa classe está na imagem a seguir.



A classe ProdutoDao possui um único atributo. Esse atributo deverá receber uma conexão válida para que os métodos possam ser executados com sucesso.


Lembrando que o arquivo deverá ter o mesmo nome que a classe, assim nosso arquivo deverá se chamar ProdutoDao.php e irá começar com s seguintes linhas:


<?php include_once("Produto.php"); class ProdutoDao { public $conn;

Repare que faz inclusão do arquivo que contém a classe Produto, pois será utilizada.

O método create tem por obrigação incluir uma linha com os dados dos produtos, por isso o argumento que ele recebe um objeto da classe Produto. Ou seja, antes de executarmos esse método devemos instanciar um objeto Produto, colocar os valores nos seus atributos para depois executar o método create. Caso a operação tenha terminado com sucesso irá retornar um valor lógico true, caso contrário retornará false.

O código fonte do método é como segue.

    /********************************************      create method     ********************************************/     public function create($bean) {
        if
(!$this->conn) {         return false;         }
        $sql
= "Insert Into produto (                     codigo,                     descricao,                     preco          )          Values (?,?,?)";
        /*** Do prepare ***/         if(!($prdstm = @mysqli_prepare($this->conn,$sql)) ) {             return false;         }         else {             $var_codigo = $bean->getCodigo();             $var_descricao = $bean->getDescricao();             $var_preco = $bean->getPreco();
if(!($prdstm->bind_param('iss',                  $var_codigo,                  $var_descricao,                  $var_preco ) ) ) {
return false; }
if($prdstm->execute()) { $prdstm->close(); return true; }
else { return false; }
}/* Finalizing method */ }




O método read usa um do dois argumentos. Você deve informar apenas o primeiro argumento caso tenha a chave primária para realizar a consulta, neste caso o método read retornará um objeto da classe Produto com seus atributos com os valores retornados da tabela. Porém, se você não tem a chave primária mas deseja fazer a consulta utilizando uma outra condição, então o primeiro argumento deverá ser vazio e coloque sua condição, respeitando os atributos da tabela, no segundo argumento. Neste caso o método retornará um array de objetos Produto. Tome cuidado ao usar condições que não sejam a chave primária pois poderá acarretar lentidão na pesquisa de banco de dados e por consequência na apresentação da página, se a tabela for grande coloque índices nas colunas que podem ser usadas como condição de pesquisa. Caso ocorra algum erro o método devolverá o valor lógico false.


O código do método read está a seguir.

    /********************************************      read method     ********************************************/ public function read($var_codigo, $wherePar="") { if(!$this->conn) { return false; } if($wherePar == "") { $sql = "Select * From produto Where codigo = ?"; } else { $sql = "Select * From produto Where $wherePar"; }

/*** Do prepare ***/
if(!($prdstm = @mysqli_prepare($this->conn,$sql)) ) { return false; } else { if($wherePar == "") { /*************************************** * Read just one line from table. * Just the id parameter will be used */ if(!($prdstm->bind_param('i',$var_codigo )) ) { return false; } if($prdstm->execute()) { $prdstm->bind_result(                      $var_codigo,                      $var_descricao,                      $var_preco ); if ( $prdstm->fetch() ) { $bean = new Produto();                      $bean->setCodigo($var_codigo);                      $bean->setDescricao($var_descricao);                      $bean->setPreco($var_preco); $prdstm->close(); return $bean; } else { $prdstm->close(); return null; } } else { $prdstm->close(); return false; } } else { /*************************************** * Read one or more lines from table. * The id parameter will not be used, * the where parameter will be used instead. */ $beanArray = array(); if($prdstm->execute()) { $prdstm->bind_result(
                     $var_codigo,                      $var_descricao,                      $var_preco ); while ( $prdstm->fetch() ) {
$bean = new Produto();                      $bean->setCodigo($var_codigo);                      $bean->setDescricao($var_descricao);                      $bean->setPreco($var_preco);
$beanArray[] = $bean; } $prdstm->close(); return $beanArray; } else { $prdstm->close(); return false; } } } /* Finalizing method */ }



O método update recebe um objeto da classe Produto como argumento. É importante que a chave primária esteja correta e todos os atributos preenchidos pois todos os valores serão atualizados na tabela. Repare que caso o banco de dados não encontre nenhuma linha com a chave primária não será considerado erro. Por isso caso seja necessário, faça uma pesquise antes para saber se a chave primária existe na tabela antes de realizar a operação de update. Se ocorrer alguma falha no update será retornado o valor lógico false.

A seguir está o código do método update.

    /********************************************      update method     ********************************************/ public function update($bean) { if(!$this->conn) { return false; } $sql = "Update produto Set " . " codigo = ?, " . " descricao = ?, " . " preco = ? " . "Where codigo = ?"; /*** Do prepare ***/         if(!($prdstm = @mysqli_prepare($this->conn,$sql)) ) { return false; } else {             $var_codigo = $bean->getCodigo();             $var_descricao = $bean->getDescricao();             $var_preco = $bean->getPreco(); if(!($prdstm->bind_param('issi',                                      $var_codigo,                                      $var_descricao,                                      $var_preco,                      $var_codigo )) ) { return false; } if($prdstm->execute()) { $prdstm->close(); return true; } else { $prdstm->close(); return false; } } /* Finalizing method */ }




O método delete só precisa da chave primária como argumento para realizar sua operação. Caso ocorra alguma falha será retornado o valor lógico false. Repare que caso o banco de dados não encontre nenhuma linha com a chave primária não será considerado erro. Por isso caso seja necessário, faça uma pesquise antes para saber se a chave primária existe na tabela antes de realizar a operação de delete.

 A seguir está o código fonte do método delete.


    /********************************************      delete method     ********************************************/ public function delete($var_codigo) { if(!$this->conn) { return false; } $sql = "Delete From produto Where codigo = ?"; /*** Do prepare ***/ if(!($prdstm = @mysqli_prepare($this->conn,$sql)) ) { return false; } else { if(!($prdstm->bind_param('i',$var_codigo )) ) { return false; } if($prdstm->execute()) { $prdstm->close(); return true; } else { $prdstm->close(); return false; } } /* Finalizing method */ }


E o arquivo termina com essas poucas linhas.

} ?>




Exemplo de utilização do DAO.

Vamos fazer um programa para inserir uma linha na tabela.

<?php
// Inclusão das classes que serão utilizadas include once("Produto.php"); include once("ProdutoDao.php");
// Dados para conexão com o banco de dados $db = 'teste'; $usr = 'usr'; $pwd = '123'; $srv = 'localhost';
// Realização da conexão if($conexao = @mysqli_connect($srv,$usr,$pwd,$db)) { // Conexão com BD foi realizada // Instancia classe Bean e seta seus atributos $p = new Produto(); $p->setCodigo(7); $p->setDescricao("Produto Teste"); $p->setPreco(8.50);
// Instancia objeto da classe DAO e coloca objeto de conexão // no seu atributo conn $pd = new ProdutoDao(); $pd->conn = $conexao; // Executa método update $r = $pd->create($p); if($r == false) echo "Erro ao tentar inserir na tabela. \n"; else echo "Linha inserida com sucesso.\n"; } else { //Conexão com o banco de dados falhou echo "Erro ao tentar conectar ao banco de dados\n"; } ?>



É isso, gente. Agora é botar a mão na massa e praticar. Faça programas para usar os outros métodos.


Um forte abraço e até a próxima.