corner imagecorner image
IDEPlatformPluginsDocs & SupportCommunityPartners

Создание приложений под управлением базы данных на PHP

Урок 7: Обновление и удаление записей в базе данных

Содержимое этой страницы относится к среде IDE NetBeans 6.9-7.0

В этом уроке функциональные возможности приложения будут расширены двумя компонентами:

Для реализации этих компонентов необходимо изменить файлы editWishList.php и editWish.php. Кроме того, будет создан новый файл deleteWish.php.

Ход выполнения проекта PHP в ходе урока 7

Текущий документ является частью учебного курса "Создание приложения типа CRUD в среде IDE NetBeans для PHP".


Исходный код приложения из предыдущего урока

Для пользователей MySQL: щелкните эту ссылку для загрузки исходного кода, описывающего состояние проекта на момент завершения предыдущего урока.

Для пользователей базы данных Oracle: щелкните эту ссылку для загрузки исходного кода, описывающего состояние проекта на момент завершения предыдущего урока.

Редактирование пожелания

Функциональные возможности поддерживают следующий вариант использования:
  • На странице editWishList.php пользователь нажимает кнопку "Edit" справа от пожелания. Откроется страница editWish.php с данными выбранного пожелания.
  • Пользователь изменяет описание и/или срок выполнения пожелания, а затем нажимает кнопку "Save Changes".
  • Если описание не заполнено, то выводится сообщение об ошибке, после чего выполняется возврат к странице editWish.php.
  • Если описание заполнено, то выполняется возврат к странице editWishList.php, на которой можно обновить данные пожелания.

Реализация состоит из следующих действий:

Реализация кнопки "Edit"

Таблица editWishList.php (таблица, включающая все пожелания, созданные пользователем) реализуется с помощью цикла (оператор while), который выводит на экран строки с пожеланиями, в то время как пожелания выбираются из базы данных. Добавьте кнопку "Edit" как крайнюю правую ячейку в ряду.

  1. Для обеспечения передачи идентификатора пожелания посредством формы ввода HTML он должен быть сохранен в виде переменной. Введите следующую строку кода в конце цикла while :
    while ($row = ...) {
    echo ...
    echo ...
    $wishID = $row["id"];
    } ?>
  2. Реализуйте кнопку "Edit" . Добавьте еще одну ячейку таблицы с формой editWish перед закрывающим тегом </table>. Эта форма содержит компонент кнопки и скрытый компонент, который отправляет значение $wishID при нажатии кнопки. Здесь показан код для базы данных MySQL, но для базы данных 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. Измените синтаксис цикла while на альтернативный синтаксис. Это облегчает выполнение блоков HTML внутри цикла while. В альтернативном синтаксисе цикла while открывающая фигурная скобка "{" заменяется на двоеточие ":", а закрывающая фигурная скобка "}" заменяется на оператор endwhile;. Замените открывающую фигурную скобку двоеточием, удалите закрывающую фигурную скобку и добавьте новый блок PHP перед закрывающим тегом </table> с оператором endwhile;. После этого новая ячейка таблицы будет вставлена в цикл while. Поместите код после оператора endwhile;. Здесь показан код для базы данных MySQL, но для базы данных 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. Исправьте синтаксис строк таблицы. Переместите закрывающие строку теги </tr>\n из оператора echo для срока выполнения в новый оператор echo перед оператором 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. Код для таблицы, включая форму с кнопкой "Edit", в цикле while выглядит следующим образом:

    Для базы данных 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>

    Для базы данных 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>

Расширение массива $wish

После нажатия кнопки "Edit" на странице editWishList.php идентификатор выбранного пожелания передается на страницу editWish.php с использованием метода запроса к серверу "GET". Для сохранения идентификатора пожелания следует добавить новый элемент к массиву $wish.

Так же, как и при добавлении нового пожелания, в случае неудачной попытки сохранения можно перейти в форму ввода может как со страницы editWishList.php, так и со страницы editWish.php. Отличие между вариантами заключается в методе запроса к серверу, посредством которого осуществляется передача данных. Метод "GET" указывает, что форма отображается при первом переходе пользователя на эту страницу при нажатии на кнопку "Edit Wish". Метод "POST" указывает на то, что пользователь был перенаправлен в форму после попытки сохранить пожелание без описания.

Откройте файл editWish.php и замените блок PHP в элементе HTML <body> над формой ввода EditWish расширенным кодом для массива $wish.

Для базы данных 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" => "");
? >

Для базы данных 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" => "");
?>

Код инициализирует массив $wish с тремя элементами – id, description и due_date. Значения этих элементов зависят от метода запроса к серверу. Если используется метод запроса к серверу "POST", то значения извлекаются из формы ввода. В противном случае, если используется метод запроса к серверу "GET", и при этом массив "$_GET" содержит элемент с ключом "wishID", значения извлекаются из базы данных функцией "get_wish_by_wish_id". Наконец, если не используется ни один из методов запроса ("POST" или "GET"), то это означает вариант добавления нового пожелания, т.е. что элементы пусты.

Указанный код включает все варианты создания и редактирования желаний. Теперь следует обновить код формы ввода таким образом, чтобы она подходила для обоих вариантов.

Обновление формы ввода HTML

В настоящее время форма ввода позволяет создавать новое пожелание при отсутствии у него идентификатора. Чтобы обеспечить работу формы при редактировании существующего пожелания, необходимо добавить скрытое поле для передачи идентификатора пожелания. Значение скрытого поля извлекается из массива $wish. На этапе создания нового пожелания значению должна соответствовать пустая строка. При редактировании пожелания значение скрытого поля должно измениться на идентификатор пожелания. Для создания этого скрытого поля следует добавить следующую строку в начале кода EditWish формы ввода в файле editWish.php:
<input type="hidden" name="wishID" value="<?php echo $wish["id"];?>" />

