corner imagecorner image
IDEPlatformPluginsDocs & SupportCommunityPartners

Criando um aplicativo direcionado a banco de dados com o PHP

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

O conteúdo desta página se aplica ao NetBeans IDE 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 a funcionalidade básica do aplicativo e a testa contra os dados inseridos no exemplo de banco de dados na lição 1.

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

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

2. Verifica se a pessoa realmente está no banco de dados. Fecha com uma mensagem de erro se a pessoa não está no banco de dados.

3. Exibe uma tabela dos desejos dessa pessoa.

O documento atual é uma parte do tutorial Criando um aplicativo orientado a banco de dados no NetBeans IDE para PHP.


Criando um projeto PHP

Selecione Arquivo > Novo projeto (Ctrl-Shift-N no Linux e Windows, ⌘-Shift-N no MacOS). Crie um novo projeto PHP chamado “wishlist” (lista de desejos). Quando você cria um projeto PHP, ele contém o arquivo index 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 essa 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 um 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 dois propósitos:

  • Exibindo uma página com controles para indicar dados.
  • Transferir os dados inseridos a outro arquivo PHP, onde os dados serão processados. Neste tutorial, os dados são passados para um arquivo chamado wishlist.php, que, na próxima seção, você cria e escreve os códigos.

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” que é executada após o usuário enviar os dados do formulário. A ação é representada pelo caminho à página que processa os dados.

Para adicionar um formulário ao index.php:

  1. Alterne para a janela Projetos, expanda o nó do seu projeto e o nó de 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.

    Observação: 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á qualquer código PHP.
    Um bloco PHP vazio que pode ser removido
  3. Insira o seguinte elemento dentro do elemento <head>, isso se já não estiver presente. Esse elemento ativa o formulário para usar caracteres internacionais em UTF-8.
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  4. Abra a Paleta no menu Janela ou pressione Ctrl-Shift-8.
  5. Na seção Formulários HTML da Paleta, arraste e solte um Formulário na seção <body> do index.php.
    Arrastando e soltando um elemento de formulário HTML da Paleta no corpo do index.php
  6. A caixa de diálogo Inserir formulário é aberta. No campo Ação, insira o caminho até o arquivo para o qual o formulário transferirá dados. Nesse caso, digite no wishlist.php. (Você criará esse arquivo na mesma localização que o index.php. Consulte Criando wishlist.php e testando o aplicativo.) Selecione o método GET para transferir dados. Dê um nome arbitrário ao formulário, como wishList. Clique em OK quando tiver acabado.
    Formulário Inserir diálogo, preenchido

    O arquivo agora tem a seguinte aparência:

    index.php com um formulário adicionado, nenhum conteúdo no formulário
  7. Entre os identificadores de abertura e fechamento do formulário, digite o texto “Show wish list of: ”.
  8. Arraste um componente de Entrada de texto da seção Formulários HTML da Paleta até o espaço após o texto “Show wish list of: ”. A caixa de diálogo Entrada de texto é aberta.
  9. Chame a entrada de user. Selecione o tipo de entrada text. Deixe todo os outros campos vazios e clique em OK.
    Caixa de diálogo Inserir entrada de texto

    O arquivo agora tem a seguinte aparência:

    index.php com formulário de entrada de texto
  10. Adicione uma linha em branco acima do identificador </form>. Nessa 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 é aberta. Digite Go no campo Rótulo e clique em OK.
    Caixa de diálogo Inserir botão, preenchida
  12. Agora, o formulário se parece com o código abaixo, com uma única diferença. No código abaixo, o atributo method está explícito no identificador <form>. O NetBeans IDE não adicionou o atributo method ao seu formulário, pois GET é o valor padrão desse atributo. Entretanto, você pode entender o código com mais facilidade se o atributo method está 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:

  • O identificador de abertura <form> contém o atributo action. O atributo action especifica o arquivo para o qual o formulário transferirá dados. Nesse caso, o arquivo se chama wishlist.php e está na mesma pasta que index.php. (Você criará esse arquivo na seção Criando wishlist.php e testando o aplicativo.)
  • O identificador de abertura <form> também contém o método a ser aplicado para a transferência de dados (GET). O PHP usa uma matriz $_GET ou $_POST para os valores passados por esse formulário, dependendo do valor do atributo method. Nesse caso, o PHP usa $_GET.
  • Um componente de entrada text. Esse componente é um campo de texto usado para inserir o nome do usuário cuja lista de desejos você deseja visualizar. O valor inicial do campo de texto é uma sequência de caracteres vazia. O nome desse campo é user. O PHP usa o nome do campo ao criar uma matriz para os valores do campo. Nesse caso, a matriz para os valores desse campo é htmlentities($_GET["user"]).
  • Um componente de entrada submit com o valor “Go”. O tipo "submit" significa que o campo de entrada aparece na página como um botão. O valor “Go” é o rótulo do botão. Quando o usuário clica no botão, os dados no componente text são transferidos para o arquivo especificado no atributo action.

Criando wishlist.php e testando o aplicativo

Em Adicionando um formulário ao index.php, foi criado um formulário no qual o usuário envia o nome de alguém cuja lista de desejos o usuário quer ver. O nome é passado para a página wishlist.php. Entretanto, essa página não existe. Se você executar index.php, um erro 404: File Not Found será recebido ao enviar um nome. Nesta seção, você criará a página wishlist.php e testará o aplicativo.

