corner imagecorner image
IDEPlatformPluginsDocs & SupportCommunityPartners

Criando um aplicativo controlado por banco de dados com PHP

Lição 2: Projetando o aplicativo. Lendo do banco de dados

O conteúdo desta página se aplica ao IDE NetBeans 6.7-7.0

Nesta lição, você cria e configura o projeto PHP para desenvolver seu aplicativo, cria uma lista de páginas no aplicativo e define as relações entre eles. Também desenvolve uma funcionalidade básica do aplicativo e a testa em relação aos dados inseridos no banco de dados de amostra na lição 1.

O código PHP escrito nesta lição realiza as seguintes funções:

1. Obtém o nome de uma pessoa que o usuário digita.

2. Verifica se tal pessoa está realmente no banco de dados. Exibe uma mensagem de erro caso a pessoa não esteja no banco de dados.

3. Exibe uma tabela com os desejos de tal pessoa.

O documento atual é uma parte do tutorial Criando um aplicativo CRUD no NetBeans IDE para PHP.


Criando um projeto PHP

Selecione Arquivo > Novo projeto (Ctrl-Shift-N). Crie um novo projeto PHP denominado "wishlist". Quando o projeto PHP é criado, ele contém o arquivo de índice index.php por padrão. Para obter informações sobre como criar e configurar um projeto PHP, consulte Configurando um projeto PHP.

Definindo um diagrama de fluxo de página

O escopo do seu aplicativo cobre os seguintes casos de uso:
  1. O usuário visualiza a lista de desejos de uma pessoa.
  2. O usuário se registra como um novo criador de lista de desejos.
  3. O usuário se conecta e cria sua lista de desejos.
  4. O usuário se conecta e edita sua lista de desejos.
Para cobrir esta funcionalidade básica, você precisará implementar os seguintes arquivos PHP:
  1. A página "inicial" index.php para fazer logon, registrar e alternar para as listas de desejos de outros usuários.
  2. A página wishlist.php para visualizar a lista de desejos de um criador de lista de desejos.
  3. A página createNewWisher.php para se registrar como um criador de lista de desejos.
  4. A página editWishList.php para editar uma lista de desejos por seu proprietário.
  5. A página editWish.php para criar e editar desejos.
O diagrama mostra as alternâncias planejadas entre as páginas em vários casos de uso

Agora que terminou as etapas preliminares, você pode começar a implementar a funcionalidade básica do seu aplicativo. Comece visualizando a lista de desejos de um criador de lista de desejos. Este recurso não envolve quaisquer validações e podem ser testado facilmente já que você já indicou os dados de teste no banco de dados. A funcionalidade do recurso será implementada em duas páginas, index.php e wishlist.php.

Adicionando um formulário a index.php

O arquivo index.php não conterá qualquer código PHP, portanto, você pode remover facilmente o seguinte bloco:

O arquivo index.php é usado para duas finalidades:

  • Exibir uma página com controles para indicar dados.
  • Transferir os dados introduzidos a outro arquivo PHP, no qual os dados são processados. Neste tutorial, os dados são transferidos para um arquivo denominado wishlist.php, que será criado e codificado na próxima seção.

Essas ações são realizadas através de um formulário HTML. Cada formulário HTML contém:

  • Um conjunto de campos que corresponde aos controles na página.
  • A "ação" realizada depois que o usuário envia os dados no formulário. A ação é representada pelo caminho para a página que processa os dados.

