Лабораторная работа №15
Разработка Web-приложения с помощью РНР и СУБД MySQL
Цель работы
1. Изучить основы доступа с БД из Web с использованием РНР.
2. Применить полученные знания для написания сценариев на PHP.
Задание для подготовки к работе
Изучить лекционный материал и теоретический материал настоящей лабораторной работы.
Порядок выполнения работы
1. Изучить основы использования РНР для доступа к БД.
2. Создать одну таблицу с использованием оболочки phpMyAdmin и СУБД MySQL (желательно по теме курсовой работы).
3. Разработать Web-приложение, включающее в себя следующие сценарии на языке РНР:
· для занесения информации в таблицу БД, работающую под управлением СУБД MySQL;
· для просмотра информации занесенной в таблицу БД;
· для реализации различных SQL-запросов;
· для удаления записей из таблицы БД.
4. Выполнить разработанные сценарии.
5. Составить электронный отчет о проделанной работе.
Содержание отчета
1. Титульный лист.
2. Теоретическая часть.
|
|
3. Копии экрана, иллюстрирующие работу оболочки phpMyAdmin по созданию таблицы БД.
4. Копии экрана, иллюстрирующие работу созданных сценариев PHP.
5. Код html-страниц, и РНР – код, разработанных сценариев.
Теоретический материал
Более рациональный способ сохранения и восстановления данных – это использование систем управления базами данных. Рассмотрим применение MySQL — системы управления реляционными базами данных. Для чего это нужно?
Проблемы, связанные с использованием двумерных файлов. При работе с двумерными файлами возникает ряд проблем:
· Когда двумерные файлы становятся большими, работа с ними существенно замедляется.
· Поиск конкретной записи или группы записей в двумерном файле затруднен. Если записи упорядочены, для поиска в ключевом поле можно использовать какой-либо из видов бинарного поиска в сочетании с применением записей фиксированной длины. Если нужно найти информацию, соответствующую определенному шаблону, придется прочесть и проверить каждую из записей в отдельности.
· Конкурирующий доступ может порождать проблемы. Уже было показано, как блокируются файлы, но это может привести к возникновению описанной ранее конфликтной ситуации. Кроме того, это может привести к образованию "узкого места" в сети. При достаточно интенсивном информационном потоке большой группе пользователей может потребоваться ожидать разблокирования файла, прежде чем они смогут разместить свои заказы. Если ожидание продлится слишком долго, люди обратятся за покупкой куда-либо в другое место.
· Вся до сих пор рассмотренная обработка файлов сводилась к последовательной обработке — т.е. считывание начиналось с начала файла и выполнялось до его конца. При необходимости вставить записи или удалить их из середины файла (т.е. при необходимости произвольного доступа), это может оказаться затруднительным — в конце концов, придется считать весь файл в память, выполнить изменения и снова записать весь файл. При работе с большими файлами данных этот процесс сопряжен со значительной перегрузкой системы.
|
|
· Кроме ограничений, налагаемых правами доступа к файлам, не существует никакого способа обеспечения различных уровней доступа к данным.
Как эти проблемы решаются с помощью СУБД. Системы управления базами данных (СУБД) решают все эти проблемы:
СУБД могут обеспечить более быстрый доступ к данным, чем двумерные файлы. А MySQL, система управления базами данных, обладает одними из самых высоких показателей производительности среди всех СУБД.
В СУБД можно легко отправлять запрос для извлечения наборов данных, соответствующих определенным критериям.
СУБД обладают встроенными механизмами обработки конкурирующих обращений, что позволяет программисту не беспокоиться об этом.
СУБД обеспечивают произвольный доступ к данным.
СУБД обладают встроенными системами определения прав доступа. MySQL обладает особенно большими возможностями в этой области.
Вероятно, главная побудительная причина использования СУБД заключается в том, что все (или, по меньшей мере, большинство) функциональные возможности, требуемые от системы хранения данных, в ней уже реализованы. Конечно, можно было бы создать собственную библиотеку РНР - функций, но зачем, же заново изобретать колесо?
Доступ к базам данных.
Подготовка базы. Перед организацией системы доступа к базам данных, необходимо иметь эти базы. Для создания базы данных и таблиц в ней рекомендуется использовать монитор mysql (лабораторная работа № 10) или оболочку phpMyAdmin (лабораторная работа № 11).
Ниже показано, как с использованием оболочки phpMyAdmin создать базу данных shop и в ней таблицу book.
Как работает архитектура ПО Web-база данных. Распишем ее по шагам:
1. Web-браузер пользователя выдает HTTP-запрос определенной Web-страницы. Например, пользователь ищет в таблице book все книги, написанные Денисом Петровым, используя HTML-форму. Страница с результатами поиска будет называться results.php.
2. Web-сервер принимает запрос на results.php, извлекает этот файл и передает на обработку механизму РНР.
3. Механизм РНР приступает к разбору сценария. Сценарий содержит команду соединения с базой данных и выполнения запроса (поиска книг). РНР открывает соединение с MySQL-сервером и отправляет соответствующий запрос.
4. Сервер MySQL принимает запрос к базе данных, обрабатывает его и отправляет результат (список книг) обратно механизму РНР.
5. Механизм РНР завершает выполнение сценария, что обычно включает в себя форматирование результатов запроса в HTML. После этого результат в виде HTML возвращается Web-серверу.
6. Web-сервер пересылает HTML в браузер, и пользователь имеет возможность просмотреть запрошенный список книг.
У нас имеется база данных MySQL, поэтому можем подготовить код РНР, чтобы выполнялись предыдущие шаги. Начнем с поисковой формы. Это простая HTML-форма. Вид и код для этой формы показан ниже.
<html>
<body>
<h1>Магазин "КНИГИ" - Поиск в каталоге</h1>
<form action="results_.php" method="post">
Выберите тип поиска:<br>
<select name="search_type">
<option value="author">По автору</option>
<option value="title">По названию</option>
</select>
<br>
Введите информацию для поиска:<br />
<input name="search_term" type="text">
<br />
<input type="submit" value="Найти">
</form>
</body>
</html>
После нажатия кнопки «Найти» вызывается сценарий results.php. Код и результат работы этого сценария с результатами поиска показан ниже.
|
|
<html>
<body>
<h1>Магазин "КНИГИ" - Результаты поиска</h1>
<?php
// создание коротких имен переменных
$searchtype=$_POST['search_type'];
$searchterm=$_POST['search_term'];
$searchterm= trim($searchterm);
if (!$searchtype ||!$searchterm)
{
echo 'Вы не ввели параметры поиска.!!!';
echo '<p>'.$searchtype.'</p>';
echo '<p>'.$searchterm.'</p>';
exit;
}
$searchterm = addslashes($searchterm);
@ $db = mysql_pconnect('localhost', 'root', '');
if (!$db)
{
echo 'Ошибкат соединения с базой данных';
exit;
}
mysql_select_db('shop');
$query = "select * from book where ".$searchtype." like '%".$searchterm."%'";
$result = mysql_query($query);
$num_results = mysql_num_rows($result);
echo '<p>Найдено книг: '.$num_results.'</p>';
for ($i=0; $i <$num_results; $i++)
{
$row = mysql_fetch_array($result);
echo '<p><strong>'.($i+1).'. Название: ';
echo stripslashes($row['title']);
echo '</strong><br />Автор: ';
echo stripslashes($row['author']);
echo '<br />Цена: ';
echo $row['price'];
echo '</p>';
}
?>
</body>
</html>
Далее рассмотрим, что делает приведенный выше сценарий и как он работает.
Основные шаги выполнения запросов к базе данных через Web. В любом сценарии, который обеспечивает доступ к базе данных из Web, имеется несколько базовых шагов:
1. Проверка и фильтрация данных, исходящих от пользователя.
2. Установка соединения с требуемой базой данных.
3. Передача запроса в базу данных.
4. Получение результатов.
5. Представление результатов пользователю.
То же самое делает и сценарий results.php, и сейчас мы исследуем каждый из этих этапов.
Проверка и фильтрация данных, исходящих от пользователя. Сначала необходимо убрать все лишние пробелы по краям слова, которые мог случайно набрать пользователь. Справиться с этим поможет функция trim(), применяемая к $searchterm (критерий поиска).
$searchterm= trim($searchterm);
Следующий этап — убедиться, что пользователь указал критерий и тип поиска. Заметьте, это проверяется лишь тогда, когда критерий поиска не содержит лишние пробелы. Если поменять эти этапы местами, может возникнуть ситуация, когда критерий вроде, и введен, сообщения об ошибке быть не должно, однако критерий содержит только пробелы, которые полностью удаляются функцией trim():
|
|
if (!$searchtype ||!$searchterm)
{
echo 'Вы не ввели параметры поиска.!!!';
echo '<p>'.$searchtype.'</p>';
echo '<p>'.$searchterm.'</p>';
exit;
}
В этом случае выдается сообщение о том, что критерий поиска не введен.
Мы проверили переменную $searchtype даже в том случае, когда она поступает из оператора SELECT.
В случае использования в исходных данных управляющих символов, необходимо тщательно фильтровать вводимые данные от управляющих символов. При записи данных, введенные пользователем, в базу данных, следует вызывать addslashes(), а при возврате пользователю выходных данных — stripslashes().
В нашем случае к критерию поиска применяется функция addslashes():
$searchterm = addslashes ($searchterm);
К данным, исходящим из базы, применяется stripslashes().
Функцию htmlspecialchars() применяют для кодировки символов, которые в HTML имеют особое значение. Это могут быть знаки амперсандов (&), знаков "меньше" (<), "больше" (>), двойных кавычек ("). Использование этой функции страхует от грядущих ошибок.
Установка соединения. Для подключения к серверу MySQL в сценарии есть такая строка:
@ $db = mysql_pconnect('localhost', 'root', '');
Для подключения к базе данных используется функция mysql_pconnect() с прототипом:
int mysql_pconnect ([string host [:port] [:/socketpath]],
[string user], [string password]);
Потребуется указать имя узла (host), на котором размещен сервер MySQL, имя пользователя (user), чтобы войти в него, и пароль (password).
При успехе функция вернет идентификатор связи с базой данных (который следует сохранить для дальнейшего использования), а при неудаче — значение f alse. Результат не стоит игнорировать, поскольку без соединения с базой данных работа невозможна. Это делает следующий код:
if (!$db)
{
echo 'Ошибкат соединения с базой данных';
exit;
}
Выбор базы данных. Работая с MySQL, необходимо указывать, какая база данных нужна. Это может сделать РНР-функиия mysql_select_db():
mysql_select_db("books");
Прототип этой функции выглядит так:
int mysql_select_db(string database, [int database_connection]);
В результате будет использоваться база данных с именем database. Можно также использовать соединение с базой данных, для которого требуется выполнить эту операцию (в нашем случае $db), однако, если его не указать, будет использоваться последнее открытое соединение. Если открытое соединение не существует, оно открывается по умолчанию, как если бы вызывалась mysql_connect().
Выполнение запроса к базе данных. Чтобы осуществить запрос, можно воспользоваться функцией mysql_query(). Однако прежде запрос необходимо настроить:
$query = "select * from books where ".$searchtype." like '%".$searchterm."%'";
В этом случае будет отыскиваться значение, введенное пользователем ($searchterm), в поле, которое указал пользователь ($searchtype). Обратите внимание на то, что мы употребили like, отдав ему предпочтение перед equal — толерантность никогда не бывает излишней. Не забывайте, что запрос, отправляемый вами в MySQL, не требует в конце точки с запятой, в отличие от запроса, который вводится в среде монитора MySQL.
Теперь можно выполнить запрос:
$result = mysql_query ($query);
Прототип функции mysql_query() таков:
int mysql_query(string query, [int database_connection]);
В функцию передается запрос, который должен быть выполнен; можно также передать еще и соединение с базой данных (в нашем случае $db). Если его не указать, будет использоваться последнее открытое соединение. Если такового нет, функция откроет соединение точно так же, как при выполнении mysql_connect().
Вместо этого можно воспользоваться функцией mysql_db_query() Рассмотрим ее прототип: