// 
//     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.
//

= Criando uma Aplicação Orientada pelo Banco de Dados com o PHP
:jbake-type: tutorial
:jbake-tags: tutorials 
:jbake-status: published
:icons: font
:syntax: true
:source-highlighter: pygments
:toc: left
:toc-title:
:description: Criando uma Aplicação Orientada pelo Banco de Dados com o PHP - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, Criando uma Aplicação Orientada pelo Banco de Dados com o PHP

= Lição 6: Adicionado um Novo Desejo ao 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 6: Adicionado um Novo Desejo ao Banco de Dados - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, Lição 6: Adicionado um Novo Desejo ao Banco de Dados


Nesta lição, você expande a funcionalidade da aplicação com duas funcionalidades:


Para implementar essa funcionalidade, edite o arquivo  `editWishList.php`  e crie um novo arquivo  `editWish.php` .

image::images/page-flow-diagram-l6.png[]

O documento atual é uma parte do tutorial Criando uma Aplicação CRUD no NetBeans IDE para PHP.


[[_application_source_code_from_the_previous_lesson]]
== Código-fonte da Aplicação da Lição Anterior

Usuários MySQL: clique link:https://netbeans.org/files/documents/4/1931/lesson5.zip[+aqui+] para fazer o download do código-fonte que reflete o estado do projeto depois que a lição anterior for concluída.

Usuários do banco de dados Oracle: clique link:https://netbeans.org/projects/www/downloads/download/php%252Foracle-lesson5.zip[+aqui+] para fazer o download do código-fonte que reflete o estado do projeto depois que a lição anterior for concluída.

[[_submitting_a_new_wish]]
== Enviando um Novo Desejo

O usuário envia um novo desejo nas seguintes etapas:

1. O usuário faz log-in, alterna para a página  `editWishList.php`  e pressiona o botão Adicionar Desejo. A página  `editWish.php`  abre, exibindo um form HTML.
2. No form HTML, o usuário insere uma descrição de um desejo e, possivelmente, a data quando deseja recebê-lo e pressiona o botão Salvar Alterações.
3. Se um form for enviado sem uma descrição do desejo, o usuário retorna ao form para tentar novamente. Caso o usuário tenha enviado uma data de vencimento mas nenhuma descrição, essa data é exibida novamente quando o form é recarregado.

Para ativar esse procedimento para o usuário, adicione a seguinte funcionalidade à aplicação:

* <<add-wish-ui-elements,Componentes da interface do usuário>>, consistindo em um form HTML para adicionar desejos e um botão em  `editWishList.php ` que redireciona o usuário para o form.
* Código para <<_redisplaying_the_due_date_after_an_unsuccessful_submission,reexibir a data de vencimento>> se um form incompleto for enviado.


[[add-wish-ui-elements]]
=== Adicionando os Componentes da Interface do Usuário

*Para adicionar funcionalidade para a adição um novo desejo:*

1. Implementar o botão Adicionar Desejo. No arquivo  `editWishList.php` , adicione o seguinte código HTML abaixo do bloco PHP:

[source,xml]
----

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    </head>
    <body>
        <form name="addNewWish" action="editWish.php">            
            <input type="submit" value="Add Wish">
        </form>
    </body>
</html>
----

*Observação:* você pode ignorar as advertências do validador HTML.

O form contém um campo de entrada "Adicionar Desejo" do tipo  `submit` . Este campo implementa o botão "Adicionar desejo". Quando o usuário clica em Adicionar Desejo, ele é redirecionado para a página  `editWish.php` . Como nenhum dado é transferido usando esse form, nenhum método de Solicitação do Servidor é usado.


[start=2]
. Adicione uma tabela acima do form addNewWish que exibe os desejos existentes para o wisher. O código é semelhante ao código  `wishlist.php` .

*Para o banco de dados MySQL:*


[source,php]
----

<table border="black">
    <tr>
        <th>Item</th>
        <th>Due Date</th>
    </tr>
    <?php
    $result = WishDB::getInstance()->get_wishes_by_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);
    ?>
</table>
----

*Para o banco de dados Oracle:*


[source,php]
----

