// 
//     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 7: Atualizando e Deletando Entradas no 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 7: Atualizando e Deletando Entradas no Banco de Dados - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, Lição 7: Atualizando e Deletando Entradas no Banco de Dados


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


Para implementar essas funcionalidades, edite os arquivos  `editWishList.php`  e  `editWish.php` . Crie também um novo arquivo chamado  `deleteWish.php` .

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

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


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

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 anterior 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 anterior for concluída.


== Editando um Desejo

A funcionalidade suporta o seguinte caso de uso:

* Na página  `editWishList.php` , o usuário pressiona o botão Editar à direita de um desejo. A página  `editWish.php`  com os dados do desejo selecionado abre.
* O usuário altera a descrição e/ou a data de vencimento do desejo e pressiona o botão Salvar Alterações.
* Se a descrição _não_ for preenchida, uma mensagem de erro é exibida e o usuário retorna para a página  `editWish.php` .
* Se a descrição for preenchida, a aplicação retorna à página  `editWishList.php` , onde o desejo é atualizado.

A implementação consiste nas seguintes etapas:

* <<_implementing_the_edit_button,Adicionar um botão Editar na página editWishList>>
* <<_expanding_the_code_wish_code_array,Na página editWish.php, atualizar o array $wish para armazenar os dados do desejo>>
* <<_updating_the_html_input_form,Atualizar o form de entrada na página editWish.php>>
* <<_updating_the_wish_in_the_database,Validar os dados enviados e atualizar o desejo no banco de dados>>


=== Implementando o Botão Editar

Em  `editWishList.php` , uma tabela com os desejos de um wisher é implementada por um loop (uma instrução  `while` ) que exibe linhas com desejos enquanto os desejos são selecionados no banco de dados. Adicione um botão Editar como a célula da extrema direita em uma linha.

1. Para transferir o ID de um desejo usando o form de entrada HTML, armazene-o em uma variável. Insira a seguinte linha de código no fim do loop  `while` :

[source,php]
----
while ($row = mysqli_fetch_array($result)):
    echo "<tr><td>" . htmlentities($row['description']) . "</td>";
    echo "<td>" . htmlentities($row['due_date']) . "</td>";
    $wishID = $row['id'];
    echo "<td>WishID=" . $wishID . "</td>";
    //The loop is left open
    ?>
----
2. Implemente o botão Editar. Adicione outra célula à tabela antes de fechar a tag </table> com o form editWish. Esse form contém um componente botão e um componente oculto que envia o valor  `$wishID`  ao clicar no botão. (O código para o banco de dados MySQL é mostrado, mas o código adicionado é o mesmo, no mesmo local, para o banco de dados Oracle).

[source,php]
----

Hello <?php echo $_SESSION["user"]; ?><br/>
<table border="black">
    <tr><th>Item</th><th>Due Date</th></tr>
    <?php
    require_once("Includes/db.php");
    $wisherID = WishDB::getInstance()->get_wisher_id_by_name($_SESSION["user"]);
    $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);
    ?>
    <td>
        <form name="editWish" action="editWish.php" method="GET">
            <input type="hidden" name="wishID" value="<?php echo $wishID; ?>">
            <input type="submit" name="editWish" value="Edit">
        </form>
    </td>
</table>
----

3. Altere o loop  `while`  para usar a link:http://www.php.net/manual/en/control-structures.alternative-syntax.php[+sintaxe alternativa+]. Isso facilita a execução de blocos HTML dentro do loop  `while` . Na sintaxe alternativa do loop  `while` , as chaves de abertura { são substituídas por dois-pontos : e as chaves de fechamento } são substituídas pela instrução  `endwhile;` . Substitua as chaves de abertura por dois-pontos, delete as chaves de fechamento e adicione um novo bloco PHP antes da tag de fechamento </table> com a instrução  `endwhile;` . Isso incorpora a nova célula da tabela para o loop  `while` . Mova o código instrução livre/resultado para após a instrução  `endwhile.`  (O código para o MySQL é exibido novamente, mas o código muda e o local é o mesmo para o banco de dados da Oracle).

