Название: WEB- программирование (А.В. Гунько)

Жанр: Информатика

Просмотров: 1812


Лабораторная работа  №  4

 

PHP. Работа с базой данных MySQL

 

1. Цель работы

 

Изучить синтаксис языка, методы аутентификации пользователей и управления сеансами, освоить процедуру подключения к базе данных, реализацию операций выборки, вставки, изменения и удаления записей в базе данных средствами языка сценариев PHP.

 

2. Краткие теоретические сведения

 

Как и в ASP, в сценариях PHP-код внедряется в теги HTML. Есть такие способы выхода из HTML и перехода в «режим PHP-кода»:

1. <? echo("простейший способ, инструкция обработки SGML "); ?>

2. <?php echo("при работе с XML документами делайте так "); ?>

3. <script language ="php">

    echo ("некоторые редакторы (подобные FrontPage) не любят обрабатывающие инструкции");

    </script>

4. < \% echo("От PHP 3.0.4 можно применять ASP-тэги"); \% >

Чтобы работать с данными, переданными сценарию, используются переменные (начинаются символом $) с именами, присвоенными и соответствующим элементам HTML:

<? if (!isset($name)) {?>

<form action="form.php" method ="post" >Name:<input type ="text" name="name"><br><input type= "submit"></form>

<? } else {echo "Your name is: $name";} ?>

Если PHP-атрибут track_vars включен через установку конфигурации track_vars или директивой < ?php_track_vars? >, тогда переменные, активизированные посредством методов POST или GET, будут также находиться в глобальных ассоциативных массивах $HTTP_POST_VARS и $HTTP_GET_VARS соответственно.

Для подключения к базе данных используется функция:

int mysql_pconnect ([string host[:port], [string user], [string password]);

Требуется указать имя узла (host), на котором размещен сервер MySQL, имя пользователя (user), чтобы войти в него, и пароль (password):

@ $db = mysql_pconnect ("localhost", "bookorama", "bookorama");

При успехе функция вернет идентификатор связи с базой данных, а при неудаче – значение false. Результат стоит проверить:

if (!$db) {echo "Error: Could not connect to database."; exit; }

Работая с MySQL, можно указать, какая база данных нужна, с помощью функции: mysql_select_db("books").

При этом будет использоваться последнее открытое соединение. Если открытое соединение не существует, оно открывается по умолчанию, как при вызове mysql_connect().

Далее необходимо настроить запрос:

$query = "select * from books";

Запрос, отправляемый в MySQL, не требует в конце точки с запятой, в отличие от запроса, который вводится в среде монитора MySQL.

Теперь можно выполнить запрос:

$result = mysql_query ($query);

В функцию можно также передать и соединение с базой данных (в нашем случае $db). Если его не указать, будет использоваться последнее открытое соединение. Если такового нет, функция откроет соединение точно так же, как при выполнении mysql_connect().

Вместо этого можно воспользоваться функцией:

int mysql_db_query(string database, string query, [int database_connection]);

В каком-то смысле это комбинация функций mysql_select_db() и mysql_query(). Обе функции возвращают идентификатор результата в случае успеха и значение false в случае неудачи. Идентификатор результата следует сохранить, это ключ доступа к строкам, возвращенным запросом, которых может быть нуль, одна и более.

Функция mysql_num_rows() сообщает количество строк, которые возвращает запрос. В нее следует передать идентификатор результата:

$num_results = mysql_num_rows($result);

Зная количество строк, можно организовать цикл:

for ($i = 0; $i <num_results;  $i++) {// обработка  результатов }

На каждой итерации цикла можно вызвать mysql_fetch_array(). Эта функция берет каждую строку из списка результата и возвращает ее в виде ассоциативного массива, с ключом как именем атрибута и значением как соответствующим значением массива:

$row = mysql_fetch_array($result);

Имея $row в ассоциативном массиве, можно пройти каждое поле и отобразить его.

Существуют несколько вариантов получения результата из идентификатора результата.

Вместо ассоциативного массива можно воспользоваться нумерованным массивом:

$row = mysql_fetch_row($result);

Значения атрибутов будут храниться в каждом порядковом значении $row[0], $row[l].

С помощью функции mysql_fetch_object() можно выбрать строку внутрь объекта:

$row = mysql_fetch_object ($result);

После этого к атрибутам можно получить доступ через $row->title, $row->author.

Каждый из этих вариантов подразумевает выборку строки за раз. Другой вариант — получить доступ, используя mysql_result(). Для этого потребуется указать номер строки (от

0 до количества строк минус 1) и название поля, например:

$row = mysql_result($result, $i, "title");

Название поля можно задать в виде строки (либо в форме "title" либо в форме books.title") или номером (как в mysql_fetch_row()). He стоит смешивать mysql_result() с другими функциями выборки. Строчно-ориентированные функции выборки намного более эффективны, нежели mysql_result(), так что лучше использовать одну из них.

Для закрытия непостоянного соединения применяется функция:

mysql_close(database_connection);

Однако с завершением выполнения сценария соединение закроется автоматически.

Внесение новой информации очень похоже на получение существующей. Только в данном случае вместо SELECT будет использоваться INSERT:

$query ="insert into books

values('".$id."','".$author."','".$title."')";

$result = mysql_query($query);

if ($result) echo mysql_affected_rows()."row(s) inserted.";

Если во время выполнения сценария возникают проблемы, связанные с нехваткой памяти, пригодиться функция mysql_free_result(). Она вызывается с идентификатором результата:

mysql_free_result($result);

и освобождает память, занимаемую результатом. Очевидно, что до обработки результата эта функция вызываться не должна.

Просьба к пользователю доказать свою личность называется аутентификацией. Обычный метод аутентификации в Web – это требование к посетителям предоставить уникальное имя пользователя и пароль. Аутентификация обычно используется для разрешения или запрещения доступа к определенным страницам или ресурсам.

Самый простой способ аутентификации – запрос имени пользователя и пароля через форму и сравнение их с данными, хранящимися прямо в сценарии, текстовом файле или базе данных.

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

if ($PHP_AUTH_USER != "user" || $PHP_AUTH_PW != "pass")

{ header('WWW-Authenticate: Basic realm="Restricted area"');

  header("HTTP/1.0 401 Unauthorized");

echo "<h1>Go Away!</h1>";}

else {echo "<h1>Here it is!</h1>"};

Но наилучший вариант – управление сценариями. Для запуска сеанса в РНР используется уникальный идентификатор сеанса, представляющий собой зашифрованное случайное число. Идентификатор сеанса генерируется РНР и сохраняется на стороне клиента в течение всего времени жизни сеанса. Для хранения идентификатора сеанса используется либо cookie-набор на компьютере пользователя, либо URL.

Чтобы воспользоваться функциональными возможностями сеанса, следует запустить сам сеанс. Существует три способа сделать это.

В первом способе сценарий начинается с вызова функции session_start(). Она проверяет, существует ли идентификатор текущего сеанса. Если нет, она его создает. Если да, то она загружает зарегистрированные переменные сеанса, чтобы они стали доступными для использования.

Второй способ заключается в том, что сеанс запускается при попытке зарегистрировать переменные сеанса. Например, для регистрации переменной $myvar применяется код:

$myvar = 5; session_register("myvar");

Третий способ запустить сеанс – задать установки РНР, при которых сеанс будет запускаться автоматически. Для этого установите опциею session.auto_start в файле php.ini. Если опция register_globals включена, то доступ к этой переменной можно получить через сокращенную форму ее имени, например, $myvar. Если же упомянутая опция не включена, получить доступ к переменной можно через ассоциативный массив:

$HTTP_SESSION_VARS ["myvar"];

Переменные сеанса не могут быть перезаписаны данными GET или POST. Проверить, является ли переменная зарегистрированной переменной сеанса, можно так:

$result = session_is_registered("myvar");

После окончания работы с переменной сеанса ее регистрацию можно отменить, воспользовавшись функцией:

session_ unregister("myvar");

Она за один раз может отменить регистрацию только одной переменной сеанса (в противоположность session_register()). Для отмены регистрации всех переменных текущего сеанса можно обратиться к session_unset().

По завершении сеанса сначала потребуется отменить регистрацию всех переменных, а затем для обнуления идентификатора сеанса вызвать session_destroy().

 

3. Методические указания

 

3.1. Для копирования файлов на Web-сервер используйте имеющиеся на локальном компьютере ftp-клиенты, например, файловый менеджер FAR. Он позволяет редактировать файлы непосредственно на ftp-сервере.

3.2. При написании сценариев обращайте внимание на кодировку русского текста, правильность написания HTML-тегов, имен переменных и функций PHP, парность открывающих и закрывающих кавычек в операторе echo.

3.3. При отладке сценариев обновляйте содержимое окна браузера при нажатой клавише Shift. Для запрета кэширования web-страниц на локальном диске формируйте в сценариях заголовок header(expires ='-1d').

3.4. По окончании отладки сценариев скопируйте их на локальный компьютер для сохранения и распечатки.

 

4. Порядок выполнения работы

 

4.1. Разработать алгоритмы сценариев извлечения, добавления, изменения и удаления записей в базе данных согласно варианту.

4.2. Используя выданные преподавателем учетные записи (user№) и пароли, подключиться по протоколу ftp к серверу ait.cs.nstu.ru, перейти в папку public_html.

4.3. Создать файл сценария извлечения записей из базы данных в соответствии со структурой своей базы данных. Из браузера обратиться по адресу http://ait.cs.nstu.ru/~user№/имяфайла.php, убедиться в наличии прав доступа к базе данных. При необходимости изменения прав доступа обратиться к преподавателю.

4.4. На локальном компьютере создать сценарии, реализующие операции аутентификации пользователей, создания сеанса, извлечения по условию, добавления, изменения и удаления записей, сценарий меню для выбора операции, по протоколу ftp скопировать их на сервер ait.cs.nstu.ru.

4.5. Отладить сценарии, продемонстрировать их работоспособность преподавателю.

4.6. Сохранить на локальной машине и распечатать файлы отлаженных сценариев.

 

5. Варианты заданий

 

Задания различаются структурой базы данных, регистрационными записями и паролями пользователей, имеющих права доступа к ней, реализованными в соответствии с заданиями к лабораторной работе № 1.

 

6. Содержание отчета

 

6.1. Цель работы.

6.2. Вариант задания.

6.3. Структура базы данных в графическом виде.

6.4. Листинги сценариев.

 

7. Контрольные вопросы

 

7.1. Внедрение кода PHP в HTML.

7.2. Методы аутентификации пользователей, их достоинства и недостатки.

7.3. Сеансы, их назначение, создание, управление сеансами.

7.4. Атрибуты форм, влияющие на отправку данных.

7.5. Методы проверки способа передачи данных в сценарий.

7.6. Процедура подключения к базе данных из PHP.

7.7. Формирование и выполнение запроса к базе данных.

7.8. Перемещение по записям, извлеченным из базы данных.

7.9. Извлечение данных из полей записи.