В этом уроке рассматривается создание и настройка проекта PHP для разработки приложения, создание списка страниц в приложении и определение отношений между ними. Также будут рассмотрены основные функциональные возможности приложения и выполнено их тестирование с помощью данных, внесенных в демонстрационную базу данных на уроке 1.
Код PHP, который будет создан на этом уроке, используется для выполнения следующих функций:
1. Получение имени, введенного пользователем.
2. Проверка наличия пользователя в базе данных. Если пользователь отсутствует в базе данных, выводится сообщение об ошибке.
3. Просмотр таблицы пожеланий пользователя.
Текущий документ является частью учебного курса "Создание приложения типа CRUD в среде IDE NetBeans для PHP".
Создание проекта PHP
Выберите в меню "Файл" команду "Новый проект" (CTRL+SHIFT+N). Создайте новый проект PHP с именем "wishlist". Созданный проект PHP по умолчанию содержит файл индекса index.php. Для получения информации о создании и настройке проекта PHP см. Настройка проекта PHP.
Определение блок-схемы страницы
В рамках приложения возможны следующие варианты использования:
Пользователь просматривает список "Wish list" другого пользователя.
Пользователь регистрируется в качестве нового пользователя.
Пользователь входит в систему и создает собственный список пожеланий "Wish list".
Пользователь входит в систему и редактирует собственный список пожеланий.
Для реализации этих базовых функций потребуются следующие файлы PHP:
Первая страница index.php для входа в систему, регистрации и перехода к спискам "Wish list" других пользователей.
Страница wishlist.php для просмотра списка "Wish list" конкретного пользователя.
Страница createNewWisher.php для регистрации пользователя.
Страница editWishList.php для редактирования списка его владельцем.
Страница editWish.php для создания и редактирования пожеланий.
После выполнения предварительных действий можно приступить к реализации базовой функциональности приложения. Начать следует с просмотра списка "Wish list" одного из пользователей. Для этой функции не требуется выполнять проверку допустимости, ее можно легко протестировать, поскольку в базу данных уже внесены тестовые данные. Функциональность компонента реализуются на двух страницах – index.php и wishlist.php.
Добавление формы в файл index.php
Файл index.php не содержит код PHP, таким образом, можно просто удалить следующий блок:
Файл index.php может использоваться в двух целях:
отображение страницы с элементами управления для ввода данных;
перенос введенных данных в другой файл PHP, в котором выполняется их обработка. В этом учебном курсе данные переносятся в файл wishlist.php, процедуры создания и кодирования которого описаны в следующем разделе.
Эти действия выполняются с использованием формы HTML. Каждая форма HTML содержит:
набор полей, соответствующих элементам управления страницы;
действие, выполняемое после ввода пользователем данных в форму; действие, соответствующее пути к странице, где выполняется обработка данных.
Для добавления формы в файл index.php выполните следующее:
Перейдите к окну "Проекты", разверните узел проекта и узел "Исходные файлы", а затем дважды щелкните файл index.php. Файл index.php откроется в основной области редактора IDE. Файл содержит шаблон для ввода кодов PHP и HTML.
Примечание. Предупреждения объекта проверки HTML можно игнорировать.
.
Удалите блок PHP. Файл index.php не будет содержать код PHP.
Вставьте в элемент <head> следующее значение, если оно отсутствует. Это позволит использовать международные символы UTF-8.
Откройте палитру в меню Windows или с помощью сочетания клавиш CTRL+SHIFT+8.
Перетащите форму из раздела палитры "Формы HTML" в раздел <body> файла index.php.
Откроется диалоговое окно "Вставка формы". В поле "Действие" укажите путь к файлу, в который будут перенесены данные формы. В данном случае введите wishlist.php. (Этот файл будет создан в том же каталоге, что и index.php. Обратитесь к разделу Создание файла wishlist.php и тестирование приложения.) Выберите метод GET для переноса данных. Присвойте форме произвольное имя, например wishList. Нажмите кнопку "ОК" после выполнения действия.
Теперь файл выглядит следующим образом:
Введите между открывающим и закрывающим тегами в форме текст "Показать список пожеланий пользователя: ".
Перетащите на место пробела после текста "Показать список пожеланий пользователя: " компонент ввода текста из раздела палитры "Формы HTML". Откроется диалоговое окно "Вставка введенного текста".
Укажите имя пользователя, который вводит текст. Выберите текстовый тип ввода. Оставьте все остальные поля пустыми и нажмите кнопку "ОК".
Теперь файл выглядит следующим образом:
Добавьте пустую строку над тегом </form>. Перетащите в нее компонент "Кнопка" из раздела палитры Формы HTML.
Откроется диалоговое окно "Вставка кнопки". Введите в поле "Метка" текст Go и нажмите кнопку "ОК".
Теперь форма выглядит в соответствии с приведенным ниже кодом, но с одним отличием: в приведенном коде в теге <form> атрибут метода является явным. В среде IDE NetBeans атрибут метода не был добавлен в форму, поскольку по умолчанию выбирается метод GET. Однако код будет более понятен при явном определении атрибута метода.
Открывающий тег <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 и тестирования приложения выполните следующее:
Щелкните в созданном проекте "wishlist" правой кнопкой мыши узел исходных файлов и выберите в контекстном меню команды "Создать" > "Веб-страница PHP". Откроется мастер создания веб-страниц PHP.
Введите в поле "Имя файла" текст wishlist и нажмите кнопку "Готово".
Щелкните правой кнопкой мыши узел "Sources", а затем выберите "Run Project" из контекстного меню или щелкните значок "Run Main Project" на панели инструментов, если проект выбран в качестве главного.
В поле "Show wish list of" введите "Tom" и нажмите "Go". Появится пустая страница с URL-адресом http://localhost:90/Lesson2/wishlist.php?user=tom. Наличие этого URL-адреса означает, что главная страница функционирует правильно.
В этом разделе описывается первое добавление кода в файл wishlist.php для установления соединения с базой данных. Затем будет добавлен код для получения идентификатора пользователя, имя которого введено в форме index.php.
Дважды щелкните файл 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>
Для отображения заголовка после тега открытия <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 функционирует правильно.
Удалите комментарии из блока шаблона 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. Может потребоваться изменение соединения с базой данных с помощью команды oci_connect. Стандартный синтаксис: "имя узла/имя службы". В соответствии с ним, имя соединения с базой данных Oracle XE в этом фрагменте будет выглядеть следующим образом: "локальный узел/XE".
Примечание. Дополнение кода среды IDE NetBeans можно использовать для функций MySQLi или OCI8.
Под фрагментом кода, описывающим подключение к базе данных, в том же блоке 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);
?>
Если при тестировании приложения было неверно введено имя пользователя, появится следующее сообщение.
Просмотр таблицы пожеланий
В этом разделе добавляется код для просмотра HTML-таблицы пожеланий конкретного пользователя. Пользователь определяется по идентификатору, извлеченному из кода в предыдущем разделе.
Под блоком PHP введите или вставьте следующий блок кода HTML. Этот код открывает таблицу, указывает цвет ее границ (черный) и определяет вид заголовка таблицы, содержащего столбцы "Item" и "Due Date".
Посредством запроса SELECT пожелания со сроками их выполнения для указанного пользователя извлекаются в соответствии с идентификатором, который, в свою очередь был извлечен в действии 4; кроме того, пожелания и соответствующие сроки выполнения сохраняются в массиве $result.
С помощью цикла отдельные элементы массива $result выводятся на экран в качестве строк таблиц; при этом массив не освобождается.
Теги <tr></tr> формируют строки, теги <td></td> – ячейки внутри строк, а с тега \ n начинается новая строка.
Функция htmlentities позволяет преобразовывать все символы с эквивалентами объекта HTML в объекты HTML. Это позволяет предотвратить межсайтовый скриптинг.
В результате выполнения функций высвобождаются все ресурсы (результаты MySQLi и операторы OCI8) и закрывается подключение к базе данных. Обратите внимание на то, что до физического закрытия соединения необходимо высвободить все использующие его ресурсы. В противном случае соответствующее соединение с базой данных останется открытым во внутренней системе подсчета PHP даже в том случае, если вызов oci_close() или mysqli_close() не используется.
Внимание! Убедитесь в том, что имена полей базы данных указаны точно так же, как и во время создания таблицы базы данных. Для Oracle в именах столбцов по умолчанию вводятся символы в верхнем регистре.
Оставить комментарии и предложения, обратиться за поддержкой и получить сведения о последних достижениях в области возможностей разработки для PHP с помощью среды IDE NetBeans можно в списке рассылки .