[source,php]
----

   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);
    ?>
    <td>
        <form name="editWish" action="editWish.php" method="GET">
           <input type="hidden" name="wishID" value="<?php echo $wishID; ?>">
           <input type="submit" name="editWish" value="Edit">
        </form>
    </td>
    <?php
    endwhile;
    mysqli_free_result($result);
    ?>
</table>
----
4. 
Conserte a sintaxe da linha da tabela. Mova os caracteres de final de linha </tr>\n da instrução de exibição de data de vencimento para a nova instrução logo acima do  `endwhile;` .


[source,php]
----

    while ($row = mysqli_fetch_array($result)):
        echo "<tr><td>" . htmlentities($row["description"]) . "</td>";
        echo "<td>" . htmlentities($row["due_date"]) . "</td></tr>\n";
    ?>
    <td>
        <form name="editWish" action="editWish.php" method="GET">
           <input type="hidden" name="wishID" value="<?php echo $wishID; ?>">
           <input type="submit" name="editWish" value="Edit">
        </form>
    </td>
    <?php
    echo "</tr>\n";
    endwhile;
    mysqli_free_result($result);
    ?>
</table>
----
5. 
A tabela inteira, incluindo o form com o botão Editar dentro do loop  `while ` , agora tem a seguinte aparência:

*Para o banco de dados MySQL:*


[source,php]
----

<table border="black">
    <tr><th>Item</th><th>Due Date</th></tr>
    <?php
    require_once("Includes/db.php");
    $wisherID = WishDB::getInstance()->get_wisher_id_by_name($_SESSION["user"]);
    $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>";
        $wishID = $row["id"];
    ?>
    <td>
        <form name="editWish" action="editWish.php" method="GET">
            <input type="hidden" name="wishID" value="<?php echo $wishID; ?>"/>
            <input type="submit" name="editWish" value="Edit"/>
        </form>
    </td>
    <?php
    echo "</tr>\n";
    endwhile;
    mysqli_free_result($result);
    ?>
</table>
----

*Para banco de dados Oracle:*


[source,php]
----

<table border="black">
    <tr><th>Item</th><th>Due Date</th></tr>
    <?php
    require_once("Includes/db.php");
    $wisherID = WishDB::getInstance()->get_wisher_id_by_name($_SESSION["user"]);
    $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>";
        $wishID = $row["ID"];
    ?>
    <td>
        <form name="editWish" action="editWish.php" method="GET">
            <input type="hidden" name="wishID" value="<?php echo $wishID; ?>"/>
            <input type="submit" name="editWish" value="Edit"/>
        </form>
    </td>
    <td>
        <form name="deleteWish" action="deleteWish.php" method="POST">
            <input type="hidden" name="wishID" value="<?php echo $wishID; ?>"/>
            <input type="submit" name="deleteWish" value="Delete"/>
        </form>
    </td>
    <?php
    echo "</tr>\n";
    endwhile;
    oci_free_statement($stid);
   ?>
</table>
----


=== Expandindo o Array  `$wish` 

Quando o botão Editar é pressionado na página  `editWishList.php` , o wisher ID selecionado é transferido para a página  `editWish.php`  usando o método de Solicitação de Servidor GET. Para armazenar o wisher ID, você precisa adicionar um novo elemento ao array  `$wish` .

Como acontece quando um novo desejo é adicionado, o form de entrada pode ser acessado da página  `editWishList.php`  e da página  `editWish.php`  após uma tentativa malsucedida de salvar. Os casos são distinguidos pelo método de Solicitação de Servidor por meio do qual os dados são transferidos. O GET indica que o form é exibido quando o usuário chega pela primeira vez à página, pressionando Editar Desejo. O POST indica que o usuário é redirecionado para o form após tentar salvar um desejo sem uma descrição.

Em  `editWish.php` , substitua o bloco PHP na tag HTML <body> acima do form de entrada  `EditWish`  com o código expandido para o array  `$wish` .

*Para o banco de dados MySQL:*


[source,php]
----

<?php
if ($_SERVER["REQUEST_METHOD"] == "POST")
    $wish = array("id" => $_POST["wishID"], "description" => 
            $_POST["wish"], "due_date" => $_POST["dueDate"]);
