A dupla PHP e MySQL se tornou uma das “casadinhas” mais conhecidas entre os desenvolvedores web, provavelmente por duas características: estabilidade e gratuidade.

Esse artigo não tem como objetivo explicar o funcionamento do MySQL, tampouco detalhar a linguagem PHP. Veremos a construção de um mural de recados para uma intranet empresarial, enfatizando apenas os códigos que fazem acesso ao banco de dados. O sistema completo está disponível para download.

A idéia é simples: o usuário entra com o nome, diz para quem é o recado e digita a mensagem. Todos podem ler os recados, independente do destinatário; afinal, é assim que acontece em um mural de recados no mundo real.

O sistema contém três telas:

  • Página principal: lista todos os recados, contendo data de entrada, assunto, nome do autor e destinatário. Quando o usuário clica em um assunto, a página de detalhes do recado é exibida;
  • Página de leitura dos recados: exibe os detalhes do recado selecionado na página principal;
  • Inserção de recado: página com formulário para cadastro de uma nova mensagem. Acessada por um link na página principal.

O sistema contém cinco arquivos PHP: três para representar as telas, um para realizar o cadastro da mensagem e um para a conexão com o banco de dados. Centralizar o código da conexão em um arquivo facilita a manutenção, pois se em algum momento a string de conexão mudar, nosso trabalho se restringirá em alterar apenas um arquivo. As telas estão reproduzidas nas Figuras 1, 2 e 3:

NOTA: Para maiores informações sobre o MySQL, leia a matéria de Clementino Leal na SQL Magazine 1.

Configurando o ambiente

Para rodar o mural de recados é necessário um servidor MySQL, um servidor web e o PHP. Este exemplo foi desenvolvido em uma máquina com Windows 2000 e PHPTriad, um utilitário freeware ideal para desenvolvedores iniciantes, pois instala e configura o Apache, MySQL e PHP, automaticamente.

Criando o banco de dados

Para criar o banco utilizei o PHPMyAdmin, um aplicativo para gerenciamento visual do MySQL, que trabalha via browser. Para conhecer alguns gerenciadores visuais para este banco, leia a matéria de Vinícius Andrade na SQL Magazine 2.

Crie um banco de dados chamado SQLMag com a instrução:

CREATE DATABASE SQLMag;

Crie uma tabela chamada TBL_recados com a seguinte estrutura:

CREATE TABLE tbl_recados 
  (id INT (5) not null AUTO_INCREMENT, 
  usuario VARCHAR (30) not null, 
  para VARCHAR (30) not null, 
  email VARCHAR (100) not null , 
  data DATE , 
  assunto VARCHAR (70) not null , 
  msg TEXT not null , 
  PRIMARY KEY (id) )

Conectando com o banco de dados

O arquivo PHP para fazer a conexão com o banco será chamado dbcon.php. Veja seu conteúdo na listagem 1.


<?
         $dbname="SQLMag";
         $usuario="root";
         $password="";  
 
         $con = mysql_connect("localhost",$usuario,$password);         
         $banco=mysql_select_db($dbname,$con);
?>

Nessa listagem vemos algumas características da sintaxe da linguagem. Todo bloco de código escrito em PHP é iniciado pelo símbolo “<?” e finalizado por “?>”. O que fica em volta desse bloco são códigos HTML. Vemos também que uma variável no PHP é precedida pelocaractere“$” e cada linha de comando é finalizada pelocaractere“;”.

Na primeira linha criamos uma variável chamada $dbname, que recebe o nome do banco de dados. Em seguida instanciamos as variáveis $usuario e $password, que recebem as informações de login. Por padrão, todo banco recém criado no MySQL tem um usuário chamado root, cuja senha é vazia.

NOTA: O parâmetro password pode ser omitido, caso o usuário não possua uma senha de conexão.

Na quarta linha vemos a função mysql_connect, que estabelece a conexão com o banco. A variável $con recebe a instância dessa conexão e serve para referenciar o banco de dados por toda a aplicação.

Mysql_connect faz parte da biblioteca de acesso nativo ao MySQL, quedispensao uso de drivers intermediários comoo ODBC. A vantagem no uso dessas funções é a performance, pois evitamos uma camada a mais na conexão com o banco. Veja o box funções nativas para maiores informações.

Funções nativas
Todas as funções de acesso ao banco de dados neste exemplo são iniciadas pela palavramysql. Essas funções representam o acesso nativo do PHP ao MySQL, eliminando a necessidade de uma camada intermediária, como o ODBC. Além do MySQL, a versão atual do PHP possui acesso nativo para o Oracle, SQL Server, Informix, InterBase, PostgreSQL e Sybase.

