corner imagecorner image
IDEPlatformPluginsDocs & SupportCommunityPartners

Создание приложения на основе базы данных на языке PHP

Урок 2. Проектирование приложения. Чтение из базы данных

Сведения на этой странице относятся к среде IDE NetBeans 6.7-7.0

В этом уроке рассматривается создание и настройка проекта PHP для разработки приложения, создание списка страниц в приложении и определение отношений между ними. Кроме того, основная функциональность разрабатывается и тестируется на данных, введенных в пример базы данных в уроке 1.

Создаваемый в этом уроке код PHP выполняет следующие функции.

1 Получает имя лица, введенного пользователем.

2. Проверяет наличие этого лица в базе данных. Если лицо отсутствует в базе данных, выполняется выход с сообщением об ошибке.

3 Отображение таблицы пожеланий этого лица.

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


Создание проекта PHP

Выберите "Файл" > "Новый проект" (Ctrl-Shift-N в Windows и Linux, ⌘-Shift-N в MacOS). Создайте новый проект PHP с именем "wishlist". После создания проекта PHP по умолчанию он будет содержать файл индекса index.php. Для получения информации о создании и настройке проекта PHP см. Настройка проекта PHP.

Определение блок-схемы страницы

В рамках приложения возможны следующие варианты использования:
  1. Пользователь просматривает список "Wish list" другого пользователя.
  2. Пользователь регистрируется в качестве нового пользователя.
  3. Пользователь входит в систему и создает собственный список пожеланий "Wish list".
  4. Пользователь входит в систему и редактирует свой список пожеланий.
Для реализации этих базовых функциональных возможностей потребуется добавить следующие файлы PHP.
  1. Первая страница index.php для входа в систему, регистрации и перехода к спискам "Wish list" других пользователей.
  2. Страница wishlist.php для просмотра списка "Wish list" конкретного пользователя.
  3. Страница createNewWisher.php для регистрации в качестве автора пожеланий.
  4. Страница editWishList.php для редактирования списка его владельцем.
  5. Страница editWish.php для создания и редактирования пожеланий.
На рисунке представлена схема переключения между страницами в различных вариантах использования.

После выполнения предварительных действий можно приступить к реализации базовой функциональности приложения. Начать следует с просмотра списка "Wish list" одного из пользователей. Для этой функции не требуется выполнять проверку допустимости, ее можно легко протестировать, поскольку в базу данных уже внесены тестовые данные. Функциональность компонента реализуются на двух страницах – index.php и wishlist.php.

Добавление формы к index.php

Файл index.php не содержит код PHP, таким образом, можно просто удалить следующий блок:

Файл index.php используется в двух целях.

  • Отображение страницы с элементами управления для ввода данных.
  • Передача введенных данных в другой файл PHP для обработки данных. В этом учебном курсе данные передаются в файл с именем wishlist.php, который создается в следующем разделе.

Эти действия выполняются с использованием формы HTML. Каждая форма HTML содержит следующее.

  • Набор полей, соответствующих элементам управления на странице.
  • "Действие", выполняемое после отправки пользователем данных в форме. Действие представлено путем к странице для обработки данных.