Para adicionar um formulário ao index.php:

  1. Alterne para a janela Projetos, expanda o nó do projeto e o nó Arquivos de código-fonte, e clique duas vezes no arquivo index.php. O arquivo index.php se abre na área do editor principal do IDE. O arquivo contém um modelo para a indicação do código HTML e PHP.

    Nota: você pode ignorar os avisos do validador HTML.

    Começar a trabalhar com index.php.
  2. Remova o bloco PHP. O arquivo index.php não conterá nenhum código PHP.
    Um bloco PHP vazio que pode ser removido
  3. Inserira o seguinte elemento dentro do elemento <head>, se não estiver presente. Este elemento permite que o formulário utilize os caracteres UTF-8 internacionais.
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  4. Abra a Paleta no menu Janela ou pressionando Ctrl-Shift-8.
  5. Na seção Formulários HTML da Paleta, arraste e solte um formulário dentro da seção <body> de index.php.
    Arrastando e soltando um elemento Formulário HTML da Paleta no corpo do index.php
  6. A caixa de diálogo Inserir formulário se abre. No campo Ação, digite o caminho para o arquivo para o qual o formulário transferirá os dados. Neste caso, digite em wishlist.php. (Você criará este arquivo no mesmo local de index.php. Consulte Criando wishlist.php e testando o aplicativo.) Selecione o método GET para a transferência dos dados. Dê um nome arbitrário ao formulário, como wishList. Clique em OK quando tiver acabado.
    Caixa de diálogo Inserir formulário preenchida

    O arquivo agora tem a seguinte aparência:

    index.php com um formulário adicionado, sem conteúdo no formulário
  7. Entre as marcas de abertura e fechamento do formulário, digite o seguinte texto "Show wish list of: (Mostrar lista de desejos de:)".
  8. Arraste o componente Entrada de texto da seção Formulários HTML da Paleta para o espaço após o texto "Mostrar lista de desejos de: ". A caixa de diálogo Inserir entrada de texto se abre.
  9. Chame a entrada de user. Selecione o tipo de entrada text. Deixe todos os outros campos vazios e clique em OK.
    Formulário Inserir texto preenchido

    O arquivo agora tem a seguinte aparência:

    index.php com formulário de entrada de texto
  10. Adicione uma linha em branco acima da marca </form>. Dentro desta linha em branco, arraste e solte um componente Botão da seção Formulários HTML da Paleta.
  11. A caixa de diálogo Inserir botão se abre. Digite Go (Ir) no campo Rótulo e clique em OK.
    Caixa de diálogo Inserir botão preenchida
  12. O formulário se parece agora ao código abaixo, com uma diferença. No código abaixo, o atributo method é explícito na marca <form>. O NetBeans IDE não adicionou o atributo method ao seu formulário porque GET é o valor padrão deste atributo. No entanto, é mais fácil entender o código se o atributo method é explícito.
    <form action="wishlist.php" method="GET" name="wishList">
    Show wish list of: <input type="text" name="user" value=""/>
    <input type="submit" value="Go" />
    </form>

Observe os seguintes elementos do formulário:

  • A marca <form> de abertura contém o atributo de ação. O atributo de ação especifica o arquivo para o qual o formulário transfere os dados. Neste caso, o arquivo é chamado de wishlist.php e está na mesma pasta que index.php. (Você criará este arquivo na seção Criando wishlist.php e testando o aplicativo.)
  • A marca <form> de abertura também contém o método que será aplicado para a transferência de dados (GET). O PHP utiliza uma matriz $_GET ou $_POST para os valores passados por este formulário dependendo do valor do atributo method. Neste caso, o PHP utiliza $_GET.
  • Um componente de entrada text. Este componente é um campo de texto para indicar o nome do usuário cuja lista de desejos você deseja visualizar. A valor inicial do campo de texto é uma string vazia. O nome deste campo é user. O PHP utiliza o nome do campo ao criar uma matriz para os valores do campo. Neste caso, a matriz dos valores deste campo é $_GET["user"].
  • Um componente de entrada submit com o valor "Go" (Ir). O tipo "submit" significa que o campo de entrada aparece na página como um botão. O campo do valor para o qual os dados são transferidos no momento exato em que este controle tem efeito.

Criando wishlist.php e testando o aplicativo

Em Adicionando um formulário ao index.php você criou um formulário no qual o usuário envia o nome de alguém cuja lista de desejos ele deseja ver. O nome é passado para a página wishlist.php. No entanto, esta página não existe. Se executar index.php, ocorrerá o erro "404: File Not Found" (404: arquivo não encontrado) quando o nome for enviado. Nesta seção, você cria wishlist.php e depois testa o aplicativo.