As conexões nativas são mais rápidas e leves. Porém, há uma desvantagem: essas funções “amarram” o código a um banco de dados específico. Por exemplo, para trabalhar nativamente com o SQL Server, utilizamos as funçõesmssql_connect, mssql_select_db, mssql_queryemssql_fetch_array. Se precisamos mudar o banco de dados, teremos que alterar, praticamente, todo o sistema. Uma forma de minimizar esse problema é criar rotinas que encapsulam as funções de acesso nativo. Veja um exemplo:


function generic_connection($endereco, $usuario, $senha)
{
    mysql_connection($endereco, $usuario, $senha);
}

Dessa forma, se o banco de dados mudar, apenas o código da função será alterado, economizando muito esforço na manutenção do sistema.

A instrução recebe como parâmetro o endereço do servidor MySQL, o usuário e a senha. Neste exemplo utilizamos o endereço localhost, indicando que o MySQL está localizado na própria máquina. Nada impede que o MySQL esteja rodando em outro computador; nesse caso, basta mudar localhost para o endereço IP ou domínio da estação onde o banco está ativo.

O comando mysql_select_db abre o banco de dados SQLMag. Os parâmetros indicam o nome do banco e a instância de conexão. Após sua execução, todas as instruções SQL enviadas para o servidor serão direcionadas para esse banco de dados.

Dessa forma, nosso arquivo de conexão fica disponível para ser utilizado em qualquer outro módulo do sistema. A conexão aberta será fechada com a função mysql_close(instância_da_conexão), a fim de liberar os recursos alocados.

Página Principal

No arquivo index.php, o primeiro passo é realizar a conexão com banco de dados SQLMag, através do arquivo dbcon.php. Para isso, utilizamos a cláusula include:

<? 
    include("dbcon.php")
  ?>

A página principal exibe uma listagem com todos os recados armazenados em tbl_recados. O código responsável em abrir a tabela e recuperar todos os registros está descrito abaixo:

<? 
  $sql = "select * from tbl_recados";
   
  $qry = mysql_query($sql, $con); 
  ?>

A variável $sql recebe a string de consulta que será executada no banco. A função mysql_query recebe o conteúdo de $sql e envia a instrução para o servidor, carregando o resultado na variável $qry. O segundo parâmetro da função é a instância de conexão com o banco de dados.

Um fato importante é que os dados em $qry não podem ser acessados diretamente. A variável representa um buffer, que deve ser lidosequencialmenteatravés da função mysql_fetch_array. A cada execução, um registro é recuperado e o ponteiro de leitura avança uma posição.

NOTA: Existem outras funções do tipo mysql_fetch; no entanto, para o sistema em questão, o uso de mysql_fetch_array é suficiente.

O próximo passo é realizar um loop sobre os registro retornados, exibindo-os na página. O código para essa tarefa está descrito na listagem 2:

<?
  while ($row = mysql_fetch_array($qry)){ ?>
    <tr> 
            <td> 
   
  <a href="ler_recado.php?id=<?  echo $row["id"]; ?>"> 
  <?  echo $row["assunto"]; ?> </a></td>
            <td>
  <?  echo $row["usuario"]; ?> </td>
            <td>
  <?  echo $row["para"]; ?> </td>
            <td>
  <?  echo $row["data"]; ?> </td>
          </tr>
  <? 
   }
  ?>

Observe que, dentro do while, temos a seguinte operação:

$row = mysql_fetch_array($qry)

A função mysql_fetch_array lê um registro do buffer, carregando-o na variável $row. Quando o ponteiro chegar ao final, o comando while será abortado. Note que o símbolo “=” representa atribuição; no PHP, a igualdade é testada com o símbolo “==”.

Dentro do while montamos a string HTML para exibir os campos do registro recuperado. Todos os campos estão disponíveis através da variável $row, que representa um array. O comando echo é equivalente ao comando print: ele retorna a expressão passada como parâmetro em formato HTML puro, montando o corpo da página dinamicamente. Por exemplo, veja a linha a seguir:

<b><?  echo $row["usuario"]; ?> </td>

O resultado desse comando no browser cliente seria o nome do usuário iniciado pela tag <b>:

<b>Danilo Bertholini

Outro detalhe é que o campo assunto deve fornecer um link para a página de leitura de recados. O código abaixo cria o link:

<a href="ler_recado.php?id=<?  echo $row["id"]; ?>"> 
  <?  echo $row["assunto"]; ?> </a></td>

A tag <a href> é construída dinamicamente, concatenando o ID do registro atual ao link “ler_recado.php?id=”. O valor desse campo será utilizado na página de leitura, para exibir os detalhes do recado selecionado.

No final do arquivo index.php, devemos fechar a conexão com o banco de dados:

<? mysql_close($con) ?>

Cadastro de Mensagem

