Criando uma Aplicação Orientada pelo Banco de Dados com o PHP

Lição 7: Atualizando e Deletando Entradas no Banco de Dados

O conteúdo desta página se aplica ao NetBeans IDE 7.2, 7.3 e 7.4

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.

Fluxo do projeto PHP afetado na Lição 7

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 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 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:

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:
    while ($row = ...) {
    echo ...
    echo ...
    $wishID = $row["id"];
    } ?>
  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).
       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 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).
        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;.

        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:

    <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:

    <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:

<?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:

<?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 do 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:
<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:

    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:

    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:

    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:

    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çãoelse final. Esta é a instrução else que insere o desejo no banco de dados. Trocar para instrução else if:
    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:
    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, descriptione 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".
    O usuário se conecta ao editar sua lista de desejos
  2. Pressione o botão Editar Minha Lista de Desejos. A página editWishList.php abre.
    O botão Editar é adicionada à página <tt>editwishlist.php</tt>
  3. Clique em Editar ao lado de Icecream. A página editWish.php abre.
    A página <tt>editwish.php</tt> com um form para a edição de um desejo. Os campos são preenchidos com os dados do desejo.
  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.
    O form para edição do desejo mostra uma mensagem de erro: a descrição não foi preenchida
  6. Insira Chocolate Icecream no campo Descreva seu desejo e pressione Salvar Alterações. A página editWishList.php abre com uma lista atualizada.
    Página editwishlist.php: a opção updatedwish está na lista

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:

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

    Para o banco de dados Oracle:

    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?>:
    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).
        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:

<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:

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

Página editwishlist.php: o desejo foi deletado

O código-fonte da Aplicação após a Lição Atual está Concluído

Usuários MySQL: clique 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 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

<< Lição anterior

Próxima lição >>

Voltar à página principal do 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, junte-se à lista de correspondência .

Voltar à Trilha de Aprendizado PHP

get support for the NetBeans

Support


By use of this website, you agree to the NetBeans Policies and Terms of Use. © 2013, Oracle Corporation and/or its affiliates. Sponsored by Oracle logo