else if (array_key_exists("wishID", $_GET))
    $wish = mysqli_fetch_array(WishDB::getInstance()->get_wish_by_wish_id($_GET["wishID"]));
else
    $wish = array("id" => "", "description" => "", "due_date" => "");
?>
----

*Para o banco de dados Oracle:*


[source,php]
----

<?php
if ($_SERVER["REQUEST_METHOD"] == "POST")
    $wish = array("id" => $_POST["wishID"], "description" =>
                $_POST["wish"], "due_date" => $_POST["dueDate"]);
else if (array_key_exists("wishID", $_GET)) {
    $stid = WishDB::getInstance()->get_wish_by_wish_id($_GET["wishID"]);
    $row = oci_fetch_array($stid, OCI_ASSOC);
    $wish = array("id" => $row["ID"], "description" =>
                $row["DESCRIPTION"], "due_date" => $row["DUE_DATE"]);
    oci_free_statement($stid);
} else
    $wish = array("id" => "", "description" => "", "due_date" => "");
?>
----

O código inicializa o array  `$wish`  com três elementos:  `id` ,  `description`  e  `due_date` . Os valores desses elementos dependem do método de Solicitação de Servidor. Se o método de Solicitação de Servidor for POST, os valores serão recebidos do form de entrada. Caso contrário, se o método de Solicitação de Servidor for GET e o array $_GET contiverem um elemento com a chave "wishID", os valores serão recuperados do banco de dados pela função get_wish_by_wish_id. Finalmente, se o método de Solicitação do Servidor não for POST nem GET, o que significa que o caso de uso Adicionar Novo Desejo acontece, os elementos ficam vazios.

O código precedente cobre os casos de criação e edição de desejos. Agora você precisa atualizar o form de entrada para que ele possa ser usado por ambos os casos.


=== Atualizando o Form de Entrada HTML

Atualmente, o form de entrada funciona quando você quer criar um novo desejo e não há id de desejo. Para que o form funcione ao editar um desejo existente, é necessário adicionar um campo oculto para transferir o ID de um desejo. O valor do campo oculto deve ser recuperado no array $wish. O valor deve ser uma string vazia durante a criação de um novo desejo. Se o desejo for editado, o valor do campo oculto deve ser alterado para o wisher ID. Para criar esse campo oculto, adicione a linha seguinte à parte superior do form de entrada  `EditWish`  em  `editWish.php` :

[source,php]
----

<input type="hidden" name="wishID" value="<?php echo  `$wish` ["id"];?>" />
----


=== Atualizando o Desejo no Banco de Dados

Agora você precisa atualizar o código que verifica os dados de entrada e insere o desejo no banco de dados. O código atual não distingue entre a criação de um novo caso de desejo e a atualização de um existente. Na implementação atual, um novo registro sempre é adicionado ao banco de dados porque o código não verifica o valor do wisher ID transferido do form de entrada.

Você precisa adicionar as seguintes funções:

* Se o elemento transferido "wishID" for uma string vazia, crie um novo desejo.
* Caso contrário, se o elemento "wishID" não for uma string vazia, atualize o desejo.

*Para atualizar o editWish.php para que ele verifique se um desejo é novo e atualizá-lo caso não seja novo:*

1. Adicione a função  `update_wish`  ao  `db.php` .

*Para o banco de dados MySQL:*


[source,php]
----

public function update_wish($wishID, $description, $duedate) {
    $description = $this->real_escape_string($description);
    if ($duedate==''){
        $this->query("UPDATE wishes SET description = '" . $description . "',
            due_date = NULL WHERE id = " . $wishID);
    } else
        $this->query("UPDATE wishes SET description = '" . $description .
            "', due_date = " . $this->format_date_for_sql($duedate)
            . " WHERE id = " . $wishID);
}
----
*Para o banco de dados Oracle:*


[source,php]
----

public function update_wish($wishID, $description, $duedate) {
    $query = "UPDATE wishes SET description = :desc_bv, due_date = to_date(:due_date_bv, 'YYYY-MM-DD') 
                WHERE id = :wish_id_bv";
    $stid = oci_parse($this->con, $query);
    oci_bind_by_name($stid, ':wish_id_bv', $wishID);
    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);

}
----
2. 
Adicione a função  `get_wish_by_wish_id`  ao  `db.php` .

