blob: 00fb129ae80ace41910ce6a1249cd1cc8e8a16e4 [file] [log] [blame]
//
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
//
= Lição 2: Projetando a Aplicação. Lendo o Banco de Dados
:jbake-type: tutorial
:jbake-tags: tutorials
:jbake-status: published
:icons: font
:syntax: true
:source-highlighter: pygments
:toc: left
:toc-title:
:description: Lição 2: Projetando a Aplicação. Lendo o Banco de Dados - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, Lição 2: Projetando a Aplicação. Lendo o Banco de Dados
Nesta lição, você cria e configura o projeto PHP para desenvolver sua aplicação, cria uma lista de páginas na aplicação e define as relações entre eles. Também desenvolve a funcionalidade básica da aplicação e a testa contra os dados inseridos no banco de dados de amostra 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 caso a pessoa não esteja no banco de dados.
3. Exibe uma tabela dos desejos dessa pessoa.
O documento atual é uma parte do tutorial Criando uma Aplicação Orientada pelo 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 default. Para obter informações sobre como criar e configurar um projeto PHP, consulte link:project-setup.html[+Configurando um Projeto PHP+].
== Definindo um Diagrama de Fluxo de Página
O escopo da sua aplicação 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 wisher.
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 é usada para fazer log-in, registrar e alternar para as listas de desejos de outros usuários.
2. A página wishlist.php para exibir a lista de desejos de um wisher.
3. A página createNewWisher.php para registro como um wisher.
4. A página editWishList.php para editar uma lista de desejos pelo proprietário.
5. A página editWish.php para criar e editar desejos.
image::images/page-flow-diagram.png[]
Agora que finalizou as etapas preliminares, você pode começar a implementar a funcionalidade básica da sua aplicação. Comece visualizando a lista de desejos de um wisher. Esta funcionalidade não envolve quaisquer validações e pode ser testada facilmente, já que você já indicou os dados de teste no banco de dados. A funcionalidade será implementada em duas páginas, index.php e wishlist.php.
== Adicionando um Form a um index.php
O arquivo index.php não conterá códigos PHP, portanto, você poderá remover facilmente o seguinte bloco:
O arquivo ``index.php`` é usado para dois propósitos:
* Exibir 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`` , no qual, na próxima seção, você criará e escreverá os códigos.
Essas ações são realizadas por meio de um form HTML. Cada form HTML contém:
* Um conjunto de campos que corresponde aos controles na página.
* A ação que é executada depois que o usuário envia os dados do form. A ação é representada pelo caminho à página que processa os dados.
*Para adicionar um form 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 inserção dos códigos HTML e PHP.
NOTE: você pode ignorar as advertências do validador HTML.
[start=2]
. Remova o bloco PHP. O arquivo index.php não conterá códigos PHP.
image::images/remove-php-block.png[]
[start=3]
. Abra a Paleta no menu Janela ou pressione Ctrl-Shift-8.
[start=4]
. Na seção *Forms HTML* da Paleta, arraste e solte um Form na seção <body> do ``index.php`` .
image::images/form-dnd.png[]
[start=5]
. A Caixa de Diálogo Inserir Form abre. No campo Ação, digite o caminho até o arquivo para o qual o form transferirá dados. Nesse caso, digite ``wishlist.php`` . (Você criará esse arquivo no mesmo local que o ``index.php`` . Consulte <<createNewFile,Criando wishlist.php e Testando a Aplicação>>.) Selecione o método GET para a transferência de dados. Dê um nome arbitrário ao form, como ``wishList`` . Clique em OK quando acabar.
image::images/insert-form-dialog.png[]
O arquivo agora tem a seguinte aparência:
image::images/blank-form.png[]
[start=6]
. Entre os identificadores de abertura e fechamento do form, digite o texto Show wish list of: ”.
[start=7]
. Arraste um componente de Entrada de Texto da seção *Forms HTML* da Paleta até o espaço após o texto Show wish list of: ”. A caixa de diálogo Inserir Texto abre.
[start=8]
. Nomeie a entrada como ``user`` . Selecione o tipo de entrada ``text`` . Deixe todos os outros campos vazios e clique em OK.
image::images/insert-text-input.png[]
O arquivo agora tem a seguinte aparência:
image::images/form-with-text-input.png[]
[start=9]
. Adicione uma linha em branco acima da tag </form>. Nessa linha em branco, arraste e solte um componente Botão da seção *Forms HTML* da Paleta.
[start=10]
. A caixa de diálogo Inserir Botão abre. Digite ``Go`` no campo Label e clique em OK.
image::images/insert-button-dialog.png[]
[start=11]
. Agora, o form se parece com o código abaixo, com uma única diferença. No código abaixo, o atributo ``method`` está explícito na tag <form>. O NetBeans IDE não adicionou o atributo method ao seu form, pois o GET é o valor default desse atributo. Entretanto, você pode entender o código com mais facilidade se o atributo ``method`` estiver explícito.
[source,xml]
----
<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 form:
* A tag de abertura <form> contém o atributo ``action`` . O atributo action especifica o arquivo para o qual o form transferirá dados. Nesse caso, o arquivo se chama ``wishlist.php`` e está na mesma pasta que o ``index.php`` . (Você criará esse arquivo na seção <<createNewFile,Criando wishlist.php e Testando a Aplicação>>.)
* A tag de abertura <form> também contém o método a ser aplicado para a transferência de dados (GET). O PHP usa um array ``$_GET`` ou ``$_POST`` para os valores passados pelo form, dependendo do valor do atributo ``method`` . Nesse caso, o PHP usa ``$_GET`` .
* Um componente de entrada de ``texto`` . Esse componente é um campo de texto usado para inserir o nome do usuário cuja lista de desejos você deseja exibir. 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 um array para os valores do campo. Nesse caso, o array para os valores desse campo é ``htmlentities($_GET["user"])`` .
* Um componente de entrada ``submit`` com o valor Ir”. O tipo "submit" significa que o campo de entrada aparece na página como um botão. O valor Ir é o label do botão. Quando o usuário clica no botão, os dados no componente ``texto`` são transferidos para o arquivo especificado no atributo ``action`` .
== Criando wishlist.php e Testando a Aplicação
Em <<transferDataFromIndexToWishlist,Adicionando um Form ao index.php>>, foi criado um form no qual o usuário envia o nome de alguém cuja lista de desejos o usuário deseja ver. O nome é passado para a página ``wishlist.php`` . Entretanto, essa página não existe. Se você executar o ``index.php`` , ocorrerá um erro 404: File Not Found ao enviar um nome. Nesta seção, você criará a página ``wishlist.php`` e testará a aplicação.
*Para criar a wishlist.php e testar a aplicação:*
1. Dentro do projeto lista de desejos que você criou, clique com o botão direito do mouse no nó dos arquivos de código-fonte e, no menu de contexto, selecione Novo > Página Web PHP. O assistente Nova Página Web de PHP é aberto.
2. Digite ``wishlist`` no campo Nome do Arquivo e pressione Finalizar.
3. Clique com o botão direito do mouse no nó Código-fonte e selecione Executar Projeto no menu de contexto ou clique no ícone Executar Projeto Principal image:images/run-main-project-button.png[]na barra de ferramentas, caso você tenha definido o seu projeto como Principal.
image::images/index-php-works.png[]
[start=4]
. Na lista de desejos Mostrar : caixa de edição, digite Tom e clique em Ir. Uma página vazia com a seguinte URL aparecerá: http://localhost:90/Lesson2/wishlist.php?user=tom. Esse URL indica que a sua página principal funciona corretamente.
== Estabelecendo a Conexão e Obtendo o Wisher ID
Nesta seção, você primeiro adiciona o código ao arquivo ``wishlist.php`` que cria uma conexão ao banco de dados. Em seguida, adiciona o código para recuperar o número do wisher ID cujo nome foi digitado no form ``index.php`` .
1. Clique duas vezes no arquivo wishlist.php. O modelo que se abre é diferente do index.php. Comece e termine o arquivo com as tags <html></html> e <body></body>, já que o arquivo também conterá um código HTML.
[source,php]
----
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title></title>
</head>
<body>
<?php
// put your code here
?>
</body>
</html>
----
[start=2]
. Para exibir o título, digite o seguinte bloco de código imediatamente depois da tag de abertura <body>, antes da tag <?php gerada:
[source,php]
----
Wish List of <?php echo htmlentities($_GET["user"])."<br/>";?>
----
O código agora tem a seguinte aparência:
[source,php]
----
<body>Wish List of <?php echo htmlentities($_GET["user"])."<br/>";?><?php// put your code here</body>
----
O bloco de código PHP exibe os dados recebidos usando o método GET no campo "user". Esses dados são transferidos do ``index.php`` onde o nome do proprietário da lista de desejos Tom foi inserido no campo de texto "user". Repita as etapas de <<createNewFile,Testando index.php>> para ver se o wishlist.php funciona corretamente.
image::images/wishlist-php-title-works.png[]
[start=3]
. Delete 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:*
[source,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');
----
*Para o banco de dados Oracle:*
[source,php]
----
$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 banco de dados Oracle:* Pode ser preciso 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 snippet de código é “localhost/XE” para seguir essa sintaxe.
NOTE: É possível usar a funcionalidade autocompletar código do NetBeans IDE para as funções mysqli ou OCI8.
image::images/codecompletion.png[]image::images/codecompletion-oci.png[]
[start=4]
. Abaixo do código para abrir a conexão ao banco de dados, no mesmo bloco PHP, digite ou cole o código a seguir. Esse código recupera o wisher ID cuja lista tenha sido solicitada. Se o wisher 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:*
[source,php]
----
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`` )
[source,php]
----
$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 " . $user . " is not found. Please check the spelling and try again" );
}
$wisherID = $row['ID'];
oci_free_statement($stid);
----
Os dados são selecionados no banco de dados ``wishlist`` usando a conexão $con. O critério de seleção é o nome recebido do 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 os casos, você extrai uma linha como o resultado da consulta executada e extrai o valor da linha ID, armazendo-o na variável ``$wisherID`` .
Por último, você libera o resultado da mysqli ou a instrução do OCI8. É necessário liberar todos 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 o ``$con`` não for mais utilizá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 link:http://en.wikipedia.org/wiki/SQL_injection[+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 por meio de variáveis de bind.
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:
[source,php]
----
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());
}//set the default client character set
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:
[source,php]
----
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);//Because user is a unique value I only expect one row
$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 a aplicação e inserir um usuário inválido, a mensagem seguinte aparecerá.
image::images/wishlist-php-title-user-not-found-works.png[]
== Exibindo uma Tabela de Desejos
Nessa seção, você pode adicionar o código que exibe uma tabela HTML dos desejos associados ao wisher. O wisher é identificado pelo ID recuperada 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."
[source,xml]
----
<table border="black">
<tr>
<th>Item</th>
<th>Due Date</th>
</tr>
</table>
----
A tag </table> fecha a tabela.
[start=2]
. Insira o seguinte bloco de código PHP acima da tag de fechamento </table>.
*Para o banco de dados MySQL:*
[source,php]
----
<?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:*
[source,php]
----
<?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 whisher especificado por seu ID, que foi recuperada na etapa 4, e armazena os desejos e as datas de vencimento em um array $result.
* Um loop exibe os itens do array $result como linhas na tabela enquanto o array não está vazio.
* As linhas do form das tags <tr></tr>, as células do form das tags <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 link:http://en.wikipedia.org/wiki/Cross-site_scripting[+scripts de site cruzados+].
* As funções, no final, liberam todos os recursos (resultados do mysqli e instruçõ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 utilizá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 default.
[start=3]
. Para testar a aplicação, execute o projeto como descrito na seção <<createNewFile,Testando index.php>>.
image::images/wishlist-php-works.png[]
== O código-fonte da Aplicação após a Lição Atual está Concluído
Usuários MySQL: clique link:https://netbeans.org/files/documents/4/1928/lesson2.zip[+aqui+] para fazer o download do 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 link:https://netbeans.org/projects/www/downloads/download/php%252Foracle-lesson2.zip[+aqui+] para fazer o download do código-fonte que reflete o estado do projeto depois que a lição estiver concluída.
== Próxima Etapa
link:wish-list-lesson1.html[+<< Lição anterior+]
link:wish-list-lesson3.html[+Próxima lição >>+]
link:wish-list-tutorial-main-page.html[+Voltar à Página Principal do Tutorial+]