Обновление пожелания в базе данных

Теперь необходимо обновить код, который проверяет входные данные и вставляет пожелание в базу данных. Текущий код не различает варианты создания нового пожелания и обновления существующего. В текущей реализации к базе данных в любом случае добавляется новая запись, так как код не проверяет значение идентификатора пожелания, передаваемого из формы ввода.

Необходимо добавить следующие функции:

  • Если передаваемый элемент "wishID" является пустой строкой, то должно быть создано новое пожелание.
  • В противном случае, если элемент "wishID" не является пустой строкой, то пожелание должно быть обновлено.

Для обновления файла editWish.php для выполнения проверки того, является ли пожелание новым или требуется его обновить, необходимо выполнить следующее:

  1. Добавьте функцию update_wish к db.php.

    Для базы данных 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);
    }

    Для базы данных 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. Добавьте функцию get_wish_by_wish_id к db.php.

    Для базы данных MySQL:

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

    Для базы данных 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. В основном (верхнем) блоке PHP файла editWish.php добавьте условие к последнему оператору else. Этот оператор else вставляет пожелание в базу данных. Замените его на оператор else if:
    else if ($_POST["wishID"]=="") {
    WishDB::getInstance()->insert_wish($wisherID, $_POST["wish"], $_POST["dueDate"]);
    header('Location: editWishList.php' );
    exit;
    }
  4. Введите или вставьте другой оператор else if после только что отредактированного:
    else if ($_POST["wishID"]!="") {
    WishDB::getInstance()->update_wish($_POST["wishID"], $_POST["wish"], $_POST["dueDate"]);
    header('Location: editWishList.php' );
    exit; }

Код выполняет проверку того, что элемент wishID в массиве $_POST не является пустой строкой (что означает перенаправление со страницы editWishList.php путем нажатия кнопки "Edit"), а также что пользователь указал описание пожелания. Если проверка выполнена успешно, то код вызывает функцию update_wish с входными параметрами wishID, description и dueDate. Эти параметры извлекаются из формы ввода HTML с помощью метода "POST". После вызова update_wish осуществляется переход на страницу editWishList.php, и обработка блока PHP прерывается.

Тестирование функциональной возможности редактирования пожелания

  1. Запустите приложение. На странице "index.php" заполните следующие поля: в поле "Username" введите "Tom", в поле "Password" введите "tomcat".
    Переход пользователя в режим редактирования собственного списка пожеланий
  2. Нажмите кнопку "Edit My Wish List". Откроется страница editWishList.php.
    Кнопка "Edit" добавлена к странице <tt>editWishList.php</tt>.
  3. Нажмите кнопку "Edit" рядом с пожеланием "Icecream". Откроется страница editWish.php.
    Страница <tt>editWish.php</tt> с формой для редактирования пожелания. Поля заполнены данными пожелания.
  4. Отредактируйте поля и нажмите кнопку "Back to the List". Откроется страница editWishList.php, однако изменения не сохранены.
  5. Нажмите кнопку "Edit" рядом с "Icecream". Очистите поле "Describe your wish" и нажмите кнопку "Save Changes". Появится сообщение об ошибке.
    В форме для редактирования пожелания отображается сообщение об ошибке, поскольку не указано описание пожелания.
  6. Введите "Chocolate icecream" в поле "Describe your wish" и нажмите "Save Changes". Откроется страница editWishList.php с обновленным списком пожеланий.
    Страница "editWishList.php": обновленное пожелание находится в списке.

Удаление пожелания

На данном этапе уже можно создавать, считывать и обновлять пожелания. Теперь необходимо добавить возможность удаления пожелания.

Для предоставления пользователю возможности удаления пожелания необходимо выполнить следующее:

  1. Добавьте функцию delete_wish к db.php.

    Для базы данных MySQL:

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

    Для базы данных 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. Создайте новый файл PHP с именем deleteWish.php и введите следующий код в блок <? php ? >:
    require_once("Includes/db.php");
    WishDB::getInstance()->delete_wish ($_POST["wishID"]);
    header('Location: editWishList.php' );
    Код обращается к файлу db.php. Затем выполняется вызов функции delete_wish из экземпляра WishDB со значением wishID в качестве входного параметра. Наконец, выполняется перенаправление на страницу editWishList.php.
  3. Для реализации кнопки "Delete" добавьте еще одну ячейку таблицы HTML в цикл while в editWishList.php сразу после блока кода для кнопки editWish. Форма ввода HTML содержит скрытое поле для wishID и кнопу отправки данных с надписью "Delete". Здесь показан код для базы данных MySQL, но для базы данных 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>

Код для таблицы, включая форму с кнопкой "Edit", в цикле while выглядит следующим образом:

Для базы данных 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(mysqli_real_escape_string($_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>

Для базы данных 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>

Тестирование функциональной возможности удаления пожелания

Для проверки правильности реализации этой функциональной возможности нажмите "Delete" рядом с любым элементом на странице editWishList.php. Элемент удаляется из списка.

Страница "editWishList.php": пожелание удалено

Исходный код приложения на момент завершения текущего урока

Для пользователей MySQL: щелкните эту ссылку для загрузки исходного кода, описывающего состояние проекта на момент завершения урока.

Для пользователей базы данных Oracle: щелкните эту ссылку для загрузки исходного кода, описывающего состояние проекта на момент завершения урока.

Что дальше?

<<Предыдущий урок

Следующий урок >>

Назад на главную страницу руководства



Оставить комментарии и предложения, обратиться за поддержкой и получить информацию о последних достижениях в области функциональных возможностей разработки для PHP с помощью среды IDE NetBeans можно в списке рассылки .

Возврат к учебной карте по PHP