Для добавления формы к index.php выполните следующее.

  1. Перейдите к окну "Проекты", разверните узел проекта и узел "Файлы исходного кода", затем дважды щелкните файл index.php. Файл index.php откроется в основной области редактора IDE. Файл содержит шаблон для ввода кодов PHP и HTML.

    Примечание. Можно игнорировать предупреждения средства проверки допустимости HTML.

    Начало работы с index.php.
  2. Удалите блок PHP. Файл index.php не содержит код PHP.
    Пустой блок PHP, который может быть удален.
  3. Вставьте следующий элемент внутри элемента <head>, если он отсутствует. Этот элемент позволяет форме использовать международные символы UTF-8.
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  4. Откройте "Палитру" из меню "Окно" или нажав Ctrl-Shift-8.
  5. Из раздела Формы HTML палитры перетащите форму в раздел <body> файла index.php.
    Перетаскивание элемента "Форма HTML" из палитры в тело файла index.php
  6. Откроется диалоговое окно "Вставить форму". В поле "Действие" введите путь к файлу, в которой форма будет передавать данные. В данном случае введите wishlist.php. (Этот файл будет создан в том же местоположении, что и файл index.php. См. Создание wishlist.php и тестирование приложения.) Выберите метод GET для передачи данных. Присвойте форме произвольное имя, например, wishList. По завершении нажмите кнопку "ОК".
    Диалоговое окно "Вставка формы", заполненное

    Теперь файл выглядит следующим образом:

    index.php с добавленной формой, форма без содержания
  7. Между открывающим и закрывающим тегами формы введите текст "Показать список пожеланий: ".
  8. Перетащите компонент "Ввод текста" из раздела Формы HTML палитры в пространство после текста "Показать список пожеланий: ". Откроется диалоговое окно "Вставка ввода текста".
  9. Присвойте вводу название user. Выберите тип ввода text. Оставьте все поля пустыми и нажмите кнопку "ОК".
    Диалоговое окно "Вставка ввода текста"

    Теперь файл выглядит следующим образом:

    index.php с формой ввода текста
  10. Добавьте пустую сроку над тегом </form>. В эту пустую строку перетащите компонент "Кнопка" из раздела Формы HTML палитры.
  11. Откроется диалоговое окно "Вставить кнопку". Введите Go в поле "Метка" и нажмите кнопку "ОК".
    Диалоговое окно "Вставить кнопку", заполненное
  12. Теперь форма выглядит так, как показанный ниже код, с одним отличием. В коде ниже атрибут method явно указан в теге <form>. Среда IDE NetBeans не добавила атрибут метода к форме, поскольку GET — это значение данного атрибута по умолчанию. Однако явное указание атрибута method упрощает понимание кода.
    <form action="wishlist.php" method="GET" name="wishList">
    Показать список пожеланий: <input type="text" name="user" value=""/>
    <input type="submit" value="Go" />
    </form>

Обратите внимание на следующие элементы формы.

  • Открывающий тег <form> содержит атрибут action. Атрибут action указывает файл, в который форма передает данные. В данном случае файл имеет имя wishlist.php и находится в той же папке, что и файл index.php. (Этот файл будет создан в разделе Создание wishlist.php и тестирование приложения.)
  • Открывающий тег <form> также содержит метод для применения к переданным данным (GET). PHP использует массив $_GET или $_POST для значений, переданных этой формой, в зависимости от значения атрибута method. В данном случае PHP использует $_GET.
  • Компонент ввода text. Этот компонент — текстовое поле для ввода имени пользователя, список пожеланий которого необходимо просмотреть. Начальное значение текстового поля — пустая строка. Имя этого поля — user. PHP использует имя поля при создании массива для значений поля. В данном случае массив для значений этого поля — htmlentities($_GET["user"]).
  • Компонент ввода submit со значением "Go". Тип "submit" означает, что поле ввода отображается на странице как кнопка. Значение "Go" — это метка поля. При нажатии пользователем кнопки данные в компоненте text передаются в файл, указанный в атрибуте action.

Создание wishlist.php и тестирование приложения

В разделе Добавление формы к index.php была создана форма, с помощью которой пользователь отправляет имя лица, список пожеланий которого необходимо просмотреть. Имя передается странице wishlist.php. Однако этой страницы не существует. Если выполнить index.php, при отправке имени возникнет ошибка "404: Файл не найден". В этом разделе будет создан файл wishlist.php, затем будет выполнено тестирование приложения.

Для создания wishlist.php и тестирования приложения выполните следующее.

  1. В созданном проекте "wishlist" правой кнопкой мыши щелкните узел "Файлы исходного кода", затем в контекстном меню выберите "Новый > Файл PHP". Откроется мастер "Новый файл PHP".
  2. Введите wishlist в поле "Имя файла" и нажмите кнопку "Готово".
    Панель "New PHP File"
  3. Щелкните правой кнопкой мыши узел "Sources", а затем выберите "Run Project" из контекстного меню или щелкните значок "Run Main Project" Кнопка "Run Main Project": значок с зеленой стрелкойна панели инструментов, если проект выбран в качестве главного.
    Главная страница приложения index.php, на которой находится поле "Show wish list of" и кнопка "Go"
  4. В поле "Show wish list of" введите "Tom" и нажмите "Go". Появится пустая страница со следующим URL-адресом: http://localhost:90/Lesson2/wishlist.php?user=tom. Наличие этого URL-адреса означает, что главная страница функционирует правильно.

Установка подключения и получение идентификатора автора пожеланий

В этом разделе сначала к файлу wishlist.php будет добавлен код для создания подключения к базе данных. Затем будет добавлен код для получения идентификатора автора пожеланий, который был введен в форме index.php.

  1. Дважды щелкните файл wishlist.php. Открывшийся шаблон отличается от index.php. Файл должен начинаться и заканчиваться тегами <html></html> и <body></body>, поскольку файл будет содержать также код HTML.
    <html>
        <body>
            <?php
            /* 
             * To change this template, choose Tools | Templates
             * and open the template in the editor.
             */
    
            ?>
      </body>
    </html>
  2. Для отображения заголовка после тега открытия <body> и перед генерируемым тегом <?php введите следующий блок кода:
     Wish List of <?php echo htmlentities($_GET["user"])."<br/>";? >

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

    <html>
        <body>Wish List of <?php echo htmlentities($_GET["user"])."<br/>";? >
    <?php
    /*
    * To change this template, choose Tools | Templates
    * and open the template in the editor.
    */ ?>
    </body> </html>

    Блок кода PHP выводит на экран данные, которые поступают посредством метода GET в поле "user". Это данные передаются со страницы index.php, где имя владельца списка "Wish list" – "Tom" – было введено в текстовом поле "user". Повторите действия, указанные на странице Testing index.php, для проверки того, что wishlist.php функционирует правильно.
    На странице wishList.php содержится текст "Wish List of Tom"

  3. Удалите раздел в шаблоне блока PHP с комментарием. В этом месте введите или вставьте следующий код. Этот код открывает подключение к базе данных.

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

    $con = mysqli_connect("localhost", "phpuser", "phpuserpw");
    if (! $con) {
    exit('Connect Error (' . mysqli_connect_errno() . ') '
    . mysqli_connect_error());
    }
    //установка набора символов клиента по умолчанию
    mysqli_set_charset($con, 'utf-8');

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

    $con = oci_connect("phpuser", "phpuserpw", "localhost/XE", "AL32UTF8");
    if (!$con) {
        $m = oci_error();
        exit('Connect Error ' . $m['message']);
    }

    В соответствии с кодом производится попытка подключения к базе данных и выдается сообщение об ошибке в случае неудачи.

    Примечание для пользователей базы данных Oracle. Может потребоваться изменить подключение к базе данных в команде oci_connect. Стандартный синтаксис — "hostname/service name". Подключение к базе данных Oracle XE в этом фрагменте — "localhost/XE" в соответствии с этим синтаксисом.

    Примечание. Автозавершение кода среды IDE NetBeans можно использовать для функций mysqli и OCI8.

    Автозавершение кода для вызовов MySQLАвтозавершение кода для вызовов OCI8
  4. Под фрагментом кода, описывающим подключение к базе данных, в том же блоке PHP укажите следующий код. Этот код получает идентификатор автора пожеланий, чей список был запрошен. Если автор пожеланий отсутствует в базе данных, код уничтожает/завершает процесс и отображает сообщение об ошибке.

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

    mysqli_select_db($con, "wishlist");
    $user = mysqli_real_escape_string($con, htmlentities($_GET["user"]));
    $wisher = mysqli_query($con, "SELECT id FROM wishers WHERE name='" . $user . "'");
    if (mysqli_num_rows($wisher) < 1) { exit("The person " . htmlentities($_GET["user"]). " is not found. Please check the spelling and try again" ); }
    $row = mysqli_fetch_row($wisher);
    $wisherID = $row[0];
    mysqli_free_result($wisher);

    Для базы данных Oracle. (Имейте в виду, что oci8 не имеет эквиваленту mysqli_num_rows)

    $query = "SELECT id FROM wishers WHERE NAME = :user_bv";
    $stid = oci_parse($con, $query);
    $user = $_GET['user'];
    
    oci_bind_by_name($stid, ':user_bv', $user);
    oci_execute($stid);
    
    //Поскольку пользователь является уникальным значением, я ожидаю только одну строку
    $row = oci_fetch_array($stid, OCI_ASSOC);
    if (!$row) {
        exit("The person " . $user . " is not found. Please check the spelling and try again" );
    }
    $wisherID = $row['ID'];
    oci_free_statement($stid);

    Осуществляется выбор данных из базы данных wishlist с помощью подключения $con. Критерием выбора является имя, полученное со страницы index.php как "user".

    Синтаксис оператора SQL SELECT может быть кратко описан следующим образом:

    • После выполнения оператора SELECT укажите поля, из которых должны быть получены данные. Все поля отмечены звездочкой (*).
    • После блока FROM укажите имя таблицы, из которой требуется извлечь данные.
    • Блок WHERE является необязательным. Укажите в нем условия фильтрации.

    Запрос mysqli возвращает объект результата. OCI8 возвращает выполненное выражение. В любом случае выполняется выборка строки из результатов выполненного запроса и извлекается значение строки идентификатора, которое сохраняется в переменной $wisherID.

    Наконец, освобождается результат mysqli или оператор OCI8. Для физического закрытия подключения необходимо освободить все ресурсы, использующие подключение. В противном случае внутренняя система подсчета ссылок PHP сохранит нижележащее подключение к базе данным открытым, даже если $con неприменимо после вызова mysqli_close() или oci_close().

    Примечание по безопасности. Для MySQL параметр htmlentities($_GET["user"]) экранируется для предотвращения атак путем внедрения кода SQL. См. статью энциклопедии Wikipedia о введении SQL и документацию mysql_real_escape_string. Несмотря на то, что в контексте этого руководства риск возникновения опасных атак внедрения SQL маловероятен, рекомендуется исключить из участия в запросах MySQL такие строки, которые могли бы быть подвержены подобной атаке. OCI8 предотвращает это с помощью переменных связывания (см. Часто задаваемые вопросы по PHP, выполните поиск "переменные связывания" и "внедрение").