Para criar wishlist.php e testar o aplicativo:

  1. No projeto "wishlist" criado, clique com o botão direito do mouse no nó dos arquivos de código-fonte e, no menu de contexto, escolha Novo > Página da Web PHP. O assistente Nova página da Web PHP se abre.
  2. Digite wishlist no campo Nome do arquivo e pressione Finalizar.
    Painel Novo arquivo PHP
  3. Clique com o botão direito do mouse no nó Códigos-fonte e escolha Executar projeto no menu de contexto ou clique no ícone Executar projeto principal O botão Executar projeto principal na barra de ferramentas: uma seta triangular verdena barra de ferramentas caso você tenha definido seu projeto como Principal.
    A página principal do aplicativo index.php com uma caixa de edição Mostrar lista de desejos de e um botão Ir
  4. Na caixa de texto Mostrar lista de desejos:, indique Tom e clique em Ir. Uma página vazia com a seguinte URL aparece: http://localhost:90/Lesson2/wishlist.php?user=tom. Essa URL indica que a sua página principal funciona corretamente.

Estabelecendo uma conexão e obtendo o ID do criador da wishlist

Nesta seção, primeiro você adiciona código a wishlist.php que cria uma conexão ao bando de dados. Depois, adiciona código para recuperar o número de ID do criador da lista de desejos cujo nome foi digitado no formulário index.php.

  1. Clique duas vezes no arquivo wishlist.php. O modelo que se abre é diferente de index.php. Comece e termine o arquivo com as marcas <html></html> e <body></body>, já que o arquivo conterá código HTML também.
    <html>
        <body>
            <?php
            /* 
             * To change this template, choose Tools | Templates
             * and open the template in the editor.
             */
    
            ?>
        </body>
    </html>
  2. Para exibir o título, indique o seguinte bloco de código imediatamente depois da marca de abertura <body>, antes da marca <?php gerada:
     Wish List of <?php echo $_GET["user"]."<br/>";?>

    O código agora tem a seguinte aparência:

    <html>
        <body>Wish List of <?php echo $_GET["user"]."<br/>";?>
    <?php
    /*
    * To change this template, choose Tools | Templates
    * and open the template in the editor.
    */ ?>
    </body></html>

    O bloco de código PHP exibe os dados recebidos através do método GET no campo "user". Esses dados são transferidos de index.php onde o nome do proprietário da lista de desejos Tom foi indicado no campo de texto "user". Repita as etapas de Testando index.php para ver se wishlist.php funciona corretamente.
    A página wishList.php mostra o texto Lista de desejos de Tom

  3. Exclua a seção comentada no bloco PHP do modelo. Em seu lugar, digite ou cole o seguinte código. Esse código abre a conexão ao banco de dados.

    No banco de dados MySQL:

    $con = mysqli_connect("localhost", "phpuser", "phpuserpw");
    if (!$con) {
    exit('Connect Error (' . mysqli_connect_errno() . ') '
    . mysqli_connect_error());
    }
    //set the default client character set
    mysqli_set_charset($con, 'utf-8');

    No banco de dados Oracle:

    $con = oci_connect("phpuser", "phpuserpw", "localhost/XE", "AL32UTF8");
    if (!$con) {
        $m = oci_error();
        exit('Connect Error ' . $m['message']);
    }

    O código tenta abrir uma conexão ao banco de dados e gera uma mensagem de erro, caso haja uma falha.

    Nota para os usuários do banco de dados Oracle: pode ser necessário alterar a conexão do banco de dados no comando oci_connect. A sintaxe padrão é "nome do host/nome do serviço". A fim de seguir tal sintaxe, a conexão a um banco de dados Oracle XE neste fragmento é "localhost/XE".

    Nota: é possível utilizar o autocompletar de código do NetBeans IDE para as funções mysqli ou OCI8.

    Autocompletar de código para chamadas do MySQLAutocompletar de código para chamadas do OCI8
  4. Abaixo do código para abrir a conexão ao banco de dados, no mesmo bloco PHP, digite ou cole o seguinte código. Esse código recupera o ID do criador da lista de desejos cuja lista tenha sido solicitada. Se o criador da lista de desejos não estiver no banco de dados, o código elimina/sai do processo e exibe uma mensagem de erro.

    No banco de dados MySQL:

    mysqli_select_db($con, "wishlist");
    $user = mysqli_real_escape_string($con, $_GET["user"]);
    $wisher = mysqli_query($con, "SELECT id FROM wishers WHERE name='" . $usuário . "'");
    if (mysqli_num_rows($wisher) < 1) { exit("The person " . $_GET["user"]. " is not found. Please check the spelling and try again" ); }
    $row = mysqli_fetch_row($wisher);
    $wisherID = $row[0];
    mysqli_free_result($wisher);

    No banco de dados Oracle: (Observe que o oci8 não tem um equivalente a mysqli_num_rows)

    $query = "SELECT id FROM wishers WHERE NAME = :user_bv";
    $stid = oci_parse($con, $query);
    $user = $_GET['user'];
    
    oci_bind_by_name($stid, ':user_bv', $user);
    oci_execute($stid);
    
    //Because user is a unique value I only expect one row
    $row = oci_fetch_array($stid, OCI_ASSOC);
    if (!$row) {
        exit("The person " . $usuário . " is not found. Please check the spelling and try again" );
    }
    $wisherID = $row['ID'];
    oci_free_statement($stid);

    Os dados são selecionados do banco de dados wishlist através da conexão $con. O critério de seleção é o nome recebido de index.php como "user".

    A sintaxe de uma instrução SQL SELECT pode ser descrita brevemente da seguinte forma:

    • Depois de SELECT, especifique os campos dos quais você deseja obter os dados. Um asterisco (*) representa todos os campos.
    • Depois da cláusula FROM, especifique o nome da tabela da qual os dados devem ser recuperados.
    • A cláusula WHERE é opcional. Especifique as condições do filtro nela.

    A consulta mysqli retorna um objeto de resultado. O OCI8 retorna uma instrução executada. Em ambos casos, você procura uma linha no resultado da consulta executada e extrai o valor da linha do ID, armazenando-o na variável $wisherID.

    Por último, você libera o resultado do mysqli ou a instrução OCI8. É necessário liberar todos os recursos que utilizam uma conexão antes de que a conexão seja fisicamente fechada. Do contrário, o sistema interno de contagem de referência do PHP manterá aberta a conexão do banco de dados subjacente mesmo se $con não puder ser utilizado depois de uma chamada mysqli_close() ou oci_close().

    Observação de segurança: no MySQL, o parâmetro $_GET["user"] tem escape para evitar os ataques de injeção SQL. Consulte Wikipedia sobre injeções SQL e a documentação mysql_real_escape_string. Embora no contexto deste tutorial você não esteja correndo o risco de injeções SQL prejudiciais, recomendamos escapar as strings nas consultas MySQL que estariam correndo risco de tal ataque. O OCI8 evita que isso ocorra através das variáveis de ligação (Consulte as Perguntas frequentes do PHP Oracle, e procure por 'variável de ligação' e 'injeção').

