| <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> |
| <!-- |
| Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. |
| --> |
| <html> |
| <head> |
| <title>Создание приложения на основе базы данных на языке PHP. Редактирование, обновление и удаление записей в базе данных MySQL</title> |
| <meta name="KEYWORDS" content="CRUD, Update, Delete, MySQL, PHP, NetBeans"> |
| <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> |
| <meta name="DESCRIPTION" content="Creating a Database Driven Application With PHP. Edit / Update and Delete record in MySQL database" > |
| <link rel="stylesheet" type="text/css" href="../../../netbeans.css" media="screen"> |
| </head> |
| <body> |
| <h1>Создание приложения на основе базы данных на языке PHP </h1> |
| <h1>Урок 7. Обновление и удаление записей в базе данных </h1> |
| <div style="margin-left:-3px"> |
| <div class="feedback-box margin-around float-left" style="margin-right:15px"> |
| <h4>Содержание учебного курса.</h4> |
| <ol start="0"> |
| <li><a href="wish-list-tutorial-main-page.html">Создание приложения на основе базы данных с помощью языка PHP – главная страница</a></li> |
| <li><p>Создание базы данных</p> <ol type="a"><li><a href="wish-list-lesson1.html">Создание базы данных MySQL</a></li> |
| <li><a href="wish-list-oracle-lesson1.html">Создание таблиц базы данных Oracle</a></li> |
| </ol></li> |
| <li> |
| <p><a href="wish-list-lesson2.html">Проектирование приложения. Чтение из базы данных</a></p> |
| </li> |
| <li><a href="wish-list-lesson3.html">Создание нового пользователя приложения</a></li> |
| <li><a href="wish-list-lesson4.html">Усовершенствование кода</a></li> |
| <li><a href="wish-list-lesson5.html">Добавление функций безопасности. Реализация входа пользователя в приложение</a></li> |
| <li><a href="wish-list-lesson6.html">Добавление нового пожелания в базу данных</a></li> |
| <li> |
| <p><b>=> Обновление и удаление записей в базе данных</b></p> |
| <ul> |
| <li><a href="#previousLessonSourceCode">Исходный код приложения из предыдущего урока</a></li> |
| <li><a href="#editWish">Редактирование пожелания</a> |
| <ul> |
| <li><a href="#addEditButton">Реализация кнопки "Edit"</a></li> |
| <li><a href="#wishArrayUpdate">Расширение массива $wish</a></li> |
| <li><a href="#updateInputForm">Обновление формы ввода HTML</a></li> |
| <li><a href="#updateWishRecord">Обновление пожелания в базе данных</a></li> |
| </ul> |
| </li> |
| <li><a href="#testingEditWishFunctionality">Тестирование функциональной возможности редактирования пожелания </a></li> |
| <li><a href="#deleteWish">Удаление пожелания</a></li> |
| <li><a href="#testingDeleteWishFunctionality">Тестирование функциональной возможности удаления пожелания</a></li> |
| <li><a href="#lessonResultSourceCode">Исходный код приложения после <br>завершения текущего урока</a></li> |
| <li><a href="#nextSteps">Следующие действия</a></li> |
| </ul> |
| </li> |
| <li><a href="wish-list-lesson8.html">Усовершенствование внешнего вида приложения с использованием технологии CSS</a></li> |
| <li><a href="wish-list-lesson9.html">Развертывание приложения на удаленном веб-сервере</a></li> |
| </ol> |
| </div> |
| </div> |
| <img alt="Содержимое на этой странице применимо к IDE NetBeans 7.2, 7.3, 7.4 и 8.0" class="stamp" src="../../../images_www/articles/73/netbeans-stamp-80-74-73.png" title="Содержимое этой страницы применимо к IDE NetBeans 7.2, 7.3, 7.4 и 8.0"> |
| |
| <p>В этом уроке функциональные возможности приложения будут расширены двумя компонентами:</p> |
| <ul> |
| <li style="margin-left:40em"><a href="#editWish">Редактирование пожелания</a></li> |
| <li style="margin-left:40em"><a href="#deleteWish">Удаление пожелания</a></li> |
| </ul> |
| <p>Для реализации этих функций следует изменить файлы <tt>editWishList.php</tt> и <tt>editWish.php</tt>. Кроме этого, следует создать новый файл с именем <tt>deleteWish.php</tt>.</p> |
| <img alt="Поток проекта PHP, задействованный в занятии 7" class="margin-around" height="384" src="../../../images_www/articles/72/php/oracle-wishlist/page-flow-diagram-l7.png" width="500"> |
| <p>Текущий документ является частью краткого учебного курса "Создание приложения CRUD в IDE NetBeans для PHP".</p><br style="clear:left"> |
| |
| <h2><a name="previousLessonSourceCode"></a>Исходный код приложения из предыдущего урока</h2> |
| <p>Для пользователей MySQL: перейдите по <a href="https://netbeans.org/files/documents/4/1932/lesson6.zip" target="_blank">этой ссылке</a> для загрузки исходного кода, описывающего состояние проекта на момент завершения предыдущего урока. </p> |
| <p>Для пользователей баз данных Oracle: перейдите по <a href="https://netbeans.org/projects/www/downloads/download/php%252Foracle-lesson6.zip" target="_blank">этой</a> для загрузки исходного кода, описывающего состояние проекта на момент завершения предыдущего урока.</p> |
| <h2><a id="editWish" name="editWish"></a>Редактирование пожелания</h2> |
| Функциональные возможности поддерживают следующий вариант использования: |
| <ul> |
| <li>На странице <tt>editWishList.php</tt> пользователь нажимает кнопку "Edit" справа от пожелания. Откроется страница <tt>editWish.php</tt> с данными выбранного пожелания.</li> |
| <li>Пользователь изменяет описание и/или срок выполнения пожелания, а затем нажимает кнопку "Save Changes". </li> |
| <li>Если описание <em>не</em> заполнено, то выводится сообщение об ошибке, после чего выполняется возврат к странице <tt>editWish.php</tt>. </li> |
| <li>Если описание заполнено, то выполняется возврат к странице <tt>editWishList.php</tt>, на которой можно обновить данные пожелания.</li> |
| </ul> |
| <p>Реализация состоит из следующих действий:</p> |
| <ul> |
| <li><a href="#addEditButton">Добавление кнопки "Edit" на страницу "editWishList"</a></li> |
| <li><a href="#wishArrayUpdate">На странице editWish.php — обновление массива $wish для хранения данных пожеланий</a></li> |
| <li><a href="#updateInputForm">Обновление формы ввода на странице editWish.php</a></li> |
| <li><a href="#updateWishRecord">Проверка правильности переданных данных и обновление пожелания в базе данных</a> </li> |
| </ul> |
| <div class="indent"><h3><a id="addEditButton" name="addEditButton"></a>Реализация кнопки "Edit" </h3> |
| <p>Таблица <tt>editWishList.php</tt> (таблица, включающая все пожелания, созданные пользователем) реализуется с помощью цикла (оператор <tt>while</tt>), который выводит на экран строки с пожеланиями, в то время как пожелания выбираются из базы данных. Добавьте кнопку "Edit" как крайнюю правую ячейку в ряду.</p> |
| <ol><li>Для обеспечения передачи идентификатора пожелания посредством формы ввода HTML он должен быть сохранен в виде переменной. Введите следующую строку кода в конце цикла <tt>while </tt>: |
| <pre class="examplecode">while ($row = ...) {<br> echo ...<br> echo ...<br> <strong>$wishID = $row["id"];</strong><br> |
| } |
| ?></pre> |
| </li> |
| <li>Создайте кнопку правки. С помощью формы editWish добавьте еще одну ячейку таблицы перед закрывающим тегом </table>. Эта форма содержит компонент кнопки и скрытый компонент, который при нажатии кнопки отправляет значение <tt>$wishID</tt>. (Показан код для базы данных MySQL, но добавлен тот же код и в то же место, что и для базы данных Oracle.) |
| <pre class="examplecode"> |
| Hello <?php echo $_SESSION["user"]; ?><br/><br> <table border="black"><br> <tr><th>Item</th><th>Due Date</th></tr><br> <?php<br> require_once("Includes/db.php");<br> $wisherID = WishDB::getInstance()->get_wisher_id_by_name($_SESSION["user"]);<br> $result = WishDB::getInstance()->get_wishes_by_wisher_id($wisherID);<br> while ($row = mysqli_fetch_array($result)) {<br> echo "<tr><td>" . htmlentities($row["description"]) . "</td>";<br> echo "<td>" . htmlentities($row["due_date"]) . "</td></tr>\n";<br> }<br> mysqli_free_result($result);<br> ?> |
| <strong><td> |
| <form name="editWish" action="editWish.php" method="GET"> |
| <input type="hidden" name="wishID" value="<?php echo <tt>$wish</tt>ID; ?>"> |
| <input type="submit" name="editWish" value="Edit"> |
| </form> |
| </td></strong><br> </table></pre> |
| </li> |
| <li>Измените цикл <tt>while</tt>, чтобы использовать <a href="http://www.php.net/manual/en/control-structures.alternative-syntax.php" target="_blank">альтернативный синтаксис</a>. Это облегчает выполнение блоков HTML внутри цикла <tt>while</tt>. В альтернативном синтаксисе цикла <tt>while</tt> открывающая фигурная скобка "{" заменяется двоеточием ":", а завершающая фигурная скобка "}" заменяется оператором <tt>endwhile;</tt>. Замените открывающую фигурную скобку двоеточием, удалите закрывающую фигурную скобку и перед закрывающим тегом </table> добавьте новый блок PHP с оператором <tt>endwhile;</tt>. Это приводит к добавлению новой ячейки таблицы в цикле <tt>while</tt>. Переместите код оператора free result/free на место после оператора <tt>endwhile;</tt>. (И вновь приведен код для MySQL, но изменение кода и его местоположение точно такие же, как для базы данных Oracle.) |
| <pre class="examplecode"> while ($row = mysqli_fetch_array($result))<del>{</del><strong>:</strong><br> echo "<tr><td>" . htmlentities($row["description"]) . "</td>";<br> echo "<td>" . htmlentities($row["due_date"]) . "</td></tr>\n";<br><del> }<br> mysqli_free_result($result);</del><br> ?> |
| <td> |
| <form name="editWish" action="editWish.php" method="GET"> |
| <input type="hidden" name="wishID" value="<?php echo <tt>$wish</tt>ID; ?>"> |
| <input type="submit" name="editWish" value="Edit"> |
| </form> |
| </td> |
| <strong> <?php |
| endwhile; |
| mysqli_free_result($result); |
| ?></strong> |
| </table></pre> |
| </li> |
| <li> |
| <p>Исправьте синтаксис для строки таблицы. Переместите закрывающие строку символы </tr>\n из оператора echo для срока выполнения в новый оператор echo непосредственно над оператором <tt>endwhile;</tt>.</p> |
| <pre class="examplecode"> while ($row = mysqli_fetch_array($result))<del></del><strong>:</strong><br> echo "<tr><td>" . htmlentities($row["description"]) . "</td>";<br> echo "<td>" . htmlentities($row["due_date"]) . "</td><del></tr>\n</del>";<br> ?> |
| <td> |
| <form name="editWish" action="editWish.php" method="GET"> |
| <input type="hidden" name="wishID" value="<?php echo <tt>$wish</tt>ID; ?>"> |
| <input type="submit" name="editWish" value="Edit"> |
| </form> |
| </td> |
| <?php |
| <strong>echo "</tr>\n";</strong> |
| endwhile; |
| mysqli_free_result($result); |
| ?> |
| </table></pre> |
| </li> |
| <li> |
| <p>Код для таблицы, включая форму с кнопкой "Edit" (Изменить), в цикле <tt>while </tt> выглядит следующим образом.</p> |
| <p><b>Для базы данных MySQL</b></p> |
| <pre class="examplecode"><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></pre> |
| <p><b>Для базы данных Oracle:</b></p> |
| |
| |
| <pre class="examplecode"><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></pre> |
| </li> |
| </ol> |
| <h3><a id="wishArrayUpdate" name="wishArrayUpdate"></a>Расширение массива <tt>$wish</tt> </h3> |
| <p>После нажатия кнопки "Edit" на странице <tt>editWishList.php</tt> идентификатор выбранного пожелания передается на страницу <tt>editWish.php</tt> с использованием метода запроса к серверу "GET". Для сохранения идентификатора пожелания следует добавить новый элемент к массиву <tt>$wish</tt>. </p> |
| <p>Так же, как и при добавлении нового пожелания, в случае неудачной попытки сохранения можно перейти в форму ввода может как со страницы <tt>editWishList.php</tt>, так и со страницы <tt>editWish.php</tt>. Отличие между вариантами заключается в методе запроса к серверу, посредством которого осуществляется передача данных. Метод "GET" указывает, что форма отображается при первом переходе пользователя на эту страницу при нажатии на кнопку "Edit Wish". Метод POST указывает на то, что пользователь был перенаправлен в форму после попытки сохранения пожелания без описания. </p> |
| <p>В файле <tt>editWish.php</tt> замените блок PHP в HTML <body> выше формы ввода <tt>EditWish</tt> на расширенный код для массива <tt>$wish</tt>.</p> |
| <p><strong>Для базы данных MySQL</strong></p> |
| <pre class="examplecode"><?php<br>if ($_SERVER["REQUEST_METHOD"] == "POST")<br>$wish = array("id" => $_POST["wishID"], "description" => |
| $_POST["wish"], "due_date" => $_POST["dueDate"]);<br>else if (array_key_exists("wishID", $_GET))<br>$wish = mysqli_fetch_array(WishDB::getInstance()->get_wish_by_wish_id($_GET["wishID"]));<br>else<br>$wish = array("id" => "", "description" => "", "due_date" => "");<br>?></pre> |
| <p><strong>Для базы данных Oracle</strong></p> |
| <pre class="examplecode"><?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" => ""); |
| ?></pre> |
| |
| <p>Код инициализирует массив <tt>$wish</tt> с тремя элементами – <tt>id</tt>, <tt>description</tt> и <tt>due_date</tt>. Значения этих элементов зависят от метода запроса к серверу. Если используется метод запроса к серверу "POST", то значения извлекаются из формы ввода. В противном случае, если используется метод запроса к серверу "GET", и при этом массив "$_GET" содержит элемент с ключом "wishID", значения извлекаются из базы данных функцией "get_wish_by_wish_id". Наконец, если не используется ни один из методов запроса ("POST" или "GET"), то это означает вариант добавления нового пожелания, т.е. что элементы пусты. </p> |
| <p>Указанный код включает все варианты создания и редактирования желаний. Теперь следует обновить код формы ввода таким образом, чтобы она подходила для обоих вариантов. </p> |
| <h3><a id="updateInputForm" name="updateInputForm"></a>Обновление формы ввода HTML</h3> |
| Пока форма ввода работает в том случае, когда требуется создать новое пожелание и отсутствует идентификатор пожелания. Чтобы форма работала в том случае, когда требуется редактировать существующее пожелание, необходимо добавить скрытое поле для передачи идентификатора пожелания. Значение этого скрытого поля должно извлекаться из массива $wish. На этапе создания нового пожелания значению должна соответствовать пустая строка. При редактировании пожелания значение скрытого поля должно измениться на идентификатор пожелания. Для создания скрытого поля добавьте следующую строку вверху формы ввода <tt>EditWish</tt> в файле <tt>editWish.php</tt>. |
| <pre class="examplecode"><input type="hidden" name="wishID" value="<?php echo <tt>$wish</tt>["id"];?>" /></pre> |
| <h3><a id="updateWishRecord" name="updateWishRecord"></a>Обновление пожелания в базе данных </h3> |
| <p>Теперь необходимо обновить код, который проверяет входные данные и вставляет пожелание в базу данных. Текущий код не различает варианты создания нового пожелания и обновления существующего. В текущей реализации к базе данных в любом случае добавляется новая запись, так как код не проверяет значение идентификатора пожелания, передаваемого из формы ввода. </p> |
| <p>Необходимо добавить следующие функции:</p> |
| <ul> |
| <li>Если передаваемый элемент "wishID" является пустой строкой, то должно быть создано новое пожелание.</li> |
| <li>В противном случае, если элемент "wishID" не является пустой строкой, то пожелание должно быть обновлено.</li> |
| </ul> |
| <p><strong>Для обновления файла editWish.php для выполнения проверки того, является ли пожелание новым или требуется его обновить, необходимо выполнить следующее:</strong></p> |
| <ol> |
| <li> |
| <p>Добавьте функцию <tt>update_wish</tt> к <tt>db.php</tt>. </p> |
| <p><b>Для базы данных MySQL</b></p> |
| <pre class="examplecode">public function update_wish($wishID, $description, $duedate){ |
| $description = $this->real_escape_string($description);<br> if ($duedate==''){<br> $this->query("UPDATE wishes SET description = '" . $description . "',<br> due_date = NULL WHERE id = " . $wishID);<br> } else<br> $this->query("UPDATE wishes SET description = '" . $description .<br> "', due_date = " . $this->format_date_for_sql($duedate)<br> . " WHERE id = " . $wishID);<br>} </pre> |
| <p><b>Для базы данных Oracle</b></p> |
| <pre class="examplecode">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); |
| |
| }</pre> |
| </li> |
| <li> |
| <p>Добавьте функцию <tt>get_wish_by_wish_id</tt> к <tt>db.php</tt>. </p> |
| <p><b>Для базы данных MySQL</b></p> |
| <pre class="examplecode">public function get_wish_by_wish_id ($wishID) {<br> return $this->query("SELECT id, description, due_date FROM wishes WHERE id = " . $wishID);<br>}</pre> |
| <p><b>Для базы данных Oracle</b></p> |
| <pre class="examplecode">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; |
| }</pre> |
| |
| </li> |
| <li>В главный метод, в верхний блок PHP файла <tt>editWish.php</tt>, добавьте условие к последнему оператору <code>else</code>. Именно этот оператор <tt>else</tt> вставляет пожелание в базу данных. Замените его на оператор <tt>else if</tt>: |
| <pre class="examplecode">else if ($_POST["wishID"]=="") {<br> WishDB::getInstance()->insert_wish($wisherID, $_POST["wish"], $_POST["dueDate"]);<br> header('Location: <tt>editWishList.php</tt>' );<br> exit;<br>}</pre></li> |
| <li> |
| |
| Введите или вставьте другой оператор <tt>else if</tt> после только что отредактированного: |
| |
| <pre class="examplecode">else if ($_POST["wishID"]!="") {<br> WishDB::getInstance()->update_wish($_POST["wishID"], $_POST["wish"], $_POST["dueDate"]);<br> header('Location: <tt>editWishList.php</tt>' );<br> exit; |
| } </pre> |
| </li> |
| </ol> |
| <p>Код выполняет проверку того, что элемент <tt>wishID</tt> в массиве <tt>$_POST</tt> не является пустой строкой (что означает перенаправление со страницы <tt>editWishList.php</tt> путем нажатия кнопки "Edit"), а также что пользователь указал описание пожелания. Если проверка выполнена успешно, код вызывает функцию <tt>update_wish</tt> с входными параметрами <tt>wishID</tt>, <tt>description</tt> и <tt>dueDate</tt>.Эти параметры получены от формы ввода HTML с помощью метода POST. После вызова <tt>update_wish</tt> осуществляется переход на страницу <tt>editWishList.php</tt>, и обработка блока PHP прерывается. </p> |
| </div> |
| <h2><a name="testingEditWishFunctionality"></a>Тестирование функциональной возможности редактирования пожелания </h2> |
| <ol> |
| <li>Запустите приложение. На странице "index.php" заполните следующие поля: в поле "Username" введите "Tom", в поле "Password" введите "tomcat".<br> <img alt="Пользователь входит в систему для редактирования своего списка пожеланий." class="margin-around" src="../../../images_www/articles/72/php/wish-list-lesson7/user-logon-to-edit-wish-list.png"></li> |
| <li> Нажмите кнопку "Edit My Wish List". Откроется страница <tt>editWishList.php</tt>.<br> <img alt="Кнопка 'Правка' добавлена к странице <tt>editWishList.php</tt>" class="margin-around" src="../../../images_www/articles/72/php/wish-list-lesson7/edit-wish-list-edit-wish.png"></li> |
| <li>Нажмите кнопку "Edit" рядом с пожеланием "Icecream". Откроется страница <tt>editWish.php</tt>.<br><img alt="Откроется страница <tt>editWish.php</tt> с формой для редактирования пожелания. Поля заполнены данными пожеланий." class="margin-around" src="../../../images_www/articles/72/php/wish-list-lesson7/edit-wish.png"></li> |
| <li>Отредактируйте поля и нажмите кнопку "Back to the List". Откроется страница <tt>editWishList.php</tt>, однако изменения не сохранены.</li> |
| <li>Нажмите кнопку "Edit" рядом с "Icecream". Очистите поле "Describe your wish" и нажмите кнопку "Save Changes". Появится сообщение об ошибке.<br><img alt="В форме для редактирования пожелания отображается сообщение об ошибке: описание не заполнено" class="margin-around" src="../../../images_www/articles/72/php/wish-list-lesson7/editWishEmptyDescription.png"></li> |
| <li>Введите "Chocolate icecream" в поле "Describe your wish" и нажмите "Save Changes". Откроется страница <tt>editWishList.php</tt> с обновленным списком пожеланий.<br><img alt="страница editWishList.php: updatedwish включен в список" class="margin-around" src="../../../images_www/articles/72/php/wish-list-lesson7/editWishListWishAdded.png"> </li> |
| </ol> |
| |
| <h2><a id="deleteWish" name="deleteWish"></a>Удаление пожелания </h2> |
| <p>Теперь, научившись создавать, читать и обновлять пожелания, добавьте метод для удаления пожелания.</p> |
| <p><strong>Для предоставления пользователю возможности удаления пожелания необходимо выполнить следующее:</strong></p> |
| <ol> |
| <li><p>Добавьте функцию <tt> delete_wish</tt> к <tt>db.php</tt>.</p> |
| <p><b>Для базы данных MySQL</b></p> |
| <pre class="examplecode">function delete_wish ($wishID){<br> $this->query("DELETE FROM wishes WHERE id = " . $wishID);<br>} |
| </pre> |
| <p><b>Для базы данных Oracle</b></p> |
| <pre class="examplecode">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); |
| }</pre> |
| |
| </li> |
| <li>Создайте новый файл PHP с именем <tt>deleteWish.php</tt> и введите следующий код в блок <? php ? >: |
| <pre class="examplecode">require_once("Includes/db.php");<br>WishDB::getInstance()->delete_wish ($_POST["wishID"]);<br>header('Location: <tt>editWishList.php</tt>' );</pre> |
| Код обращается к файлу <tt>db.php</tt>. Затем выполняется вызов функции <tt>delete_wish</tt> из экземпляра WishDB со значением <tt>wishID</tt> в качестве входного параметра. Наконец, выполняется перенаправление на страницу <tt>editWishList.php</tt>.</li> |
| <li>Для реализации кнопки "Delete" (Удалить) добавьте еще одну ячейку таблицы HTML к циклу <tt>while</tt> в файле <tt>editWishList.php</tt>, непосредственно ниже блока кода для кнопки <tt>editWish</tt>. Форма ввода HTML содержит скрытое поле для <tt>wishID</tt> и кнопу отправки данных с надписью "Delete". (Показан код для базы данных MySQL, но добавлен тот же код и в то же место, что и для базы данных Oracle.) |
| |
| <pre class="examplecode"> while ($row = mysqli_fetch_array($result))<del></del><strong>:</strong><br> echo "<tr><td>" . htmlentities($row["description"]) . "</td>";<br> echo "<td>" . htmlentities($row["due_date"]) . "</td><del></tr>\n</del>";<br> ?> |
| <td> |
| <form name="editWish" action="editWish.php" method="GET"> |
| <input type="hidden" name="wishID" value="<?php echo <tt>$wish</tt>ID; ?>"> |
| <input type="submit" name="editWish" value="Edit"> |
| </form> |
| </td> |
| <strong><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></strong> |
| <?php |
| echo "</tr>\n"; |
| endwhile; |
| mysqli_free_result($result); |
| ?> |
| </table></pre> |
| </li></ol> |
| |
| <p>Код для таблицы, включая форму с кнопкой "Edit" (Изменить), в цикле <tt>while </tt> выглядит следующим образом.</p> |
| <p><b>Для базы данных MySQL</b></p> |
| <pre class="examplecode"><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></pre> |
| <p><b>Для базы данных Oracle:</b> </p> |
| <pre class="examplecode"><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></pre> |
| |
| <h2><a name="testingDeleteWishFunctionality"></a>Тестирование функциональной возможности удаления пожелания</h2> |
| <p>Для проверки правильности реализации этой функциональной возможности нажмите "Delete" рядом с любым элементом на странице <tt>editWishList.php</tt>. Элемент удаляется из списка.</p> |
| <img alt="страница editWishList.php: пожелание удалено" class="margin-around" src="../../../images_www/articles/72/php/wish-list-lesson7/deleteWish.png"> |
| |
| <h2><a name="lessonResultSourceCode"></a>Исходный код приложения на момент завершения текущего урока </h2> |
| <p>Для пользователей MySQL: щелкните <a href="https://netbeans.org/files/documents/4/1933/lesson7.zip" target="_blank">здесь</a> для загрузки исходного кода, отражающего состояние проекта по завершении данного урока.</p> |
| <p>Для пользователей Oracle Database: щелкните <a href="https://netbeans.org/projects/www/downloads/download/php%252Foracle-lesson7.zip" target="_blank">здесь</a> для загрузки исходного кода, отражающего состояние проекта по завершении данного урока.</p> |
| <h2><a name="nextSteps"></a>Что дальше?</h2> |
| <p> <a href="wish-list-lesson6.html"><<Предыдущий урок</a> <br> <br> <a href="wish-list-lesson8.html">Следующий урок >></a> <br> <br> <a href="wish-list-tutorial-main-page.html">Назад на главную страницу руководства</a> </p> |
| <br> |
| <div class="feedback-box" ><a href="/about/contact_form.html?to=3&subject=Feedback:%20PHP%20Wish%20List%20CRUD%207:%20Updating%20and%20Deleting%20DB%20Entries">Отправить отзыв по этому учебному курсу</a></div> |
| <br style="clear:both;" > |
| <p>Для отправки комментариев и предложений, получения поддержки и новостей о последних разработках, связанных с PHP IDE NetBeans <a href="../../../community/lists/top.html">присоединяйтесь к списку рассылки users@php.netbeans.org</a>. |
| <p><a href="wish-list-tutorial-main-page.html"></a> |
| <p> |
| <a href="../../trails/php.html">Возврат к учебной карте PHP</a><br> |
| |
| </p> |
| </body> |
| </html> |