На данный момент блок PHP готов. При использовании базы данных MySQL файл wishlist.php теперь выглядит следующим образом.

Wish List of <?php echo htmlentities($_GET["user"]) . "<br/>"; ?>
<?php
$con = mysqli_connect("localhost", "phpuser", "phpuserpw"); if (!$con) { exit('Connect Error (' . mysqli_connect_errno() . ') ' . mysqli_connect_error()); }
//установка набора символов клиента по умолчанию mysqli_set_charset($con, 'utf-8'); mysqli_select_db($con, "wishlist"); $user = mysqli_real_escape_string($con, htmlentities($_GET["user"])); $wisher = mysqli_query($con, "SELECT id FROM wishers WHERE name='" . $user . "'"); if (mysqli_num_rows($wisher) < 1) { exit("The person " . htmlentities($_GET["user"]). " is not found. Please check the spelling and try again"); } $row = mysqli_fetch_row($wisher); $wisherID = $row[0]; mysqli_free_result($wisher); ?>

При использовании базы данных Oracle файл wishlist.php выглядит следующим образом:

Wish List of <?php echo htmlentities($_GET["user"]) . "<br/>"; ?>
  <?php
  $con = oci_connect("phpuser", "phpuserpw", "localhost/XE", "AL32UTF8");
  if (!$con) {
     $m = oci_error();
     exit('Connect Error ' . $m['message'];
     exit;
  }
  $query = "SELECT id FROM wishers WHERE name = :user_bv";
  $stid = oci_parse($con, $query);
  $user = htmlentities($_GET["user"]);
  oci_bind_by_name($stid, ':user_bv', $user);
  oci_execute($stid);
//Поскольку пользователь является уникальным значением, я ожидаю только одну строку $row = oci_fetch_array($stid, OCI_ASSOC); if (!$row) { exit("The person " . $user . " is not found. Please check the spelling and try again" ); } $wisherID = $row["ID"]; oci_free_statement($stid); ?>

Если при тестировании приложения было неверно введено имя пользователя, появится следующее сообщение.

Отображение на странице wishlist.php сообщения об ошибке: "The user is not found"

Отображение таблицы пожеланий

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

  1. Под блоком PHP введите или вставьте следующий блок кода HTML. Этот код открывает таблицу, указывает цвет ее границ (черный) и определяет вид заголовка таблицы, содержащего столбцы "Item" и "Due Date".
    <table border="black">
        <tr>
            <th>Item</th>
            <th>Due Date</th>
        </tr>
    </table>
    Тег </table> закрывает таблицу.
  2. Введите следующий код блока PHP над закрывающим тегом </table>.

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

    <?php
    $result = mysqli_query($con, "SELECT description, due_date FROM wishes WHERE 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);
    mysqli_close($con);
    ? >

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

    <?php
    $query = "SELECT description, due_date FROM wishes WHERE wisher_id = :id_bv";
    $stid = oci_parse($con, $query);
    oci_bind_by_name($stid, ":id_bv", $wisherID);
    oci_execute($stid);
    while ($row = oci_fetch_array($stid)) {
    echo "<tr><td>" . htmlentities($row["DESCRIPTION"]) . "</td>";
    echo "<td>". htmlentities($row["DUE_DATE"]) . "</td></tr>\n";
    }
    oci_free_statement($stid);
    oci_close($con);
    ? >

    Внутри кода:

    • Посредством запроса SELECT пожелания со сроками их выполнения для указанного пользователя извлекаются в соответствии с идентификатором, который, в свою очередь был извлечен в действии 4; кроме того, пожелания и соответствующие сроки выполнения сохраняются в массиве $result.
    • С помощью цикла отдельные элементы массива $result выводятся на экран в качестве строк таблиц, пока массив непуст.
    • Теги <tr></tr> формируют строки, теги <td></td> – ячейки внутри строк, а после символа \ n начинается новая строка.
    • Функция htmlentities преобразует все символы, имеющие эквивалентные сущности HTML, в сущности HTML. Это помогает предотвратить межсайтовые сценарии.
    • В конце функции освобождают все ресурсы (результаты mysqli и выражения OCI8) и закрывают подключение к базе данных. Имейте в виду, что для физического закрытия подключения необходимо освободить все ресурсы, использующие подключение. В противном случае внутренняя система подсчета ссылок PHP сохранит нижележащее подключение к базе данным открытым, даже если подключение неприменимо после вызова oci_close() или mysqli_close().

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

  3. Для тестирования приложения выполните проект, как описано в разделе Тестирование index.php.
    Просмотр на странице wishlist.php списка пожеланий пользователя с именем Tom

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

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

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

Что дальше?

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

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

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

Полезные ссылки

Дополнительные сведения об использовании HTML, PHP и MySQL или базы данных Oracle доступны в следующих материалах.



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

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