<table border="black">
    <tr>
        <th>Item</th>
        <th>Due Date</th>
    </tr>
    <?php
    $stid = WishDB::getInstance()->get_wishes_by_wisher_id($wisherID);
    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);
    ?>
</table>
----

[start=3]
. Crie o arquivo PHP  `editWish.php`  na pasta Código-fonte.

[start=4]
. Em  `editWish.php` , implemente o form Adicionar Desejo. Digite ou cole o seguinte código abaixo do bloco <? php?>:

[source,xml]
----

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>
    <head>

        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    </head>
    <body>
        <form name="editWish" action="editWish.php" method="POST">
            Describe your wish: <input type="text" name="wish"  value="" /><br/>
            When do you want to get it? <input type="text" name="dueDate" value=""/><br/>
            <input type="submit" name="saveWish" value="Save Changes"/>
            <input type="submit" name="back" value="Back to the List"/>
        </form>
    </body>
</html> 
----

O form Adicionar Desejo contém:

* Dois campos de texto vazios para inserção da descrição e a data de vencimento do desejo.
* Textos a serem impressos ao lado dos campos de entrada.
* Um campo  `submit`  que representa um botão Salvar Alterações
* Um campo  `submit`  que representa um botão Voltar à Lista para retornar à página  `editWishList.php` 

Quando o botão Adicionar Desejo é pressionado, o form envia os dados inseridos para a mesma página,  `editWish.php` , usando o método de Solicitação POST.

[[_redisplaying_the_due_date_after_an_unsuccessful_submission]]
=== Reexibindo a Data de Vencimento Após um Envio Malsucedido

Se o usuário não preencher uma descrição no form Adicionar Desejo, uma mensagem de erro é exibida e o usuário retorna à página  `editWish.php` . Quando o usuário retorna ao  `editWish.php` , o form Adicionar Desejo deve mostrar o valor de  `dueDate`  caso ele tenha sido inserido. Na implementação atual do form, ambos os campos estão sempre vazios. Para manter os valores inseridos, você precisa salvar os dados do novo desejo em um array. O array consistirá em dois elementos chamados  `description`  e  `due-date` . Em seguida, você precisa alterar o form Adicionar Desejo, para que ele recupere o valor do campo  `dueDate`  do array.

*Observação:* O código que recarrega o form de entrada, caso nenhuma descrição tenha sido inserida, é incluído no <<_verifying_the_wisher_s_logon,código que valida os dados e insere-os no banco de dados>>. Esse código não é descrito nesta seção. O código desta seção preserva somente o valor de  `dueDate`  para que ele seja exibido se o form for recarregado.

*Para reexibir o form de entrada depois que o usuário o envia sem êxito:*

1. Digite ou cole o bloco de código seguinte dentro do elemento HTML <body> de  `editWish.php` , diretamente acima do form de entrada:

[source,php]
----

<?php
if ($_SERVER['REQUEST_METHOD'] == "POST")
    $wish = array("description" => $_POST['wish'],
                        "due_date" => $_POST['dueDate']);
else
    $wish = array("description" => "",
                        "due_date" => "");
?>
----

O código verifica qual método de Solicitação de Servidor foi usado para transferir os dados e cria um array chamado $wish. Se o método for POST, o que significa que o form de entrada é exibido depois de uma tentativa malsucedida de salvar um desejo com uma descrição vazia, os elementos  `description`  e  `due_date`  aceitam os valores transferidos pelo POST.

Se o método não for POST, o que significa que o form de entrada é exibido pela primeira vez depois do redirecionamento do form para a página  `editWishList.php` , os elementos  `description`  e  `due_date`  ficam vazios.

*Observação:* Em ambos os casos a descrição fica vazia. Há diferença apenas em  `dueDate` .


[start=2]
. Atualize o form Adicionar Desejo para que os valores de seus campos de entrada sejam recuperados do array  `$wish` . Substitua as linhas no form Adicionar Desejo:

[source,php]
----

Describe your wish: <input type="text" name="wish"  value="" /><br/>
When do you want to get it? <input type="text" name="dueDate" value=""/><br/>
----
com:

[source,php]
----

Describe your wish: <input type="text" name="wish"  value="<?php echo $wish['description'];?>" /><br/>
When do you want to get it? <input type="text" name="dueDate" value="<?php echo $wish['due_date']; ?>"/><br/>
----

[[_verifying_the_wisher_s_logon]]
== Verificando o Log-in do Wisher

No arquivo  `editWish.php` , insira o seguinte código de manipulação de sessão dentro do bloco <? php?> na parte superior do arquivo:


[source,php]
----

session_start();
if (!array_key_exists("user", $_SESSION)) {
    header('Location: index.php');
    exit;
}
----

O código:

* Abre o array $_SESSION para recuperar dados.
* Verifica se o array $_SESSION contém um elemento com o identificador "user".
* Se a verificação falhar, o que significa que o usuário não está conectado, redireciona a aplicação para a página inicial index.php e cancela o processamento de PHP.

Para verificar se a manipulação da sessão funciona corretamente, execute o arquivo editWish.php no IDE. A página index.php é aberta, pois nenhum usuário foi transferido para o editWish.page usando uma sessão.


[[insert-new-wish]]
== Inserindo o Novo Desejo no Banco de Dados

Depois que o usuário envia um novo desejo, a aplicação precisa adicionar o desejo ao banco de dados "desejos". Para ativar essa funcionalidade, adicione o seguinte código à aplicação:

* Adicione mais duas funções auxiliares à classe  `WishDB`  em  `db.php` .
* Uma função adiciona um novo registro à tabela de desejos.
* A outra função converte as datas para o formato aceito pelo servidor de bancos de dados MySQL.
* Adicione o código ao  `editWish.php` , que usará as novas funções auxiliares em  `WishDB`  para inserir o novo desejo no banco de dados.


[[add-insert-wish]]
=== Adicionando a função insert_wish ao WishDB

Essa função requer o wisher ID, uma descrição do novo desejo e a data de vencimento do desejo como parâmetros de entrada e insere esses dados no banco de dados em um novo registro. A função não retorna valores.

Abra o  `db.php `  e adicione a função  `insert_wish`  na classe  `WishDB ` :

*Para o banco de dados MySQL*


[source,php]
----

function insert_wish($wisherID, $description, $duedate) {
    $description = $this->real_escape_string($description);
    if ($this->format_date_for_sql($duedate)==null){
       $this->query("INSERT INTO wishes (wisher_id, description)" .
            " VALUES (" . $wisherID . ", '" . $description . "')");
    } else
        $this->query("INSERT INTO wishes (wisher_id, description, due_date)" .
            " VALUES (" . $wisherID . ", '" . $description . "', "
            . $this->format_date_for_sql($duedate) . ")");
}
----

*Para o banco de dados Oracle:*


[source,php]
----

function insert_wish($wisherID, $description, $duedate) {
    $query = "INSERT INTO wishes (wisher_id, description, due_date) VALUES (:wisher_id_bv, :desc_bv, to_date(:due_date_bv, 'YYYY-MM-DD'))";
    $stid = oci_parse($this->con, $query);
    oci_bind_by_name($stid, ':wisher_id_bv', $wisherID);
    oci_bind_by_name($stid, ':desc_bv', $description);
    oci_bind_by_name($stid, ':due_date_bv', $this->format_date_for_sql($duedate));
    oci_execute($stid);
    oci_free_statement($stid);
}
----

O código chama a função format_date_for_sql para converter a data de vencimento inserida para um formato que pode ser processado pelo servidor do banco de dados. Em seguida, a consulta INSERT INTO wishes (wisher_id, description, due_date) é executada para inserir o novo desejo no banco de dados.


[[add-format-date-for-sql]]
=== Adicionando a função format_date_for_sql ao WishDB

Adicione a função  `format_date_for_sql`  à classe  `WishDB`  em  `db.php` . A função exige uma string com uma data como parâmetro de entrada. A função retorna uma data no formato que pode ser processado pelo servidor de banco de dados ou  `null`  se a string de entrada estiver vazia.

*Observação:* a função nesse exemplo usa a função  `date_parse`  PHP. Essa função funciona apenas com datas em Inglês, como December 25, 2010 e apenas com algarismos arábicos. Um site profissional deve usar um selecionador de data.

*Para o banco de dados MySQL:*


[source,php]
----

function format_date_for_sql($date) {
    if ($date == "")
        return null;
    else {
        $dateParts = date_parse($date);
        return $dateParts["year"] * 10000 + $dateParts["month"] * 100 + $dateParts["day"];
    }
}
----

*Para o banco de dados Oracle:*


[source,php]
----

function format_date_for_sql($date) {
    if ($date == "")
        return null;
    else {
        $dateParts = date_parse($date);
        return $dateParts['year'] * 10000 + '-' + $dateParts['month'] * 100 + '-' + $dateParts['day'];
    }
}
----

Se a string de entrada estiver vazia, o código retorna NULL (nulo). Caso contrário, a função  `date_parse`  interna é chamada com  `$date`  como parâmetro de entrada. A função  `date_parse`  retorna um array que consiste em três elementos chamados  `$dateParts["ano"]` ,  `$dateParts["mês"]`  e  `$dateParts["dia"]` . A string de saída final é construída com base nos elementos do array  `$dateParts` .

*Importante:* a função  `date_parse`  reconhece apenas datas em Inglês. Por exemplo, faz parsing para "February 2, 2016" mas não para "2 Unora, 2016".

*Observação para usuários do banco de dados Oracle: * o único formato necessário é que o formato da data na instrução  `return $dateParts...`  coincida com o formato da data na função SQL  `to_date`  na consulta  `insert_wish` .


[[validateAndEnterWishToDatabase]]
=== Inserindo o Registro do Novo Desejo no Banco de Dados

Agora que você desenvolveu as funções auxiliares, adicione o código para validar os novos dados do desejo e insira os dados para o banco de dados, se eles forem válidos. Se os dados não forem válidos, o código deve recarregar o form Adicionar Desejo. Se os dados forem inválidos porque nenhuma descrição foi inserida, mas existe uma data de vencimento, a data de vencimento é salva e reexibida quando o form é recarregado, graças ao código que você <<_returning_to_the_front_index_php_page,desenvolveu anteriormente>>.

Insira o código seguinte no bloco <? php?> de  `editWish.php` , abaixo do código de tratamento de sessão:


[source,php]
----

require_once("Includes/db.php");
$wisherID = WishDB::getInstance()->get_wisher_id_by_name($_SESSION['user']);

$wishDescriptionIsEmpty = false;
if ($_SERVER['REQUEST_METHOD'] == "POST"){
    if (array_key_exists("back", $_POST)) {
        header('Location: editWishList.php' ); 
        exit;
    } else
    if ($_POST['wish'] == "") {
        $wishDescriptionIsEmpty =  true;
    } else {
        WishDB::getInstance()->insert_wish($wisherID, $_POST['wish'], $_POST['dueDate']);
        header('Location: editWishList.php' );
        exit;
    }
}
  
----

O código realiza as seguintes funções:

* Permite o uso do arquivo  `db.php` 
* Obtém ou cria uma instância da classe  `WishDB` 
* Recupera o wisher ID que está tentando adicionar um desejo chamando a função  `get_wisher_id_by_name` 
* Inicializa o flag  `$wishDescriptionIsEmpty` , que será usado mais tarde para mostrar mensagens de erro.
* Verifica se o método de Solicitação é POST, o que significa que os dados foram enviados do form para inserir os dados do desejo na própria página  `editWish.php` .
* Verifica se o array  `$_POST`  contém um elemento com a chave "back"

Se o array  `$_POST`  contém um elemento com a chave "back", o botão Voltar à Lista foi pressionado antes de o form ser enviado. Nesse caso, o código redireciona o usuário para o  `editWishList.php`  sem salvar os dados que foram inseridos nos campos e para o processamento de PHP.

Se o array $_POST _não_ contiver um elemento com a chave "back", é porque os dados foram enviados quando o botão Salvar Alterações foi pressionado. Nesse caso, o código valida se a descrição do desejo está preenchida. O código faz isso, verificando se o elemento com a chave "wish" no array $_POST está vazio e, se a chave estiver vazia, altera o flag $wishDescriptionIsEmpty para verdadeiro. Observe que como nenhum código adicional é executado no bloco PHP, o form Adicionar Desejo é recarregado.