O arquivo para inclusão de recados será chamado de insere_recado.php. Nele teremos um formulário HTML contendo controles para os campos nome, e-mail, assunto, para e mensagem, conforme mostra a listagem 3.


  <form action="grava.php" method="post" name="frm_insere">
        <table>
          <tr>
            <td >Nome: </td>
            <td ><input name="nome" type="text" ></td>
          </tr>
          <tr>
            <td>E-mail: </td>
            <td><input name="mail" type="text" ></td>
          </tr>
          <tr>
            <td>Para: </td>
            <td><input name="para" type="text" ></td>
          </tr>
          <tr>
            <td>Assunto: </td>
            <td><input name="assunto" type="text" ></td>
          </tr>
      <tr>
            <td>Mensagem: </td>
            <td><textarea name="msg" cols="49" rows="4"></textarea></td>
          </tr>
          <tr>
            <td><br>
      <input name="btn_cad" type="submit" value="Cadastrar!">
              <input name="btn_limpa" type="reset" value="Limpar"></td>
          </tr>
        </table>
      </form>

No código fonte completo, algumas funções JavaScript garantem que todos os campos devem ser preenchidos antes que os dados sejam enviados.

Observe que o parâmetro action, da tag form, direciona o envio dos dados para o arquivo grava.php. A listagem 4 exibe o código principal desse arquivo.

<?  include("dbcon.php");  
      $data = date("d/m/y"); 
   
   
  $sql = "insert into tbl_recados (usuario,email,data,para,assunto,msg) values         
               ('$nome','$mail','$data','$para','$assunto','$msg')";
                    
  $qry = mysql_query($sql, $con);                    
   
     mysql_close($con);
   
    echo "Sua mensagem foi cadastrada com sucesso!";
   
  ?>

Quem já programa em ASP vai perceber, com estranheza, que as variáveis $nome, $mail, $data, $para, $assunto e $msg não foram inicializadas. Essa é uma característica interessante do PHP: os campos enviados para um página, através do método GET ou do método POST, ficam automaticamente disponíveis através de variáveis que possuem o mesmo nome, eliminando a necessidade de inicialização. Para maiores informações sobre os métodos GET e POST, leia o box Métodos de Envio.

Métodos GET x POST

Existem dois tipos de envio de dados entre páginas HTML, conhecidos como GET e POST. No primeiro, os dados são passados através da própria URL, através da sintaxe:

http://url?campo1=valor1

Este método geralmente é utilizado para passar valores através de links, como fizemos no exemplo do mural de recados.

Já o método POST é recomendado para envio de informações digitadas pelo usuário, pois ele “esconde” os dados no cabeçalho do pacote HTML. Para especificarmos que um formulário deverá utilizar o método POST, utilizamos a sintaxe:

<form method=”post” ...>

Se não indicarmos o parâmetro POST na construção de um formulário HTML, o método utilizado será GET, ou seja, o formulário montará uma string url contendo todos os valores digitados pelo usuário.

Os passos seguintes já são conhecidos: a variável $sql recebe o comando INSERT concatenado com os campos enviados através do formulário. Em seguida a função mysql_query executa o comando SQL e a conexão é finalizada. A mensagem de sucesso é uma simplificação com fins didáticos; a listagem completa apresenta uma confirmação mais elaborada.

Leitura de Recados

O funcionamento da página de leitura é simples: recuperamos o valor do campo ID, passado como parâmetro pela página principal e executamos uma instrução SELECT com este valor. Observe a listagem 4.

<? 
    include("dbcon.php");  // adiciona o conteúdo do arquivo dbcon.php
   
  $sql = "select * from tbl_recados where id = $id";
  $qry = mysql_query($sql, $con);
   
  $row = mysql_fetch_array($qry);
   
  ?>
   
  echo $row["usuario"]; <BR>            
  <?echo $row["email"]; ?><BR>
  <?  echo $row["para"]; ?><BR>  
  <?  echo $row["assunto"]; ?><BR>
  <?  echo $row["msg"]; ?><BR>
  ...

Como vimos, não precisamos inicializar a variável $id, pois ela é associada automaticamente ao campo ID passado pela página principal. Nessa tela não precisamos fazer um loop, pois exibiremos apenas um registro da tabela.

Conclusão

Os códigos demonstrados no artigo foram simplificados ao máximo, pois o objetivo é apenas mostrar a conexão com o MySQL através do PHP. O sistema possui algumas funcionalidades mais elaboradas, que podem ser estudadas no código-fonte completo, disponível para download. O PHP é uma linguagem simples, eficiente, gratuita e, o que é mais importante, robusta. Além disso, existem milhares de sites que disponibilizam manuais e aplicações de exemplo escritas em PHP. Bons estudos!

Referências

Página oficial do PHPTriad
sourceforge.net/projects/phptriad

Página oficial do phpMyAdmin
www.phpmyadmin.net