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). Создайте новый проект 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. Откройте палитру в меню Windows или с помощью сочетания клавиш 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. Укажите имя пользователя, который вводит текст. Выберите текстовый тип ввода. Оставьте все остальные поля пустыми и нажмите кнопку "ОК".
    Заполненная форма "Вставка текста"

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

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

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

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

Создание файла 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 $_GET["user"]."<br/>";? >

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

    <html>
        <body>Wish List of <?php echo $_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());
    }
    //set the default client character set
    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. Стандартный синтаксис: "имя узла/имя службы". В соответствии с ним, имя соединения с базой данных Oracle XE в этом фрагменте будет выглядеть следующим образом: "локальный узел/XE".

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

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

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

    mysqli_select_db($con, "wishlist");
    $user = mysqli_real_escape_string($con, $_GET["user"]);
    $wisher = mysqli_query($con, "SELECT id FROM wishers WHERE name='" . $user . "'");
    if (mysqli_num_rows($wisher) < 1) { exit("The person " . $_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);
    
    //Because user is a unique value I only expect one row
    $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 не следует устанавливать параметр $_GET["user"] для предотвращения атаки введения SQL. См. статью энциклопедии Wikipedia о введении SQL и документацию mysql_real_escape_string. Несмотря на то, что в контексте этого руководства риск возникновения опасных атак введения SQL маловероятен, рекомендуется исключить из участия в запросах MySQL такие строки, которые могли бы быть подвержены подобной атаке. В OCI8 для этого используются переменные привязки (см. Часто задаваемые вопросы по PHP Oracle по поисковым запросам "переменная привязки" и "инъекция-").

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

Wish List of <?php echo $_GET["user"] . "<br/>"; ?>
<?php
$con = mysqli_connect("localhost", "phpuser", "phpuserpw"); if (!$con) { exit('Connect Error (' . mysqli_connect_errno() . ') ' . mysqli_connect_error()); }
//set the default client character set mysqli_set_charset($con, 'utf-8'); mysqli_select_db($con, "wishlist"); $user = mysqli_real_escape_string($con, $_GET["user"]); $wisher = mysqli_query($con, "SELECT id FROM wishers WHERE name='" . $user . "'"); if (mysqli_num_rows($wisher) < 1) { exit("The person " . $_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 $_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 = $_GET["user"];
  oci_bind_by_name($stid, ':user_bv', $user);
  oci_execute($stid);
//Because user is a unique value I only expect one row $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. Над тегом закрытия </table> введите следующий блок кода PHP.

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