Se o botão Voltar à Lista não foi pressionado e a descrição do desejo foi preenchida, o código chama a função  `insert_wish`  com o wisher ID e a data de vencimento do desejo como os parâmetros de entrada. Em seguida, o código redireciona o usuário para a página  `editWishList.php`  e para o processamento de PHP.

[[_displaying_error_messages]]
=== Exibindo Mensagens de Erro

Se o usuário tentar salvar um desejo mas não tiver inserido uma descrição para ele, deve ser exibida uma mensagem de erro.
Insira o seguinte bloco <? php?> dentro do form de entrada HTML, abaixo do campo de entrada "Descreva seu desejo":


[source,php]
----

<?php
if ($wishDescriptionIsEmpty)
    echo "Please enter description<br/>";
?>
----

A mensagem de erro será exibida se o flag  `$wishDescriptionIsEmpty`  for verdadeira. O flag será processado durante a validação do form de entrada.

[[_returning_to_the_front_index_php_page]]
== Retornando à Página Inicial index.php

O usuário deve poder retornar à página inicial da aplicação a qualquer momento pressionando um botão. 
Para implementar essa funcionalidade, insira o seguinte form de entrada HTML no arquivo  `editWishList.php` , antes da tag de fechamento </body>:


[source,xml]
----

<form name="backToMainPage" action="index.php"><input type="submit" value="Back To Main Page"/></form>
----

O form redireciona o usuário para a página inicial index.php quando o botão Voltar à Página Principal é pressionado.

[[_testing_the_add_wish_functionality]]
== Testando a Funcionalidade Adicionar Desejo

1. Execute a aplicação. Na página  `index.php` , preencha os campos: no campo Nome do Usuário, insira "Tom", e no campo Senha, insira "tomcat".

image::images/user-logon-to-edit-wish-list.png[]


[start=2]
. Pressione o botão Editar Minha Lista de Desejos. A página  `editWishList.php`  abre. 
image::images/edit-wish-list-add-wish.png[]

[start=3]
. Pressione o botão Voltar à Página Principal. A página  `index.php`  abre.

[start=4]
. Faça log-in como Tom e pressione o botão Editar Minha Lista de Desejos novamente. A página  `editWishList.php`  abre.

[start=5]
. Pressione o botão Adicionar Desejo. A página  `editWish.php`  abre. Preencha o form.

image::images/new-wish.png[] 

Pressione o botão Voltar à Lista. A página  `editWishList.php`  abre, mas o desejo inserido não foi adicionado.

[start=6]
. Pressione o botão Adicionar Desejo novamente. A página  `editWish.php`  abre. Preencha a data de vencimento e deixe a descrição vazia. Pressione o botão Salvar Alterações. A página  `editWish.php`  exibe o form de entrada com uma mensagem de erro e a data de vencimento preenchida.

[start=7]
. Pressione o botão Adicionar Desejo novamente. A página  `editWish.php`  abre. Preencha o form e pressione o botão Salvar Alterações. A página  `editWishList.php`  mostra uma lista de desejos atualizada. 
image::images/edit-wish-list-updated.png[]

[[_application_source_code_after_the_current_lesson_is_completed]]
== 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/1932/lesson6.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 do banco de dados Oracle: clique link:https://netbeans.org/projects/www/downloads/download/php%252Foracle-lesson6.zip[+aqui+] para fazer o download do código-fonte que reflete o estado do projeto depois que a lição for concluída.

[[_next_steps]]
== Próximas Etapas

link:wish-list-lesson5.html[+<< Lição anterior+]

link:wish-list-lesson7.html[+Próxima lição >>+]

link:wish-list-tutorial-main-page.html[+Voltar à página principal do Tutorial+]


link:/about/contact_form.html?to=3&subject=Feedback:%20PHP%20Wish%20List%20CRUD%206:%20Writing%20New%20DB%20Entry[+Enviar Feedback neste Tutorial+]


Para enviar comentários e sugestões, obter suporte e manter-se informado sobre os desenvolvimentos mais recentes das funcionalidades de desenvolvimento PHP do NetBeans IDE, link:../../../community/lists/top.html[+junte-se à lista de correspondência users@php.netbeans.org+].

link:../../trails/php.html[+Voltar à Trilha do Aprendizado PHP+]