*Para o banco de dados MySQL:*


[source,php]
----

public function get_wish_by_wish_id ($wishID) {
    return $this->query("SELECT id, description, due_date FROM wishes WHERE id = " . $wishID);
}
----

*Para o banco de dados Oracle:*


[source,php]
----

public function get_wish_by_wish_id($wishID) {
    $query = "SELECT id, description, due_date FROM wishes WHERE id = :wish_id_bv";
    $stid = oci_parse($this->con, $query);
    oci_bind_by_name($stid, ':wish_id_bv', $wishID);
    oci_execute($stid);
    return $stid;
}
----
3. Na parte principal, no bloco PHP superior do  `editWish.php` , adicione uma condição para a instrução`else` final. Esta é a instrução  `else`  que insere o desejo no banco de dados. Trocar para instrução  `else if` :

[source,php]
----

else if ($_POST["wishID"]=="") {
    WishDB::getInstance()->insert_wish($wisherID, $_POST["wish"], $_POST["dueDate"]);
    header('Location: editWishList.php' );
    exit;
}
----
4. Digite ou cole outra instrução  `else if`  abaixo daquela que você acabou de editar:

[source,php]
----

else if ($_POST["wishID"]!="") {
    WishDB::getInstance()->update_wish($_POST["wishID"], $_POST["wish"], $_POST["dueDate"]);
    header('Location: editWishList.php' );
    exit;
} 
----

O código verifica se o elemento  `wishID`  no array  `$_POST`  não é uma string vazia, o que significa que o usuário foi redirecionado da página  `editWishList.php` , pressionando o botão Editar, e se o usuário preencheu a descrição do desejo. Se a verificação for bem-sucedida, o código chamará a função  `update_wish`  com os parâmetros de entrada  `wishid` ,  `description` e  `duedate. ` Esses parâmetros são recebidos do form de entrada HTML usando o método post. Depois que o  `update_wish`  for chamado, a aplicação será redirecionada para a página  `editWishList.php`  e o processamento de PHP será cancelado.


== Testando a Funcionalidade Editar Desejo

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

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

2. Pressione o botão Editar Minha Lista de Desejos. A página  `editWishList.php`  abre.

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

3. Clique em Editar ao lado de Icecream. A página  `editWish.php`  abre.

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

4. Edite os campos e pressione Voltar à Lista. A página  `editWishList.php`  abre, mas as alterações não são salvas.
5. Pressione Editar ao lado de Icecream. Limpe o campo Descreva seu desejo e pressione Salvar Alterações. Uma mensagem de erro é exibida.

image::images/editWishEmptyDescription.png[]

6. Insira Chocolate Icecream no campo Descreva seu desejo e pressione Salvar Alterações. A página  `editWishList.php`  abre com uma lista atualizada.

image::images/editWishListWishAdded.png[]


== Deletando um Desejo

Agora que você pode criar, ler e editar desejos, adicione um método para deletar um desejo.

*Para permitir que o usuário delete desejos:*

1. Adicione uma função ` delete_wish`  ao  `db.php` .

*Para o banco de dados MySQL:*


[source,php]
----

function delete_wish ($wishID){
    $this->query("DELETE FROM wishes WHERE id = " . $wishID);
}

----

*Para o banco de dados Oracle:*


[source,php]
----

public function delete_wish($wishID) {
    $query = "DELETE FROM wishes WHERE id = :wish_id_bv";
    $stid = oci_parse($this->con, $query);
    oci_bind_by_name($stid, ':wish_id_bv', $wishID);
    oci_execute($stid); 
}
----
2. Crie um novo arquivo PHP chamado  `deleteWish.php`  e insira o seguinte código no <? php?>:

[source,php]
----

require_once("Includes/db.php");
WishDB::getInstance()->delete_wish ($_POST["wishID"]);
header('Location: editWishList.php' );
----
O código permite o uso do arquivo  `db.php` . Em seguida, ele chama a função  `delete_wish`  a partir de uma instância do WishDB, com o  `wishID`  como o parâmetro de entrada. Finalmente, a aplicação é redirecionada para a página  `editWishList.php` .
3. Para implementar o botão Deletar, adicione outra célula da tabela ao loop  `while`  no  `editWishList.php` , diretamente abaixo do código do bloco para o botão  `editWish` . O form de entrada HTML contém um campo oculto para  `wishID`  e um botão de envio chamado Deletar. (O código para o banco de dados MySQL é mostrado, mas o código adicionado é o mesmo, no mesmo local, para o banco de dados Oracle).

[source,php]
----

    while ($row = mysqli_fetch_array($result)):
        echo "<tr><td>" . htmlentities($row["description"]) . "</td>";
        echo "<td>" . htmlentities($row["due_date"]) . "</td></tr>\n";
    ?>
    <td>
        <form name="editWish" action="editWish.php" method="GET">
           <input type="hidden" name="wishID" value="<?php echo $wishID; ?>">
           <input type="submit" name="editWish" value="Edit">
        </form>
    </td>
    <td>
        <form name="deleteWish" action="deleteWish.php" method="POST">
            <input type="hidden" name="wishID" value="<?php echo $wishID; ?>"/>
            <input type="submit" name="deleteWish" value="Delete"/>
        </form>
    </td>
    <?php
    echo "</tr>\n";
    endwhile;
    mysqli_free_result($result);
    ?>
</table>
----

A tabela inteira, incluindo o form com o botão Editar dentro do loop  `while ` , agora tem a seguinte aparência:

*Para o banco de dados MySQL:*


[source,php]
----

<table border="black">
    <tr><th>Item</th><th>Due Date</th></tr>
    <?php
    require_once("Includes/db.php");
    $wisherID = WishDB::getInstance()->get_wisher_id_by_name($_SESSION["user"]);
    $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>";
        $wishID = $row["id"];
    ?>
    <td>
        <form name="editWish" action="editWish.php" method="GET">
            <input type="hidden" name="wishID" value="<?php echo $wishID; ?>"/>
            <input type="submit" name="editWish" value="Edit"/>
        </form>
    </td>
    <td>
        <form name="deleteWish" action="deleteWish.php" method="POST">
            <input type="hidden" name="wishID" value="<?php echo $wishID; ?>"/>
            <input type="submit" name="deleteWish" value="Delete"/>
        </form>
    </td>
    <?php
    echo "</tr>\n";
    endwhile;
    mysqli_free_result($result);
    ?>
</table>
----

*Para banco de dados Oracle:*


[source,php]
----

<table border="black">
    <tr><th>Item</th><th>Due Date</th></tr>
    <?php
    require_once("Includes/db.php");
    $wisherID = WishDB::getInstance()->get_wisher_id_by_name($_SESSION["user"]);
    $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>";
        $wishID = $row["ID"];
    ?>
    <td>
        <form name="editWish" action="editWish.php" method="GET">
            <input type="hidden" name="wishID" value="<?php echo $wishID; ?>"/>
            <input type="submit" name="editWish" value="Edit"/>
        </form>
    </td>
    <td>
        <form name="deleteWish" action="deleteWish.php" method="POST">
            <input type="hidden" name="wishID" value="<?php echo $wishID; ?>"/>
            <input type="submit" name="deleteWish" value="Delete"/>
        </form>
    </td>
    <?php
    echo "</tr>\n";
    endwhile;
    oci_free_statement($stid);
   ?>
</table>
----


== Testando a Funcionalidade Deletar Desejo

Para verificar se a funcionalidade foi implementada corretamente, pressione Deletar ao lado de qualquer item na página  `editWishList.php` . O item não está mais na lista.

image::images/deleteWish.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/1933/lesson7.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-lesson7.zip[+aqui+] para fazer o download do código-fonte que reflete o estado do projeto depois que a lição for concluída.


== Próximas Etapas

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

link:wish-list-lesson8.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%207:%20Updating%20and%20Deleting%20DB%20Entries[+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 de Aprendizado PHP+]