Para criar wishlist.php e testar o aplicativo:

  1. Dentro do projeto “wishlist” que você criou, clique com o botão direito do mouse no nó dos arquivos de código-fonte e, no menu de contexto, escolha Novo > Arquivo PHP. O assistente para Novo arquivo PHP é aberto.
  2. Digite wishlist no campo Nome do arquivo e pressione Terminar.
    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 a conexão e obtendo o ID do criador de lista de desejos

Nesta seção, você primeiro adiciona o código ao arquivo wishlist.php que cria uma conexão ao banco de dados. Então, adiciona o código para recuperar o número do ID do criador de lista de desejos cujo nome foi digitado no formulário do 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 htmlentities($_GET["user"])."<br/>";?>

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

    <html>
        <body>Wish List of <?php echo htmlentities($_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 no código a seguir. Esse código abre a conexão ao banco de dados.

    Para o banco de dados MySQL:

    $con = mysqli_connect("localhost", "phpuser", "phpuserpw");
    if (!$con) {
    exit('Connect Error (' . mysqli_connect_errno() . ') '
    . mysqli_connect_error());
    }
    //definir o código de caracteres padrão do cliente
    mysqli_set_charset($con, 'utf-8');

    Para o 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.

    Observação para os usuários do Oracle Database: Vocês podem precisar alterar a conexão ao banco de dados no comando oci_connect. A sintaxe padrão é “nome do host/nome do serviço". A conexão ao banco de dados Oracle XE nesse fragmento de código é “localhost/XE” para seguir essa sintaxe.

    Observação: É possível usar o preenchimento automático de códigos do NetBeans IDE para as funções mysqli ou OCI8.

    Preenchimento automático de código para chamadas MySQLPreenchimento automático de código para chamadas 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 terminará o processo, ou sairá dele, e exibirá uma mensagem de erro.

    Para o banco de dados MySQL:

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

    Para o banco de dados Oracle: (Observe que o oci8 não tem um equivalente para 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);
    
    //Por user ser um valor exclusivo, eu espero somente uma linha
    $row = oci_fetch_array($stid, OCI_ASSOC);
    if (!$row) {
        exit("The person " . $user . " 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 declaração executada. Em ambos os casos, é esperado uma linha como o resultado da consulta executada e o valor da linha ID é extraído, sendo armazenado na variável $wisherID.

    Por último, você libera o resultado da mysqli ou a declaração do OCI8. É necessário liberar os recursos que usam uma conexão antes que a conexão seja fisicamente fechada. Do contrário, o sistema interno de refcounting do PHP continuará mantendo a conexão do banco de dados subjacente aberta, mesmo se $con não for mais usável seguindo a chamada mysqli_close() ou oci_close().

    Observação de segurança: Para MySQL, o parâmetro htmlentities($_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 isso através de variáveis de vínculo (Consulte Perguntas frequentes de PHP da Oracle, pesquise por “variable bind” e “injection”).

Este bloco PHP agora está concluído. Se você estiver usando um banco de dados MySQL, o arquivo wishlist.php se parecerá com o seguinte:

Wish List of <?php echo htmlentities($_GET["user"]) . "<br/>"; ?>
<?php
$con = mysqli_connect("localhost", "phpuser", "phpuserpw"); if (!$con) { exit('Connect Error (' . mysqli_connect_errno() . ') ' . mysqli_connect_error()); }
//define o conjunto caracteres padrão do cliente mysqli_set_charset($con, 'utf-8'); mysqli_select_db($con, "wishlist"); $user = mysqli_real_escape_string($con, htmlentities($_GET["user"])); $wisher = mysqli_query($con, "SELECT id FROM wishers WHERE name='" . $user . "'"); if (mysqli_num_rows($wisher) < 1) { exit("The person " . htmlentities($_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 você estiver usando um banco de dados Oracle, o arquivo wishlist.php se parecerá com o seguinte:

Wish List of <?php echo htmlentities($_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 = htmlentities($_GET["user"]);
  oci_bind_by_name($stid, ':user_bv', $user);
  oci_execute($stid);
//Pois user é um valor exclusivo que, eu espero somente uma linha $row = oci_fetch_array($stid, OCI_ASSOC); if (!$row) { exit("The person " . $user . " 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

Nessa seção, é criado o código que exibe uma tabela HTML dos desejos associados com o criador da lista de desejos. O criador da lista de desejos é identificado pelo ID recuperado no 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 seguinte bloco de código PHP acima do indicador de fechamento </table>.

    Para o 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);
    ?>

    Para o 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 tenham a entidade HTML equivalentes às entradas HTML. Isso ajuda a prevenir scripts de site cruzados.
    • As funções, no final, liberam todos os recursos (resultados da mysqli e declarações do OCI8) e fecha a conexão ao banco de dados. Observe que é necessário liberar os recursos que usam uma conexão antes que a conexão possa ser fisicamente fechada. Do contrário, o sistema interno de refcounting do PHP manterá a conexão do banco de dados subjacente aberta, mesmo se a conexão não for mais usável seguindo a chamada oci_close() ou mysqli_close().

    Cuidado: Certifique-se de digitar os nomes dos campos de banco de dados exatamente como eles foram especificados durante a criação da tabela do banco de dados. Para Oracle, os nomes das colunas são retornados com letras maiúsculas por padrão.

  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 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 de 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 mais informações sobre o uso de HTML, PHP e MySQL ou Oracle Database aqui:



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