Este bloco PHP agora está concluído. Se estiver utilizando um banco de dados MySQL, o arquivo wishlist.php tem a seguinte aparência:

Wish List of <?php echo $_GET["user"] . "<br/>"; ?>
<?php
$con = mysqli_connect("localhost", "phpuser", "phpuserpw"); if (!$con) { exit('Connect Error (' . mysqli_connect_errno() . ') ' . mysqli_connect_error()); }
//set the default client character set mysqli_set_charset($con, 'utf-8'); mysqli_select_db($con, "wishlist"); $user = mysqli_real_escape_string($con, $_GET["user"]); $wisher = mysqli_query($con, "SELECT id FROM wishers WHERE name='" . $usuário . "'"); if (mysqli_num_rows($wisher) < 1) { exit("The person " . $_GET["user"]. " is not found. Please check the spelling and try again"); } $row = mysqli_fetch_row($wisher); $wisherID = $row[0]; mysqli_free_result($wisher); ?>

Se estiver utilizando um banco de dados Oracle, o arquivo wishlist.php tem a seguinte aparência:

Wish List of <?php echo $_GET["user"] . "<br/>"; ?>
  <?php
  $con = oci_connect("phpuser", "phpuserpw", "localhost/XE", "AL32UTF8");
  if (!$con) {
     $m = oci_error();
     exit('Connect Error ' . $m['message'];
     exit;
  }
  $query = "SELECT id FROM wishers WHERE name = :user_bv";
  $stid = oci_parse($con, $query);
  $user = $_GET["user"];
  oci_bind_by_name($stid, ':user_bv', $user);
  oci_execute($stid);
//Because user is a unique value I only expect one row $row = oci_fetch_array($stid, OCI_ASSOC); if (!$row) { exit("The person " . $usuário . " is not found. Please check the spelling and try again" ); } $wisherID = $row["ID"]; oci_free_statement($stid); ?>

Se você testar o aplicativo e indicar um usuário inválido, a mensagem seguinte aparecerá.

A página wishlist.php mostra uma mensagem de erro: O usuário não foi encontrado

Exibindo uma tabela de desejos

Nesta seção, você adiciona o código que exibe uma tabela HTML dos desejos associados ao criador da lista de desejos. O criador da lista de desejos é identificado pelo ID recuperado do código da seção anterior.

  1. Abaixo do bloco PHP, digite ou cole o seguinte bloco de código HTML. Esse código abre uma tabela, especifica a cor de suas bordas (preto), e "desenha" o cabeçalho da tabela com as colunas "Item" e "Data de vencimento."
    <table border="black">
        <tr>
            <th>Item</th>
            <th>Due Date</th>
        </tr>
    </table>
    A marca </table> fecha a tabela.
  2. Indique o bloco de código PHP seguinte acima da marca de fechamento </table>.

    No banco de dados MySQL:

    <?php
    $result = mysqli_query($con, "SELECT description, due_date FROM wishes WHERE wisher_id=" . $wisherID);
    while ($row = mysqli_fetch_array($result)) {
    echo "<tr><td>" . htmlentities($row["description"]) . "</td>";
    echo "<td>". htmlentities($row["due_date"]) . "</td></tr>\n";
    }
    mysqli_free_result($result);
    mysqli_close($con);
    ?>

    No banco de dados Oracle:

    <?php
    $query = "SELECT description, due_date FROM wishes WHERE wisher_id = :id_bv";
    $stid = oci_parse($con, $query);
    oci_bind_by_name($stid, ":id_bv", $wisherID);
    oci_execute($stid);
    while ($row = oci_fetch_array($stid)) {
    echo "<tr><td>" . htmlentities($row["DESCRIPTION"]) . "</td>";
    echo "<td>". htmlentities($row["DUE_DATE"]) . "</td></tr>\n";
    }
    oci_free_statement($stid);
    oci_close($con);
    ?>

    Dentro do código:

    • A consulta SELECT recupera os desejos com suas datas de vencimento para o criador da lista de desejos especificado por seu ID, que foi recuperado na etapa 4, e armazena os desejos e as datas de vencimento em uma matriz $result.
    • Um loop exibe os itens da matriz $result como linhas na tabela enquanto a matriz não está vazia.
    • As linhas do formulário das marcas <tr></tr>, as células do formulário das marcas <td></td> nas linhas, e \n inicia uma nova linha.
    • A função htmlentities converte todos os caracteres que têm equivalências à entidade HTML em entidades HTML. Isso ajuda a impedir script entre sites.
    • As funções do final liberam todos os recursos (resultados do mysqli e instruções OCI8) e fecha a conexão ao banco de dados. Observe que é necessário liberar todos os recursos que utilizam uma conexão antes de que a conexão seja fisicamente fechada. Do contrário, o sistema interno de contagem de referência do PHP mantém aberta a conexão do banco de dados subjacente mesmo se a conexão não puder ser utilizada depois de uma chamada oci_close() ou mysqli_close().

    Aviso: certifique-se de digitar os nomes dos campos de banco de dados exatamente como eles são especificados durante a criação da tabela do banco de dados. No Oracle, por padrão, os nomes das colunas são retornados em maiúscula.

  3. Para testar o aplicativo, execute o projeto como descrito na seção Testando index.php.
    A página wishlist.php mostra uam lista dos desejos de Tom

O código-fonte do aplicativo após a lição atual está concluído

Usuários do MySQL: clique aqui para baixar o código-fonte que reflete o estado do projeto depois que a lição estiver concluída.

Usuários do banco de dados Oracle: clique aqui para baixar o código-fonte que reflete o estado do projeto depois que a lição estiver concluída.

Próxima etapa

<< Lição anterior

Próxima lição >>

Voltar à página principal do tutorial

Links úteis

Encontre aqui mais informações sobre o uso de HTML, PHP e os bancos de dados MySQL ou Oracle:



Para enviar comentários e sugestões, obter suporte e manter-se informado sobre os desenvolvimentos mais recentes dos recursos de desenvolvimento em PHP no NetBeans IDE, junte-se à lista de usuários .

Voltar à trilha do aprendizado PHP