Теоретический материал

Лабораторная работа №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() Рассмотрим ее прототип:


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: