Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
metoda / Ml_ITIn_2013.docx
Скачиваний:
44
Добавлен:
16.03.2016
Размер:
17.5 Mб
Скачать

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

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

54

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

Программирование с использованием PHP и MySQL

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

Получение навыков программирования и использования баз данных.

2. Основные сведения

Тема №1

Создание форм

Цель работы: Получение практических навыков по созданию форм в документах HTML.

Тема №2

Передача значений переменным в сценариях PHP. Использование возможностей метода GET без HTML-формы для передачи значений переменных в сценариях PHP

Цель работы: Получение практических навыков по передаче значений переменным в сценариях РНР с использованием формы и с помощью метода

GET.

Тема №3

Создание формы и РНР-сценария в одном файле

Цель работы: Получение навыков и понимание взаимосвязанной работы формы и ее обработки.

Тема №4

Использование чисел. Управляющие структуры For и While

Цель работы: работа с численными данными в форме.

Тема №5

Использование управляющей структуры switch

Цель работы: Обучение применению структуры switch.

Тема №6

Использование регулярных выражений в сценариях РНР

Цель работы: Получение практических навыков в использовании регулярных выражений при обработке форм.

Тема №7

Работа с массивами

Цель работы: Обучение использованию массивов в сценариях PHP.

55

Тема №8

Использование функций в сценариях РНР

Цель работы: Получение навыков по применению функций в PHP при обработке сценариев.

Тема №9

Использование файлов для хранения данных в сценариях РНР

Цель работы: Обучение работе с файлами для хранения данных при обработке сценариев.

Тема №10

Работа с каталогами

Цель работы: Получение практических навыков по работе с деревом каталогов.

Тема №11

Создание панели управления файлами

Цель работы: Получение практических навыков по обработке файлов в сценариях.

Тема №12

Работа с базой через монттор MySQL и PhpMyAdmin.

Цель работы: Изучение команд MySQL для хранения, выборки и обработки данных с использованием монитора MySQL и средств

PhpMyAdmin.

Тема №13.

Извлечение данных из базы данных

Цель. Практическое использование конструкций SQL.

Тема №14.

PHP и MySQL. Доступ к базе данных MySQL из Web с помощью

РНР.

Цель работы: Получение практических навыков по связке MySQL и

PHP.

3. Указания к выполнению работы

Исходные темы и данные для тем, студент выбирает самостоятельно, но последние две темы являются обязательными для всех. Число рассмотренных тем в Вашей лабораторной работе №3 не может быть меньше чем 7. В пункте 5 приведены исходные коды и формы, использованные в вышеперечисленных темах. Если в качестве целевой СУБД Вы использовали другую систему – то требования к выбору тем не меняются.

56

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

Исходные тексты программ.

Результаты тестирования, полученные с помощью диагностических программ.

5. Примеры реализации тем

Тема №1. Создание форм

Цель работы: Получение практических навыков по созданию форм в документах HTML.

Задание 1. Разработать HTML-форму с переключателями

вида (рис. 3.1).

Рис. 3.1. HTML форма.

Исходный код (файл lab1.php) представлен ниже (рис. 3.2.).

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"> <head>

<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" /> <title>Lab1</title>

</head>

<body>

<body bgcolor=#99CCCC>

<form method=post action=""> <!--Начало формы-->

57

<table>

<tr>

<td valign=top>Текстовое поле</td>

<td><input type=text name="text1" value="Значение text1 не более 255 символов,size=50" size=50></td>

</tr>

<tr>

<td valign=top>Текстовое поле PASSWORD</td>

<td><input type=password name="pwd" value="Пароль- password"></td> </tr>

<tr>

<td valign=top>Текстовое поле TEXTAREA</td>

<td><textarea name="text2" rows=4 cols=30>Текст длина которого может превышать 255 символов. Показывать строк rows=4</textarea></td>

</td>

<tr>

<td valign=top>Переключатели CHECKBOX</td> <td>

<input type=checkbox name="chk1" value="on" checked> Первый<br> <input type=checkbox name="chk2" value="on" > Второй<br>

<input type=checkbox name="chk3" value="on" checked> Третий<br>

</td>

</tr>

<tr>

<td valign=top>Переключатели RADIO</td>

<td>

<input type=radio name="rad" value="on1" checked>Первый<br> <input type=radio name="rad" value="on2" >Второй<br>

<input type=radio name="rad" value="on3" checked>Третий<br>

</td>

</tr>

<tr>

<td valign=top>List</td> <td><select name="sel" size=1>

<option value="first option">First option</option> <option value="second option">Second option</option>

<option value="none">Нет выбора</option>

</select>

</tr>

<tr>

<td valign=top>Скрытый орган управления</td>

<td><input type=hidden name="hid" value="hidden"</td> </tr>

</table>

<br>

<input type=submit value="Переслать" /> <!-- --> <input type=reset value="Reset">

</form> <!--Конец формы-->

</body>

</html>

Рис. 3.2. Код HTML формы.

58

Ниже приводится описание основных конструктивных элементов, использованных при создании формы (рис. 3.1), представленных в коде рис. 3.2.

Теги <form> и </form>

Теги <form> и </form> задают начало и конец формы. Начинающий форму тег <form> содержит два атрибута: action и method. Атрибут action содержит адрес URL сценария, который должен быть вызван для обработки сценария (на рис. 3.2. обработчик событий не указан action=""). Атрибут method указывает браузеру, какой вид HTTP запроса необходимо использовать для отправки формы; возможны значения POST и GET (на рис. 3.2. указан метод method=post).

Главное отличие методов POST и GET заключается в способе передачи информации. В методе GET параметры передаются через адресную строку, т.е. по сути в HTTP-заголовке запроса, в то время как в методе POST параметры передаются через тело HTTP-запроса и никак не отражаются на виде адресной строки.

Допустима запись:

<form method="post" action="../admin/add.php">

</form>

Текстовое поле (text)

Позволяет пользователям вводить различную информацию.

<input type="Тип" name="Имя поля" size="Размер" maxlength="Макс.

количество символов">

При создании обычного текстового поля размером size и максимальной допустимой длины maxlength символов, атрибут type принимает значение text. Если указан параметр value, то поле будет содержать отображать value-текст. При создании поля не забывайте указывать имя поля, т.к. этот атрибут является обязательным.

Например:

<input type="text" name="txtName" size="10" maxlength="5" value="Текст по умолчанию">

Поле для ввода пароля (password)

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

Например:

<input type="password" name="txtName" size="10" maxlength="5">

59

Многострочное поле ввода текста (textarea)

Многострочное поле ввода текста позволяет отправлять не одну строку, а сразу несколько. По умолчанию тег создает пустое поле шириной в 20 символов и состоящее из двух строк.

<textarea name="Имя поля" cols="Ширина поля " rows="Число строк">Текст</textarea>

Многострочное поле ввода текста начинается с парных тегов <textarea></textarea>. Тэг name задает имя многострочного поля. Также можно указать ширину поля(cols) и число строк(rows). При необходимости можно указать атрибут readonly, который запрещает редактировать, удалять и изменять текст, т.е. текст будет предназначен только для чтения. Если необходимо чтобы текст был изначально отображен в многострочном поле ввода, то его необходимо поместить между тэгами <textarea></textarea>.

Например:

<textarea name="txtArea" cols="15" rows="10" readonly>

Текст, который изначально будет отображен в многострочном поле ввода и который нельзя изменять, т.к. указан атрибут readonly </textarea>

Флажок (checkbox)

Флажки checkbox предлагают пользователю ряд вариантов, и разрешает выбор нескольких из них.

Группа флажков состоит из элементов <input>, имеющих одинаковые атрибуты name и type(checkbox). Если вы хотите, чтобы элемент был отмечен по умолчанию необходимо пометить его как checked. Если элемент выбран, то сценарию поступит строка имя=значение, в противном случае в обработчик формы не придет ничего, т.е. не выбранные флажки вообще никак не проявляют себя в переданном наборе данных.

Например:

<input name="mycolor" type="checkbox" value="red" checked>Красный(выбран по умолчанию)

<input name="mycolor" type="checkbox" value="blue">Синий <input name="mycolor" type="checkbox" value="black">Черный <input name="mycolor" type="checkbox" value="white">Белый

Переключатель(radio)

Переключатели radio предлагают пользователю ряд вариантов, но разрешает выбрать только один из них.

<input name="Имя переключателя" type="Тип" value="Значение"> Переключатель (radio) имеет атрибуты name, type и value. Атрибут name задает имя переключателя, type задает тип radio, а атрибут value задает значение. Если пользователь выберет переключатель, то сценарию будет передана строка имя=значение. При необходимости можно указать параметр checked, который указывает на то, что перключатель будет иметь фокус (т.е.

60

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

Например:

<input name="mycolor" type="radio" value="white"> Белый

<input name="mycolor " type="radio" value="green" checked> Зеленый

(выбран по умолчанию)

<input name="mycolor " type="radio" value="blue"> Синий <input name="mycolor " type="radio" value="red"> Красный <input name="mycolor " type="radio" value="black"> Черный

Скрытое текстовое поле (Скрытый орган управления)

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

<input name="Имя" type="Тип" value="Значение">

Скрытое поле начинается с тега <input>, атрибуты которого являются name, type и value. Атрибут name задает имя поля, type определяет тип поля, а атрибут value задает значение поля.

Например:

<input name="email" type="hidden" value="spam@nospam.ru">

Кнопка отправки данных формы (submit) Служит для отправки формы сценарию.

<input type="Тип" name="Имя кнопки" value=" текст_на_кнопке ">

При создании кнопки для отправки формы необходимо указать 2 атрибута: type=―submit‖ и value=‖Текст кнопки‖. Атрибут name необходим, если кнопка не одна, а несколько и все они созданы для разных операций, например кнопки "Сохранить", "Удалить", "Редактировать" и т.д. После нажатия на кнопку сценарию передается строка имя=текст кнопки.

Кнопка отправки данных

Кнопка отправки данных инициирует действие, заданное атрибутом action тега <form>. Синтаксис определения:

<input type="submit" value=" текст_на_кнопке">

Определение кнопки включает два атрибута:

type -- тип элемента (для кнопки отправки данных -- submit); value -- текст, по умолчанию отображаемый на кнопке.

Кнопка сброса формы (Reset)

Кнопка сброса отменяет все изменения, внесенные в элементы формы. <input type="Тип" name="Имя кнопки" value="Надпись на кнопке">

61

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

Например:

<input type="reset" name="Reset" value="Очистить форму">

<input type="reset" value="текст_на_кнопке">

Определение кнопки включает два атрибута: type -- тип элемента (для кнопки сброса -- reset);

value -- текст, по умолчанию отображаемый на кнопке.

Кнопка сброса выглядит точно так же, как и кнопка отправки данных, если не считать того, что на ней обычно выводится слово «Reset» (рис. 3.1).

62

Задание 2: Разработать HTML-форму с методом Post

вида (рис. 3.3).

Рис. 3.3. Пример 2 HTML формы.

Код Lab1_2.php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"> <head>

<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />

<title> Lab1_2</title> </head>

<body bgcolor=#ffacb3>

<b>Регистрационная страница электронной библиотеки</b>

63

<p>Заполнив анкету, вы сможете пользоваться нашей электронной библиотекой

<p><form methos="post" action=""> <table>

<tr>

<td>Введите регистрационное имя</td>

<td><input type=text name="text1" value="" ></td> </tr>

<tr>

<td>Введите пароль</td>

<td><input type=password name="pwd" value=""></td> </tr>

<tr>

<td>Подтвердите пароль</td>

<td><input type=password name="pwd" value=""></td> </table>

<p>

Ваш возраст

<input type=radio name="r1" value="on1" checked>До 20 <input type=radio name="r2" value="on2" >20-30

<input type=radio name="r3" value="on3" >30-50 <input type=radio name="r4" value="on3" >старше 50

<p> На каких языках читаете:

<input type=checkbox name="ch1" value="on" checked>русский <input type=checkbox name="ch2" value="on" >английский <input type=checkbox name="ch3" value="on" >французский <input type=checkbox name="ch3" value="on" >немецкий

<p>Какой формат данных является для вас предпочтительным?

<p><select name="sel" size=2>

<option value="html" selected>HTML</option> <option value="plain">Plain text</option> </select><p>

Ваши любимые авторы:

<p><textarea name="text2" rows=3 cols=30></textarea> <br>

<input type=submit value="OK">  <input type=reset value="Отменить"> </form>

<?php echo "<p>Проверка PHP Лабораторные по базам данных</p>";

?>

<table width="690" border="1" align="center" bgcolor="#FFFFFF"> <tr>

<td><img src="img/footer.jpg" width="690" height="18" alt="Сайт Должен проявиться по наведению мышки"/td>

</tr>

</table>

<center>

Сегодня замечательный день. <br>Я сделал свою первую интернет страничку.

64

<br><font color="#0000FF">я буду богатым и свободным человеком !</font>

<br>

</center>

</body>

</head>

Рис. 3.4. Код HTML формы для примера 2 рис. 3.3.

В приведннном коде на рис. 3.4 использованы две новые конструкции:

выпадающий список (select)

<p><select name="sel" size=2>

<option value="html" selected>HTML</option> <option value="plain">Plain text</option> </select><p>

и использование рисунков (img) в форме

<td><img src="img/footer.jpg" width="690" height="18" alt="Сайт Должен проявиться по наведению мышки"/td>

Выпадающий список (select)

Тэг <select> представляет собой выпадающий или раскрытый список, при этом одновременно могут быть выбраны одна или несколько строк.

Список начинается с парных тегов <select></select>. Теги <option></option>

позволяют определить содержимое списка, а параметр value определяет значение строки. Если в теге <option> указан параметр selected, то строка будет изначально выбранной. Параметр size задает, сколько строк будет занимать список. Если size равен 1, то список будет выпадающим. Если указан атрибут multiple, то разрешено выбирать несколько элементов из списка(при size = 1 не имеет смысла).

<select name="Имя списка" size = ―Размер‖ multiple>

<option value=‖Значение‖>Отображаемый текст в списке</option>

</select>

При передаче данных выпадающего списка сценарию передается строка имя=значение, а при раскрытом списке передается строка имя=значение1&имя=значение2&имя=значениеN.

65

Тема №2. Передача значений переменным в сценариях PHP. Использование возможностей метода GET без HTML-формы для передачи значений переменных в сценариях PHP

Цель работы: Получение практических навыков по передаче значений переменным в сценариях РНР с использованием формы и с помощью метода

GET.

Задание 1: Разработать приложение с использованием метода GET,

в котором:

Создается форма ввода (см. рис. 3.5.) помощью программы Lab2.php (см. рис. 3.6.) для введения пользователем данных:

Имени;

Фамилии;

Адреса электронной почты;

Текста - комментария.

Введенные данные PHP-сценарий Lab2_result.php получает данные с формы

.

Отображает извлеченные из формы данные в окне браузера.

Сценарий должен сгенерировать отправку данных в другой PHP-файл, который в свою очередь должен отобразить персональное приветствие пользователю.

Имена использоаванных и взаимосвязанных файлов: Lab2.php (описание и создание формы – рис. 3.6.), Lab2_result.php (обработчик событий для Lab2.php), Lab2_GET.php (использование метода Get)

В форму созданную с помощью Lab2.php (описание и создание формы) введите, например следующую информацию (рис. 3.5.)

Рис. 3.5. Форма с обработчиком на кнопке ―OK‖ .

Исходный код Lab2.php (создание формы).

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

66

<html xmlns="http://www.w3.org/1999/xhtml"> <head>

<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" /> <title>Lab2</title>

</head>

<body bgcolor=#CCFFFF>

<form action="Lab2_result.php" method="POST"> <!--Lab2_result.php Обработчик для данной HTML формы. --> <!--В указании имени method надо указывать ковычки !!! --> <table>

<tr>

<td> Введите Ваше имя: <br></td><!--имя атрибута на экране--> <td><input type=text name="FName" size=20></td>

</tr>

<tr>

<td>Last Name</td><!--имя атрибута на экране--> <td><input type=text name="LName" size=20></td> </tr>

<tr>

<td>E-mail</td><!--имя атрибута на экране--> <td><input type=text name="Email" size=40></td> </tr>

<tr>

<td> Примечание </td><!--имя атрибута на экране--> <td><textarea name="Comments" rows=5 cols=40></textarea></td> </tr>

</table>

<input type=submit name="Submit" value="OK">  <input type=reset name="Reset" value="Очистить">

<!--Нажатие кнопки name="Submit" с именем value="OK" приведет к вызову

обработчика данной формы (к аналогичному действию приведет нажатие Enter на любом из полей). Нажатие кнопки name="Reset" с значением value="Cancel" (Очистить) приведет к уничтожению всех объявленных переменных в форме.

&nbsp - непрерывный пробел

Веб-браузеры обычно игнорируют дополнительные символы пробела, введенные в текст страницы. Для этого используется команда &nbsp. Эта команда создает неделимое пустое пространство между элементами страницы, будь то графика или текст. Следует учитывать тот факт, что использование &nbsp вместо пробела между двумя соседними словами гарантирует, что оба слова не будут разнесены по разным строкам в окне браузера - они будут расположены всегда рядом.

--> </form> </body> </html>

Рис. 3.6. Код создания формы для рис. 3.5.

67

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

Рис. 3.7. Результат обработки события после нажатия кнопке ―OK‖ на рис. 3.5.

Код программы (Lab2_result.php), который приводит к этому результату приведен ниже (рис. 3.8).

Lab2_result.php (обработчик для кнопки ―OK‖)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"> <head>

<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />

<title>Lab2_обработчик</title>

Информация попадает в обработчик - программа Lab2_result.php </head>

<body bgcolor=#FFFFFF><!--Цвет фона белый--> <?PHP

print("<br>В обработчике переменные из HTML кода Lab2.php напрямую не доступны! <br>");

print("Имя переменная FName is: $FName <br>"); print("Указана фамилия is: $LName <br>"); print("e-mail is: $Email <br>"); print("Комментарий: $Comments <br>");

68

print("Через массив POST переменные наверняка будут доступны<br>");

$FName = $_POST["FName"];

print("Имя FName $FName передано через глобальный POST: $_POST[FName] <br>");

//а как указано ниже - даст ошибку

//print("Имя FName $FName передано через глобальный POST: //$_POST['FName'] <br>");

print("Указана фамилия is: $_POST[LName] <br>"); print("e-mail is: $_POST[Email] <br>");

print("В примечании указано $_POST[Comments] <br>");

print("Click <a href=Lab2_GET.php?FName=$FName&LName=$_POST[LName]>here</a>

здесь, чтобы посмотреть как работает метод GET");

//После знака '?' перечислены переменные, которые должны быть //доступны в программе Lab2_GET, которая вызывается по ссылке, //если пользователь кликнет на слове here, то будет вызвана //программа Lab2_GET.php с указанными переменными

//Слово here может быть заменено на смысловое русское слово

?>

</body>

</html>

Рис. 3.8. Код программы обработки события на кнопке ―OK‖.

Если выполнить действие

то будет вызвана программа Lab2_GET.php (рис. 3.10.) результат (рис. 3.9) и исходный код, которой приведен ниже.

Рис. 3.9. Результат обработки события по ссылке HERE.

Обратите внимание на содержимое адресной строки при выводе результата.

69

Код Lab2_GET.php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"> <head>

<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />

<title>Lab2_GET</title> </head>

<body>

<?PHP

//реакция при нажатии на ссылку, см. файл Lab2_GET.php слово

Here

$FName = $_GET['FName']; $LName = $_GET['LName'];

print("<center> Hello из Lab2_GET Имя:'$FName' Фамилия: ' $LName '!!!</center>");

//А так будет ошибка print("<center> Hello из Lab2_GET Имя $FName $Lname !!!</center>");

?>

</body>

</html>

Рис. 3.10. Исходный код программы Lab2_GET.php.

В данной лабораторной работе были получены практические навыки по передаче данных в РНР-сценарий с помощью HTML-форм и с помощью метода GET.

70

Тема №3. Создание формы и РНР-сценария в одном файле

Цель работы: Получение навыков и понимание взаимосвязанной работы формы и ее обработки.

Обработка форм

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

Задание 1: Получение данных из текстового поля

Вам необходимо получить данные из текстового поля и многострочного поля ввода и передать их сценарию.

Решение: Необходимо создать HTML форму и PHP – сценарий для обработки формы.

Создадим два файла: form.html и action.php. В файле form.html будет содержаться html-форма с текстовым полем mytext и текстовой областью msg:

<form action="action.php" name="myform" method="post"> <input type="text" name="mytext" size="50">

<textarea name="msg" cols="20" rows=‖10‖ ></textarea>

<input name="Submit" type=submit value="Отправить данные"> </form>

В этой html-форме нас интересует три элемента: action, который указывает путь к обработчику формы (action.php), имя текстового поля (mytext) и имя многострочного поля вода (msg). Также в форме присутствует кнопка (Submit), при нажатии на которую, происходит передача данных.

После того как html-форма готова, необходимо создать обработчик формы action.php:

<?php

$text = $_POST['mytext']; $msg = $_POST['mytext'];

echo $text; // Выводим содержимое текстового поля

?>

После того как мы введем любые значение в текстовые поля и нажмем на кнопку "Отправить данные" html-форма отправит значения сценарию action.php.

После этого в переменных $text и $msg будут содержаться значения текстового поля и многострочного поля ввода соответственно, значения которых взяты из суперглобальных переменных $_POST.

71

Если вы хотите, чтобы в многострочном текстовом поле соблюдалось html-форматирование, то используйте функцию nl2br():

<?php

$text = nl2br($_POST['mytext']); ?>

Задание 1.: Разработать приложение, в котором:

Создается форма ввода (см. рис. 3.11.) помощью программы Lab3.php (см. рис. 3.12.) для введения пользователем данных:

Имени;

Фамилии;

Адреса электронной почты;

Текста - комментария.

Информация указанных данных должна быть охвачена рамкой

(fieldset).

Введенные данные обабатываются этим же PHP-сценарием Lab3.php (при нажатии кнопки ―OK‖ или Enter на поле ввода). В программе показана реализация ограничения, требующего обязательного ввода значения поля Фамилия. Если поле Фамилия будет означено и нажата кнопка ―OK‖, то необходимо вызвать программу Lab3_1.php, в которую необходимо передать зашифрованную информацию.

Lab3_1.php должна отобразить данные в окне браузера.

Рис. 3.11. Форма созданная с помощью программы Lab3.php с введенными данными.

72

Исходный код программы Lab3.php создающий форму средствами

PHP:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"> <head>

<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" /> <title>Lab3 Anketa</title>

</head>

<h1 align="justify" >Анкета </h1><!--Заголовок формы--> <!--justify: строки текста выравниваются по обоим краям.-->

<fieldset style="width: 50%" align="right">

<legend>Ввод исходных данных (заголовок рамки)</legend>

<body bgcolor=><!--по умолчанию белый фон формы-->

<?PHP //тело PHP блока для создания и обработки формы

if (!isset($_POST[Submit]))

{

//echo "Кнопку Submit=OK еще не нажимали <br>";

//Создание формы и описание ее объектов.

print("<form action=\"Lab3.php\" method=POST>"); print("<table> <tr><td> Имя </td>");

print("<td><input type=text name=\"FirstName\" size=20></td></tr>"); print("<tr><td>Фамилия</td>");

print("<td><input type=text name=\"LastName\" size=20></td></tr>"); print("<tr><td>E-mail</td>");

print("<td><input type=text name=\"Email\" size=40></td></tr>"); print("<tr><td> Комментарий</td>");

print("<td><textarea name=\"Comments\" rows=5 cols=40></textarea></td></tr></table>");

print("<input type=submit name=\"Submit\" value=\"OK\"> "); print("<input type=reset name=\"Reset\" value=\"Отмена-Cancel\">"); //print("<input type=reset name=\"Reset\" value=\"Cancel\">//");

print("</form>");

}

else

{//Вывод введенных данных

$FirstName=trim($_POST[FirstName]); $iFirstName=$FirstName;

73

echo "Вышли из формы, нажав кнопку OK. Вывод значений переменных <br>";

$LastName=trim($_POST[LastName]); if (empty($LastName))

{//проверка на пустое значение переменной $LastName- Фамилия echo '$LastName Не введена. Введите Фамилию ';

exit; //выйти из программы

}

$Email=trim($_POST[Email]); $Comments=trim($_POST[Comments]); $Name=$FirstName." ".$LastName;

print("Ваше имя Firstname is: $FirstName <br>"); print("Ваша фамилия is: $LastName <br>"); print("Ваш e-mail is: $Email <br>");

print("В поле комментария было: $Comments <br>"); $FirstName=md5($FirstName);//шифруем имя

print("Шифрованное имя через md5(Firstname) - is $FirstName <br>"); print("Конкатенация Имени и фамилии: $Name <br>"); $Name=urlencode($Name);

print("urlencode Имени и фамилии: $Name <br>");

print("Click <A href=\"Lab3_1.php?Name=$Name\">here</a> здесь и будет вызвана Lab3_1.php с параметром Name=<br> $Name, ввели имя=".$iFirstName);

//Действие каждого из 6-и ниже стоящих операторов //эквивалентно действию вышестоящего оператора

//print (" <a href=Lab3_1.php?Name=$Name> here</a> "); //print " <a href=Lab3_1.php?Name=$Name> here</a> "; //echo ("<br><a href='Lab3_1.php?Name=$Name'> here</a>"); //echo "<br><a href='Lab3_1.php?Name=$Name'> here</a>";

//echo "<br><a href='Lab3_1.php?Name=$Name'> См.далее</a>"; //print("Click <A

href=\"http://localhost/PHP/Lab3_1.php?Name=$Name\">here</a> здесь и будет вызвана Lab3_1.php с параметром $Name, ввели имя=".$iFirstName);

}

?>

</body>

</html>

Рис. 3.12. Код программы Lab3.php для создания формы.

Прим. HTML код на рис. 3.12. показан мелким жирным шрифтом.

Если пользователь введет данные (как показано на рис. 3.11) и нажмет кнопку ―OK‖, то вновь будет вызвана программа Lab3.php, но в ней сработает ветка

74

else

{//Вывод введенных данных и на экран будет выведена следующая информация (рис. 3.13)

Рис. 3.13. Результат обработки события ―OK‖ при вводе значений данных как показано на рис. 3.11.

Если Пользователь использует (см. рис. 3.13), то будет вызвана программа Lab3_1.php, код которой приведен на рис. 3.14., а результат представлен на рис. 3.15.

Программа Lab3_1.php для обработки ссылки

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"> <head>

<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" /> <title>Lab3_1</title>

</head>

<body>

<?PHP

//реакция при нажатии на ссылку HERE, см. файл Lab3.php

//$FirstName = $_GET['FirstName']; $Name = $_GET['Name']; $Name1=$_REQUEST['Name'];

75

if (isset($Name1)) // проверка переменной Name1 на ее существование

{ echo "Переменная с именем Name1 доступна и равна ".$Name1." Ее тип=".gettype($Name1);}

else

{ echo "Переменная с именем Name1 НЕ доступна через REQUEST"; echo "<br>Ее тип=".gettype($Name1);//опеделение типа переменной } //конец if-else

// echo "<br>Полный адрес к скрипту. Исполняется скрипт - http://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'];

echo "<br>Исполняется скрипт-http://".$_SERVER['SERVER_NAME']; $a=$_SERVER['REQUEST_URI'];

echo "<br>Передали через адресную строку <br>".$a;

echo "<br> Метод ".$_SERVER['REQUEST_METHOD']." также передал ".$Name ; // GET

echo "<br> QUERY_STRING ".$_SERVER['QUERY_STRING']; echo "<br> PHP_SELF=".$_SERVER['PHP_SELF'];

if (isset($_SERVER['HTTP_REFERER'])) //контроль существования переменной

{

echo "<br>Вы пришли на данную страницу с адреса:

".$_SERVER['HTTP_REFERER'];

$e = $_SERVER['HTTP_REFERER'];//http://localhost/php/Lab3.php $d = strstr($e, '/php/');

//print "<br> d=".$d; // печатает /php/Lab3.php $pos = strpos($d, "/php/"); // $str=substr($d,$pos+5); //вырежет только Lab3.php

}

print("<br>Hello из $str - Имя и Фамилия: ' $Name '.Отработала ".$_SERVER['PHP_SELF']);

//print("<center> Hello из $d Имя и Фамилия: ' $Name '!!!</center>"); ?>

</body>

</html>

Рис. 3.14. Исходный код программы Lab3_1.php – обработка ссылки.

Рамка (fieldset)

Объект fieldset позволяет вам нарисовать рамку вокруг объектов. Имеет закрывающий тэг </fieldset>. Заголовок указывается в тэгах <legend></legend>. Основное назначение объекта – задавание различных стилей оформления.

Например:

76

<fieldset>

<legend>Программное обеспечение (заголовок рамки)</legend> Текст, который будет помещен внутри рамки.</fieldset>

Рис. 3.15. Результат работы программы Lab3_1.php – обработка ссылки.

Задание 2. Использование рамок в приложении

Разработать приложение в котором создается форма ввода, испоющая рамку (см. рис. 3.16.).

Рис. 3.16. Пример формы ввода на экране.

Программа Lab3_2.php (рис. 3.17) подготавливает форму для ввода информации:

Имени;

Фамилии;

77

 Текста - комментария.

Информация указанных данных должна быть охвачена рамкой (fieldset) и выделена цветом отличным от стандартного цвета браузера.

Введенные данные обабатываются этим же PHP-сценарием Lab3_2.php (при нажатии кнопки ―OK‖). В программе показано реализация ограничения, требующего обязательного ввода значения поля Фамилия. Если поле Фамилия будет означено и нажата кнопка ―OK‖ (рис. 3.17),

Рис. 3.17. Пример ввода значения фамилии.

то необходимо вызвать программу Lab3_2.php, в которой необходимо вывести на экран информацию в виде, показанном на рис. 3.18.

Рис. 3.18. Пример вывода введенных значений.

Исходный код программы, реализующий обработку и вывод информации на экран, показанный на рис. 3.17, 3.18 и 3.20 приведен на рис. 3.19 (мелким шрифтом показан текст относящийся к HTML коду).

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"> <head>

<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" /> <!--Обработчик формы в этом же файле Lab3_2.php, method=POST-->

78

<title>Lab3_2</title> </head>

<body bgcolor="#f6f6f6" text="#009999" >

<h2>Использование <i><b>bgcolor</b></i> и выделение ссылки цветом</h2><!-- Заголовок формы--> <!--строки текста прижаты по умолчанию, т.е. влево-->

<!--Шрифтовые элементы (font elements) - физическая разметка текста Шрифтовые элементы это: TT "телетайпный" текст, т.е. текст одного размера

I

курсив

B

выделение

U

подчеркивание

STRIKE

зачеркнутый текст

BIG

большой шрифт

SMALL

малый шрифт

SUB

подстрочный текст

SUP

надстрочный текст.

-->

<!--<fieldset style="width: 50%" align="right">--> <fieldset style="width: 50%" ><!--Рамка формы-->

<legend><b>Ввод исходных данных(заголовок рамки)</b></legend>

<?PHP //начало встроеннго PHP кода if (!isset($_POST[Submit]))//

{

$NameG=$_GET['LastName']; $NameR=$_REQUEST['LastName']; $NameP=$_POST['LastName'];

if (empty($NameG))

echo "Кнопку Submit=OK еще не нажимали. Значение Фамилии в массивах должно быть Get=$NameG = Пусто,REQUEST=$NameR =Пусто,Post=$NameP =Пусто <br>";

// на экране будет:

//Кнопку Submit=OK еще не нажимали. Значение Фамилии в //массивах должно быть Get= = Пусто,REQUEST= =Пусто,

//Post= =Пусто else

// на экране будет (если ввели например фамилию Кук): //Кнопку Submit=OK уже нажимали. Значение Фамилии в

//массивах $_GET=Кук, $_REQUEST=Кук, S_Post=

echo 'Кнопку Submit=OK <font color=red><BIG> уже </BIG> нажимали. Значение Фамилии в массивах $_GET='.$NameG.', $_REQUEST='.$NameR.', S_Post='.$NameP.' <font color=blue><br>';

$a=$_SERVER['REQUEST_URI'];

79

echo "<br>Передали через адресную строку ".$a; //на экране (если Фамилия не означена):

//Передали через адресную строку /php/Lab3_2.php //на экране (если Фамилия означена и равна Кук): //Передали через адресную строку

// /php/Lab3_2.php?LastName=%CA%F3%EA

echo "<br> Метод указанный в SERVER =

".$_SERVER['REQUEST_METHOD']." ".$Name." " ; // GET

//на экране (при неозначенной или означенной фамилии): //Метод указанный в SERVER = GET $b=$_SERVER['QUERY_STRING'];

echo "<br>Передали через SERVER['QUERY_STRING'], b= ".$b; //на экране (если Фамилия не означена):

//Передали через SERVER['QUERY_STRING'], b= //на экране (если Фамилия означена и равна Кук):

//Передали через SERVER['QUERY_STRING'], b=

LastName=%CA%F3%EA $c = true;

if (!empty($b)) {

//в адресной строке указан параметр и его значение

//echo ''.$b.' SERVER='.$_SERVER['QUERY_STRING'].' не //пуста Факт = '.$_GET['LastName'];

$LastName=$_GET['LastName']; $c=false;

}

echo "<br> QUERY_STRING ".($c ? 'Пусто' : 'Не пусто '.$b.'

Фам=$LastName='.$LastName); //на экране:

//QUERY_STRING Пусто, если значение $c = true //иначе

//QUERY_STRING Не пусто LastName=%CA%F3%EA Фам=$LastName=Кук

//echo "<br> Выполняется PHP_SELF=".$_SERVER['PHP_SELF'];

//Вывод вышестоящего оператора будет: //Выполняется PHP_SELF=/php/Lab3_2.php

//Создание формы и описание ее объектов

echo"<font color=blue>";//цвет имен атрибутов в форме голубой

print("<form action=\"Lab3_2.php\" method=POST>"); print("<table bgcolor='#33FF99'>

<tr><td> Имя </td>");//вывод атрибута на экран

80

print("<td><input type=text name=\"FirstName\" size=20></td></tr>"); print("<tr><td>Фамилия</td>");

//print("<tr bgcolor='#33FF99'><td>Фамилия</td>"); if (!empty($b))

// Внимание! if (!c) не эквивалентно if (!empty($b))

{// в адресной строке указан параметр и его значение

//print("<td><input type=text name=\"LastName\" value=$LastName size=20></td></tr>");

print("<td><input type=text name=\"LastName\" value=".$_GET['LastName']." size=20></td></tr>");

}

else

{

print("<td><input type=text name=\"LastName\" size=20></td></tr>");

}

print("<tr><td> Комментарий</td>");

print("<td><textarea name=\"Comments\" rows=5 cols=40></textarea></td>"); print("</tr></table>");

//формирование кнопок

print("<input type=submit name=\"Submit\" value=\"OK\"> "); print("<input type=reset name=\"Reset\" value=\"Отмена-Cancel\">");

print("</form>");

}

else //Кнопку Submit=OK нажимали

{

$FirstName=trim($_POST[FirstName]);

echo "Вышли из формы, нажав кнопку OK. Вывод значений введенных переменных <br>";

$LastName=trim($_POST[LastName]);//значение фамилии if (empty($LastName))

{//проверка на пустое значение переменной $LastName

echo'<font color=red><BIG> Введите Фамилию. Связь с сервером запрещена.</BIG> Вернитесь на предыдущую страницу!';

exit; //выйти из программы

}//конец if (empty($LastName))

$Comments=trim($_POST[Comments]); print("Указали Имя : $FirstName <br>"); print(" Фамилия : $LastName <br>");

if (empty($Comments))//комментарий не вводили print("Поле комментария не заполняли<br>");

81

else

{

print("В поле комментария было:<br> $Comments <br>"); }//конец if (empty($Comments))

print("Нажмите <a href=\"Lab3_2.php?LastName=$LastName\">здесь</a> и

будет вызвана Lab3_2.php с параметром LastName,<br> значение = $LastName ");

}

?>

</fieldset> <!--Конец рамки--> </body>

</html>

Рис. 3.19. Исходный код программы Lab3_2.php.

Нажатие на ссылке (рис. 3.18) должно привести к выводу следующего экрана (рис. 3.20).

Рис. 3.20. Пример вывода введенных значений.

Если пользователь не вводит значения фамилии и нажимает кнопку ―OK‖, то реакция программы Lab3_2.php показана на рис. 3.21.

82

Рис. 3.21. Пример сообщения из программы Lab3_2.php при отсутствии значения Фамилии в поле ввода.

Задание 3. Разработать приложение с использьзованием только

HTML средств для ввода информации.

Вид формы форма ввода показан на рис. 3.22. Исходный код представлен на рис. 3.23

Рис. 3.22. Пример форм, реализованных программой Lab3_3.php

На рис. 3.22 показано несколько форм использующих два текстовых поля, конструкцию checkbox и выпадающий список select.

83

Синтаксис определения текстового поля:

<input type="text" name="имя переменной" size="N" maxlenght="N" value="">

Определение текстового поля включает пять атрибутов: type - тип элемента (для текстовых полей - text);

name - тип переменной, в которой сохраняются введѐнной данные; size - общий размер текстового поля в браузере;

maxlength - максимальное количество символов, вводимых в текстовом поле; value - значение, отображаемое в текстовом поле по умолчанию;

Чтобы создать в форме поле для ввода паролей, достаточно указать type="password" вместо type="text".

Флажки (checkboxes) используются в ситуациях, когда пользователь выбирает один или несколько вариантов из готового набора - по аналогии с тем, как ставятся "галочки" в анкетах.

Синтаксис определения флажка:

<input type="cheskbox" name="имя_переменной" value="начальное_значение">

Определение флажка включает три атрибута: type - тип элемента (для флажков - checkbox);

name - имя переменной, в которой сохраняются введѐнные данные (в данном случае - состояние элемента);

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

Раскрывающийся список

Раскрывающиеся списки особенно удобны в ситуации, когда у Вас имеется длинный перечень допустимых вариантов, из которых пользователь должен выбрать один вариант. Как правило, раскрывающиеся списки применяются при работе с относительно большими наборами данных - например, при перечислении областей или стран.

Синтаксис определения раскрывающегося списка: <select name="имя_переменной">

<option value="имя_переменной1"> <option value="имя_переменной2"> "option value="имя_переменной3">

.........................................................

<option value="имя_переменнойN"> </select>

84

Определение раскрывающегося списка включает два атрибута:

name - имя переменной, в которой сохраняются введѐнные данные (в данном случае - строка, выбранная в списке);

value - значение, отображаемое в списке по умолчанию.

Далее приводится текст HTML кода (программа Lab3_3.php), обеспечивающая вывод странички на экран.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"> <head>

<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" /> <title>Lab3_3</title>

</head>

<h1> Пример форм в HTML </h1>

<body>

<!--1-я форма--> <form

<label for="name"> Ваше имя </label>

<input type="text" name="Name" value="Вася" maxlengf="20" size=30><br>

<input type="reset" value="Очистить форму">

</form><br>

<!--2-я форма--> <form

label for="name"> Введите пароль </label>

<input type="password" maxlengf="10" size=30><br>

<input type="reset" value="Сброс пароля">

</form><br>

<form

label for="name1"> Ваши интересы </label><br>

<input type="checkbox" name="name1" value="Comp"> Компьютеры<br> <input type="checkbox" name="name1" value="Sport" > Спорт<br> <input type="checkbox" name="name1" value="Art" > Искусство<br>

</form><br>

<!--Раскрывающийся список 1--> <select name="SP">

85

<option value="SP1" >Базы данных

<option value="SP2" >Операционные системы

<option value="SP3" >Организация ЭВМ <option value="SP4" >Сети ЭВМ </select><br><br>

<!--Раскрывающийся список 2--> <select name="SPP">

<option value="SPP1" >1-й урок 9.00 - 9.45 <option value="SPP2" >2-й урок 10.00 - 10.45 <option value="SPP3" >3-й урок 11.00 - 11.45 <option value="SPP4" >4-й урок 12.00 - 12.45 <option value="SPP5" >5-й урок 13.00 - 13.45 </select><br><br>

</body>

</html>

Рис. 3.23. Программа Lab3_3.php, реализующая различные формы средствами HTML.

Кнопка для загрузки файлов (browse)

Служит для реализации загрузки файлов на сервер. Объект browse начитается с парных тегов <form></form>. Начинающий тэг <form> содержит необходимый атрибут encrypt. Атрибут encrypt принимает значение multipart/form-data, который извещает сервер о том, что вместе с обычной информацией посылается и файл. При создании текстового поля также необходимо указать тип файла – ―file‖.

Синтаксис описания browse (Кнопка обзор)

<form enctype="multipart/form-data" action="upload.php" method="post"> Загрузить файл: <input name="my_file" type="file">

<input type="submit" value="Отправить"> </form>

Пример использования подобной конструкции рассмотрен в лабораторной работе в теме 9.

Ниже приведен еще один пример формы представленный в файле

Lab3_4.php.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"> <head>

<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" /> <title>Lab3_4 Anketa</title>

86

</head>

<body bgcolor="#ffffff" text="#000000" link="#cbda74" vlink="#808040" alink="f808040">

<?

Все кавычки внутри $form должны экранироваться,

в противном случае произойдет ошибка.

$form = "

<form action=\"Lab3_4.php\" method=\"post\">

<input type=\"hidden\" name=\"seenform\" value=\"y\">

<b>Введите информацию!</b><br>

Ваше имя :<br>

<input

type=\"text\"

name=\"name\"

size=\"20\"

maxlength=\"20\"

value=\"\"><br>

Ваш Email:<br>

<input

type=\"text\"

name=\"email\"

size=\"20\"

maxlength=\"40\"

value=\"\"><br>

<input type=\"submit\" value=\"Отправить\"> </form>";

Если форма ранее не отображалась, отобразить ее.

Для проверки используется значение скрытой переменной $seenform. if ($seenform != "у"):

//print " форма ранее не отображалась "; print "$form";

else:

print "Ввели. $name!. Your email address is $email"; endif;

?>

</body>

</html>

Учтите, что этот вариант создает определенные неудобства, поскольку при повторной загрузке страницы пользователь ничего не узнает о том, правильно ли были заполнены поля формы. Процедура проверки ошибок рассматривается далее в, а пока достаточно запомнить, что ввод данных можно осуществить при помощи одного сценария.

87

Тема №4. Использование чисел. Управляющие структуры Цель работы: работа с численными данными в форме.

Задание 1. Разработать приложение с формой для простого калькулятора (см. рис. 3.24).

Рис. 3.24. Форма с группой переключателей Действие и ввода переменных.

Исходный код программы приведен ниже (рис. 3.25). <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"> <head>

<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />

<title>Lab4 Калькулятор</title>

</head>

<h2> Форма калькулятора в HTML </h2>

<body>

<form action="Lab4_1.php" method="POST">

<!-- форма использует обработчик представленный в файле Lab4_1.php--> <p> Значение 1:

<input type="text" name="Var1" size=10></p>

<p> Значение 2:

<input type="text" name="Var2" size=10></p>

<p> Действие:<br>

<input type="radio" name="calc" value="Сложить"> Сложить<br> <input type="radio" name="calc" value="Вычесть"> Вычесть<br>

88

<input type="radio" name="calc" value="Умножить"> Умножить<br> <input type="radio" name="calc" value="Разделить"> Разделить<br>

</p>

<p> <input type="submit" name="Submit" value="Вычислить"></p> </form>

<!--При пересылке формы в ваш сценарий Lab4_1.php будут переданы переменные - $Var1 и $Var2 (используется массив POST), так как именно эти имена являются значениями параметра NAME, использованного при создании каждого текстового поля. Значениями этих переменных будут значения, введенные пользователем в соответствующие поля формы.

--> </body> </html>

Рис. 3.25. Исходный код программы Lab4.php.

Cозданная форма (рис. 3.24) содержит два поля ввода Значение 1 и Значение 2, переключатель Действие и кнопку Вычислить. Кроме того, с переменными $Var1 и $Var2, в обработчик Lab4_1.php, будет пересылаться еще одна переменная с именем $calc (переменная $calc также будет доступна через глобальный массив $_POST).

Если к данному моменту времени сценарий Lab4_1.php не создан, то нажатие на кнопке "Вычислить" (рис. 3.24) приведет к следующему результату (рис. 3.26).

Рис. 3.26. Реакция браузера при отсутствии программы Lab4_1.php.

89

Создание сценария калькулятора

В соответствии с выбранным в форме Lab4.php именем обработчика, создадим PHP-сценарий с именем Lab4_1.php. Цель сценария - принять два значения переменных $Var1 и $Var2 и произвести с ними вычисления в зависимости от значения переменной $calc.

Созданный вами сценарий должен выглядеть как на pис. 3.27. Сохраните созданный файл с именем Lab4_1.php в папке для

документов вашего Web-сервера.

<?PHP

$Var1 = $_POST["Var1"];// использование массива $_POST для означивания переменных обязательно

$Var2 = $_POST["Var2"]; $calc = $_POST["calc"];

if ( ($Var1=="") || ($Var2=="") || ($calc==""))

{

header ("locahion:http://localhost/lab4.php"); //echo "header ";

exit;

}

if ($calc=="Сложить") {$rez=$Var1 + $Var2;}

else if ($calc=="Вычесть") {$rez=$Var1 - $Var2;}

else if ($calc=="Умножить") {$rez=$Var1 * $Var2;}

else if ($calc=="Разделить") {$rez=$Var1 / $Var2;}

?>

<html>

<head>

<title>Lab4_1 Результаты вычислений</title> </head>

<body>

<p>Результат вычислений равен <? echo $rez; ?> </p> <p>Результат получен в обработчике Lab4_1.php </p>

</body>

</html>

Рис. 3.27. Исходный листинг программы Lab4_1.php.

90

Например, если в форму (рис. 3.26) ввести данные, как показано на рис. 3.28, то результат будет следующий (рис. 3.29)

Рис. 3.28. Данные указанные в форме.

Рис. 3.29. Вывод результата работы сценария Lab4_1.php.

Напоминаем, что в дробных числах целая часть должна отделяться от дробной части точкой, а не запятой.

91

Тема №5. Использование управляющей структуры switch

Цель работы: Обучение применению структуры switch.

Задание 1. Разработать приложение с использованием конструкции

SWITCH-CASE, в котором создается форма для простого калькулятора (см.

рис. 3.30 и рис. 3.33).

Рис. 3.30. Вид формы для калькулятора.

Исходный код Lab5.0.php для вывода формы представленной на рис. 3.30, показан на рис. 3.31.

Рис. 3.31. Исходный код создания формы .

92

Рис. 3.32. Продолжение исходного кода создания формы . Пояснения к коду программы создания формы (рис. 3.31 - 3.32).

При пересылке формы в сценарий Lab5_1.php будут переданы две переменные - $Var1 и $Var2, так как именно эти имена являются значениями параметра NAME, использованного при создании каждого текстового поля. Значениями этих переменных будут значения, введенные пользователем в соответствующие поля формы.

Кроме того, если пользователь отметит какое-то действие, с помощью радио кнопки, в сценарий (обработчик формы) будет передана переменная Scalc (с указанным значением).

В форме используется обработчик с именем Lab5_1.php

Исходный код (Lab5_1.php) обработки формы представлен на рис. 3.33.

Рис. 3.33. Исходный код Lab5_1.php обработки ввода.

93

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" /> <title>Lab5_1 Результаты</title>

</head>

<body>

<p>Результат вычислений равен <? echo $rez; ?> </p>

94

<p>Результат получен в обработчике Lab5_1.php </p>

</body>

</html>

Рис. 3.34. Продолжение исходного кода Lab5_1.php обработки ввода.

Если строка

в коде HTML не будет вставлена, то на экране будет выведена информация вида (рис. 3.38):

Рис. 3.35. Результат обработки ввода при отсутствии указания русской кодировки.

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

Рис. 3.36. Результат ввода информации.

Если кнопка будет нажата

95

Рис. 3.37. Результат работы обработчика для рис. 3.36.

Если в форму (рис. 3.30) не вводить информацию и нажать кнопку

, то получим результат:

Рис. 3.38. Результат работы обработчика при отсутсивии информации в форме и нажатии кнопки ―Вычислить‖.

Задание 2. Разработать сценарий обрабочика кнопки OK с

использованием Switch, приложение использует форму ввода показанную на рис. 3.39 и сопутствующий ей код на рис. 3.40.

Contact.html

Рис. 3.39. Форма ввода.

<html>

<head>

<title>Contact</title>

</head>

<body bgcolor=yellow>

<form action="ContactHow.php" method=POST>

96

<table> <tr><td> First Name</td>

<td><input type=text name="FirstName" size=20></td></tr> <tr><td>Last Name</td>

<td><input type=text name="LastName" size=20></td></tr> <tr><td> Comments</td>

<td><textarea name="Comments" rows=5 cols=40></textarea></td></tr></table>

Способ связи

<p><select name="ContactHow" size=1> <option value="Telephone">Телефон</option> <option value="Pochta">Почта</option> <option value="Email">E-mail</option> <option value="Fax">Fax</option>

</select>

<p><input type=submit name="Submit" value="OK">  <input type=reset name="Reset" value="Cancel">

</form>

</body>

</html>

Рис. 3.40. Исходный код HTML формы ввода.

Тема № 6. Использование регулярных выражений в сценариях РНР

Цель работы: Получение практических навыков в использовании регулярных выражений при обработке форм.

До настоящего момента предполагалось, что пользователь всегда вводит правильные данные и не действует злонамеренно. В данной теме мы усовершенствуем рассмотренные примеры и организуем проверку целостности данных форм. Проверка ошибок не только обеспечивает удаление неполной и неправильной информации, но и обеспечивает более эффективный и удобный интерфейс.

Проверка ошибок

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

При обнаружении ошибки в данных необходимо сообщить об этом пользователю и предложить внести исправления. Существует несколько возможных решений, в том числе простой вывод сообщения об ошибке и предложение альтернативных вариантов (например, если пользователь

97

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

Задание 1. Вывод информации о ошибочно заполненных полях формы

Мы последовательно проверяем все поля формы и убеждаемся в том, что они не остались пустыми. Там, где это возможно, проверяется правильность структуры введенных данных. Если проверка прошла успешно, мы переходим к следующему полю; в противном случае программа выводит сообщение об ошибке, устанавливает флаг, который позднее используется для повторного отображения формы, и переходит к следующему полю. Процедура повторяется до тех пор, пока не будут проверены все поля формы

(рис. 3.41, файл Lab6_0.php).

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"> <head>

<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" /> <title></title>

</head>

<body bgcolor="#ffffff" text="#000000" link="#cbda74"

vlink="#808040" alink="#808040">

<? PHP

$name = $_POST['name']; //$name=$_REQUEST['name'];

$seenform=$_POST['seenform'];

$email=$_POST['email'];

// Создать форму

$form = "

<form action=\"Lab6_0.php\" method=\"post\">

<input type=\"hidden\" name=\"seenform\" value=\"z\">

<b>Введите информацию</b><br>

Ваше имя:<br>

<input

type=\"text\"

name=\"name\"

size=\"20\"

maxlength=\"20\"

value=\"$name\"><br>

Ваш Email:<br>

<input

type=\"text\"

name=\"email\"

size=\"20\"

maxlength=\"40\"

value=\"$email\"><br>

<input type=\"submit\" value=\"Отправить\"> <br>Lab6_0.php. Обработка ошибок при вводе <br>неправильного Email производится в этом же файле

</form>";

if ($seenform != "z"): // Заполнялась ли форма ранее?

98

print "$form"; //echo " Первая прорисовка формы";

else:

Пользователь заполнил форму. Проверить введенные данные.

//echo " form нарисована $name"; $error_flag = "n"; //признак что ошибок нет if ($name == ""):

Убедиться в том, что поле имени содержит информацию

print "<font color=\"red\"> Вы забыли ввести Ваше имя </font><br>"; $error_flag = "y";//признак наличия ошибоки

endif;

// Убедиться в том. что поле адреса содержит информацию if ($email == ""):

$error_flag = "y";

print "<font color=\"red\">Укажите правильный email address! Он не должен быть пустым.</font><br>";

else:

//Преобразовать все алфавитные символы в адресе электронной почты //к нижнему регистру

$email = strtolower(trim($email)); endif;

if(!empty($_POST['email']))

{

// Убедиться в правильности синтаксиса адреса электронной почты //Будем считать, что стандартный адрес электронной почты выглядит так:

// admin@mail.ru

//Адрес состоит из двух частей это:

// admin - имя пользователя.

// mail.ru - домен, доменное имя.

//Их разделяет знак @(собака).

//Имя пользователя - может состоять из букв разного регистра, //цифр, знаков подчѐркивания, точек, минусов.

//Доменное имя - так же может состоять из букв разного //регистра, цифр, знаков подчѐркивания, точек, минусов.

if(preg_match("|^[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,6}$|i", $_POST['email'])): echo $_POST['email']. " Email - Правильный.";

$error_flag = "n";

else:

$error_flag = "y";

echo $_POST['email']. " Email - НЕправильный.";

print "<font color=\"red\"> Пример правильного возможного email: admin@mail.ru</font><br>";

endif;

99

}

else

{ echo "Вы не ввели email."; }

if ($error_flag == "y"):

// Если флаг ошибки $error_flag установлен, то заново отобразить форму. print "$form";

else: // Обработать данные пользователя print "<br>Данные введены правильно";

endif;

endif;

?>

</body>

</html>

Рис. 3.41. Проверка данных формы и вывод сообщений об ошибках. Lab6_0.php.

На экране форма будет представлена в виде (рис. 3.42).

Рис. 3.42. Форма ввода для листинга приведенного на рис. 3.41.

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

Отметим, что в функцию preg_match передаются два параметра – шаблон, которому должен соответствовать email адрес и собственно сам адрес, введенный пользователем $_POST['email'] if(preg_match("|^[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,6}$|i", $_POST['email']))

100

Шаблон , с которым функция preg_match будет сравнивать email адрес, может выглядеть так:

"[0-9a-z_]+@[0-9a-z_^\.]+" - это часть паттерна (шаблона), проверяющая имя пользователя, собаку и домен второго уровня до точки.

"\.[a-z]{2,6}" - эта часть проверяет домен первого уровня (ru,com,ua и т.д.).

Объединим всѐ и получим такой шаблон:

"|[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,6}|i"

В конце шаблона присутствует модификатор i он сообщает интерпретатору, что поиск проводится без учѐта регистра, т.е. могут присутствовать и заглавные буквы и прописные.

Как известно, у адреса две составляющие - имя пользователя и имя домена, которые разделены знаком @. Для проверки разделителя между именем пользователя и именем домена в шаблоне (регулярном выражении) указано +@.

На рис. 3.43 приведен пример вывода сообщения об ошибочных действиях пользователя при заполнении формы на рис. 3.42.

Рис. 3.43. Заполненная форма ввода для листинга приведенного на рис. 3.41.

Подчеркнем, что в первой половине e-mail адреса могут присутствовать только цифры, латинские буквы, точка, тире и знак подчѐркивания, причем начианаться адрес должен с буквы. В домене могут быть только цифры, латинские буквы, тире и точки.

Также не забывайте, что электронный ящик может находиться на поддомене xxx@xxx.xxx.com, или даже на домене четвертого, пятого уровня (как вариант, реально эта ситуация крайне редка, но отбрасывать эти адреса не стоит). Поэтому в регулярном выражении не забывайте использовать

101

точку (экранированную "\.") для указания того, что часть адреса после "@" может содержать точку как разделитель доменных имен.

Для проверки доменного имени первого уровня учитываем, что его длина уже составляет не только 2 символа (.ru) или 3 символа (.com), но и 4 символа - .info, и даже 6 символов. Поэтому в шаблоне присутствует выражение:

"\.[a-z]{2,6}$/i"

Проверка осуществляется по этому шаблону с применением функции preg_match():

- Функция bool preg_match( string $expr, string $str [,list &$pockets] )

сопоставляет выражение $expr в строке $str.

Задание 2. Использование функций пользователя для контроля полей формы

Ниже на рис. 3.44 показана форма ввода содержащая поле для ввода Email и в программе рис. 3.45 показано каким образом контролируется ввод информации в указанное поле.

Рис. 3.44. Форма ввода для листинга приведенного на рис. 3.45.

Листинг программы Lab6_0_1.php, содержащий функцию пользователя для проверки корректности адреса электронной почты.

102

Рис. 3.45. Листинг программы Lab6_0_1.php для формы на рис. 3.44.

103

104

105

Рис. 3.46. Продолжение листинга программы Lab6_0_1.php для формы на рис. 3.44.

В функции пользователя Val_email использованы стандартные функции:

Функция int strlen( string $st ) определяет длину строки;

Функция string trim( string $st [, string $charlist] ) удаляет ведущий и концевые символы строки.

Если пользователь (в форму на рис. 3.44) введет информацию как

показано на рис. 3.47, и нажмет кнопку , то реакция пользовательской функции Val_email показана на рис. 3.48.

Рис. 3.47. Форма с введенной информацией.

Обратите внимание, что после нажатия кнопки нижнее сообщение на рис. 3.47 исчезнет.

106

Рис. 3.48.Сообщение об ошибке сгенерированное пользовательской функцией.

Если пользователь исправит ошибку (рис. 3.49 ) и вновь нажмет , то ответ из программы Lab6_0_1.php показан на рис. 3.50.

Рис. 3.49. Исправление в поле Email введенное пользователем.

Рис. 3.50. Сообщение о правильности ввода контролируемое функцией val_email().

Ответьте на вопрос. Существует ли в реальности такой адрес Email, приведенный на рис, 3.49. ?

107

Задание 3. Проверка ограничений в текстовом поле. Lab6_0_2.php

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

Проверку условия приведена внутри кода (рис. 3.51), чтобы было понятно, что и куда писать:

<?php

$user = $_POST['username']; if(!preg_match("/^[a-zA-Z0-9]+$/", $user)) {

echo "Имя пользователя задано в неправильном формате";

} else {

echo "Имя пользователя задано в правильном формате";

}

?>

Рис. 3.51. Проверка специфичного имени пользователя.

Разбирем само регулярное выражение.

Так как регистрационное имя пользователя должно состоять из латинских букв, а также цифр, то надо написать символьный класс, который будет удовлетворять этому условию: [a-zA-Z0-9].

В этот символьный класс входит три интервала, первый интервал a-z (все символы от маленькой буквы a до маленькой буквы z), второй интервал A-Z (аналогично, но с большими буквами), третий интервал 0-9 (цифры от 0 до 9). Мы описали только одну букву, из которой может состоять регистрационное имя, но таких букв может быть... а теперь как раз надо ответить на вопрос, сколько таких букв может быть?

Если Ваш ответ будет: ―Да сколько угодно‖, то вы неправы.

Регистрационное имя должно состоять минимум из одной буквы! и это обязательное условие при прохождении регистрации, поэтому надо данный факт описать. Вспоминаем про квантификаторы: [a-zA-Z0-9]+

Плюс '+', как раз тот квантификатор, который говорит, что в строковой переменной $user должен быть минимум один символ, который соответствует условию.

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

108

регулярное выражение символ начала строки '^' в начале регулярного выражения и символ конца строки '$' в конец: ^[a-zA-Z0-9]+$

Теперь надо объяснить функции preg_match, что строка ^[a-zA-Z0-9]+$ является регулярным выражением, надо поставить ограничители, для этого и ставлится слеш '/':

preg_match("/^[a-zA-Z0-9]+$/",$user)

Полный листинг сценария в котором использовано ограничение для вводимого имени приведено на рис. 3.52 (файл Lab6_0_2.php).

109

Рис. 3.52. Листинг программы Lab6_0_2.php (проверка имени пользователя).

Рис. 3.53. Конец листинга программы Lab6_0_2.php.

Ниже на рис. 3.54 приведена форма ввода для листинга программы из рис. 3.52 - 3.53.

110

Рис. 3.54. Заполненная форма. Программа Lab6_0_2.php.

Если будет нажата кнопка , то результат показан на рис. 3.55.

Рис. 3.55. Результат работы программы Lab6_0_2.php.

Если пользователь введет информацию, как показано на рис. 3.56, то результат приведен на рис. 3.57.

Рис. 3.56. Заполненная форма. Программа Lab6_0_2.php.

В введенном имени присутствуют русские буквы, поэтому реакция будет следующей.

111

Рис. 3.57. Результат работы программы Lab6_0_2.php.

112

Задание 4. Специфика имени пользователя. Lab6_0_3.php

В 80% случаев вышеприведенная задача усложняется на практике, надо либо расширить набор символов, что делается простым добавлением символов в символьный класс, либо ужесточаются условия. Например, ставится условие, что имя пользователя может состоять как из букв латинского алфавита, так и из цифр, но первый символ имени пользователя должен быть обязательно буквой латинского алфавита!

Дописываем регулярное выражение: ^[a-zA-Z][a-zA-Z0-9]*$

Как известно, символьный класс описывает только один символ. Наша задача как раз в том и состоит, чтобы описать один символ (первый): [a-zA-Z] тут два интервала, описывают первый символ и дают понять, что никаких цифр в первом символе проверяемой строки быть не может.

В предыдущем примере явно следовало, что регистрационное имя пользователя должно быть длинной минимум в один символ. Мы уже описали первый символ строки, но он может быть и единственным, после него может быть сколько угодно символов, либо может их вообще не быть, но регулярное выражение совпадет только тогда, когда все последующие символы будут удовлетворять условию, что они являются либо буквами латинского алфавита, либо цифрами. [a-zA-Z0-9]. Первый обязательный символ описан, остальные символы не обязательны, поэтому меняем квантификатор с '+' на '*', Ставим символы начала и конца строки: ^[a-zA-

Z][a-zA-Z0-9]*$

Если в листинге программы 42-ю строку (рис. 3.53)

заменить на (файл Lab6_0_3.php):

то на ввод информации (рис. 3.58) получим следующую реакцию (рис. 3.59).

Рис. 3.58. Заполненная форма. Программа Lab6_0_3.php.

113

Рис. 3.59. Результат работы программы Lab6_0_3.php.

Задание 5. Специфика имени пользователя с помощью JavaScript. Lab6_0_4.php

Пример использования JavaScript (файл Lab6_0_4.php).

Ниже (рис. 3.60) представлен HTML код самой формы:

<form onsubmit="return checkmail(this.email.value)" action="#" method="post"> <input id="email" name="email" />

<input type="submit" value="Отправить" /> </form>

Рис. 3.60. Код для формы Lab6_0_4.php.

И код функции на JavaScript, которая и проверяет email.

<script language="javascript" type="text/javascript"> function checkmail(value) {

reg = /[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/;

if (!value.match(reg)) {alert("Пожалуйста, введите свой настоящий e-mail"); document.getElementById('email').value=""; return false; }

}

</script>

Рис. 3.61. Код функции на JavaScript для проверки email (Lab6_0_4.php).

В принципе, если не хотите вникать в суть дела, можете просто скопирвать код, всѐ будет работать). Напоминаем, что в Интернете

114

существует огромное количество открытых кодов для проверки Email адресов и их надо использовать , а не придумывать свои коды.

Рис. 3.62. Пример Lab6_0_4.php при неправильном указании Email адреса в форме ввода.

Проверка на корректность адреса электронной почты

<?php

function check_email($email) {

if (preg_match("%^[A-Za-z0-9](([_\.\-]?[a-zA-Z0-9]+)*)@([A-Za-z0-9]+)(([\.\-]?[a-zA-Z0-9]+)*)\.([A-Za-z])+$%", $email)) {

return true;

}

return false;

}

?>

115

Задание 6. Проверка правильности ввода URL. Lab6_1.php.

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

При построении регулярного выражения будем исходить из того, что URL имеет следующий формат:

http://хост/путь

Простейшим вариантом проверки, не позволяющим посетителю ошибаться при наборе URL, но в то же время не предотвращающий неверный формат, является:

"#http://[^]*\.html?#i"

Данное выражение учитывает только URL расширения файла html либо htm, для обобщения на другие файлы следует расширить регулярное выражение до:

"#http://[^]*\.(html?|php|pl|cgi)#i"

Уточняя регулярное выражение, разместим за префиксом http:// регулярное выражение для хоста — [-a-z0-9_.]+. Структура пути может быть более разнообразной. Для него необходимо использовать выражение вида:

[-a-z0-9_:@&?=+,.!/~*'%$]*

Объединяя все в одно регулярное выражение, получаем следующее:

"#http://[-a-z0-9_.]+[-a-z0-9_:@&?=+,.!/~*'%$]*\.(html?|php|pl|cgi)#i"

На рис. 3.63 приведена форма с полем URL адреса.

Рис. 3.63. Пример Lab6_1.php при неправильном указании URL адреса в форме ввода.

Как видно из рис. 3.63, при таком вводе обработчик зафиксирует ошибку, которая может быть представлена рис. 3.64.

116

Рис. 3.64. Реакция Lab6_1.php при неправильном указании URL адреса в форме ввода на рис. 3.63.

Исходный листинг Lab6_1.php приведен ниже на рис. 3.65.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"> <head>

<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" /> <title>Lab6_1 Регулярные выражения</title>

</head>

<h2> Регулярные выражения для URL </h2>

<h3 align="left"><font color=RED>(файл Lab6_1.php)<font color=BLUE> </h3>

<body

TEXT=BLUE

LINK=RED

VLINK=BLUE ALINK=PINK>

<?PHP

if (!isset($_POST[Submit]))

{

//echo "Кнопку Submit=OK еще не нажимали <br>"; print("<form action=\"Lab6_1.php\" method=POST>"); print("<table> <tr><td> Ваше Имя </td>");

print("<td><input type=text name=\"FirstName\" size=20></td></tr>"); print("<tr><td>Ваша Фамилия</td>");

print("<td><input type=text name=\"LastName\" size=20></td></tr>"); print("<tr><td>URL</td>");

print("<td><input type=text name=\"Url\" size=40></td></tr></table>"); print("<input type=submit name=\"Submit\" value=\"OK\"> "); print("<input type=reset name=\"Reset\" value=\"Cancel\">"); print("</form>");

}

else

{

$Url_adress=$_POST['Url'];

//echo "Указан адрес $Url_adress ";

117

if (strlen($Url_adress)<8)

{echo "Указанный адрес $Url_adress менее 8-и символов";// exit;//завершение выполнения PHP сценария

}

//Единственным обязательным признаком в URL:

//url это обязательно две группы символов, разделенных точкой. //Больше ничего обязательного для URL нет.

//Например, google.com или supersait.ru if(preg_match('#^[-a-z0-9]+(\.[-a-z0-9]+)*(\.[a-z]+)(|\/|\/([a-z0-9-_\(\)!\&\#\.\/\~]+(\.[a-z0-9\_\-]+)?(\?([a-zа-я0-9-_\%]*|([a-z0-9_-]+=[a-zа-я0-9-_\%\&]*)+))?(\#[a-z0-9]*)?)?)$#i', $Url_adress))

{

// URL верен. Например, ORD.com.ru

//Внимание! Это выражение не проверяет на наличие "http://"

}

else

{

// URL НЕ верен

echo "Возможный Url Ord.com.ru или www.ord.com.ru <br>"; exit("Указанный адрес $Url_adress <font color=\"red\">НЕ верен</font><br>");

}

if(!preg_match("#http://[-a-z0-9_.]+[-a-z0-9_:@&?=+,.!/~*'%$]*\.(html?|php|pl|cgi|ru)#i", $Url_adress))

{

echo "Указанный адрес $Url_adress допустим <br>";

$Pattern="^(http://)?([^[:space:]]+)([[:alnum:]\.,?%#\-\:;&])$"; if (ereg($Pattern,$Url_adress)):

//ereg - совпадение с регулярным выражением. //Ищет в строке Url_adress совпадения с регулярным //выражением, данным в шаблоне pattern.

//

$Replace="<a href=\"http://\\2\\3\" target=\"_self\">\\2\\3</a>"; $Url_adress=eregi_replace($Pattern, $Replace, $Url_adress);

//Функция eregi_replace ищет регулярное выражение Pattern //в строке Url_adress и заменяет его строкой Replace. //функция не чувстительна к регистру

print("Ваша подача документа по URL адресу - $Url_adress - может быть осуществлена!");

//Например. Ваша подача документа по URL адресу - // www.ord.com.ru - может быть осуществлена!

118

else:

print("URL не точен"); endif;

}

//exit("Неверный формат URL");

}

?>

</body>

</html>

Рис. 3.65. Листинг Lab6_1.php с проверкой URL.

Если пользователь введет правильную информацию рис. 3.66, то вывод в браузере показан на рис. 3.67.

Рис. 3.66. Форма Lab6_1.php с проверкой URL.

Рис. 3.67. Форма Lab6_1.php с проверкой URL.

119

Задание 7. Проверка правильности ввода из списка. Lab6_2.php.

Пусть необходимо разработать форму (рис. 3.68)

Рис. 3.68. Форма Lab6_2.php.

Для указания способа связи использован следующий список (рис. 3.69)

Рис. 3.69. Форма Lab6_2.php списком значений.

Форма выводится с помощью листинга представленного на рис. 3.70 (файл Lab6_2.php), а обработка события производится в файле Lab6_3.php (листинг программы показан на рис. 3.71).

Файле Lab6_3.php в свою очередь содержит внутренний обработчик событий представленный в файле Lab6_4.php (рис. 3.72).

Листинг программы Lab6_2.php представлен ниже.

120

Рис. 3.70. Листинг Lab6_2.php с списком значений.

Как указано в строке

обработчик нажатия кнопки ―OK‖, находится в отдельном файле с именем Lab6_3.php.

В качестве способа связи по умолчанию предлагается использовать ―Телефон‖.

Естественно пользователь может указать один из видов связей, что должно быть учтено в обработчике Lab6_3.php (рис. 3.71).

121

122

Рис. 3.71. Листинг обработчика Lab6_3.php.

Обратите внимание, что в листинге программы Lab6_3.php (рис. 3.71) Html код должен помещаться после PHP кода, иначе функция

будет выдавать предупреждение о присутствии информации перед PHP кодом.

Кроме того текст программы Lab6_3.php, в свою очередь содержит обработчик Lab6_4.php (листинг представлен на рис. 3.72) для возможности обработки ошибок при вводе значений в поле связи (рис. 3.73).

123

Рис. 3.72. Листинг обработчика Lab6_4.php.

Пусть пользователь ввел информацию в форму, показанную на рис.

3.69.

Тогда в обработчике Lab6_3.php (через глобальный массив $_POST) будут доступны переменные:

124

Так как значения переменных $FirstName и $LastName непусты и равны соответственно $FirstName =‘Иван‘, $LastName= ‗Иванов‘, то будет построена форма (рис. 3.73) с помощью операторов ниже приведенных операторов (полный текст см. рис. 3.71):

и тело формы закрывается операторами

На основании указанных операторов на экран будет выведено:

Рис. 3.73. Содержание формы сгенерированное обработчиком Lab6_3.php.

Если пользователь введет в форму (рис. 3.73) информацию,

показанную на рис. 3.74 и нажмет кнопку , то обработчик

Lab6_4.php, указанный в теле Lab6_3.php

получит информацию через $_POST, которая показана на рис. 3.75.

125

Рис. 3.74. Содержание формы (рис. 3.73) после указания Email.

Рис. 3.75. Результат работы обработчика (рис. 3.72) по нажатию рис. 3.74.

Рассмотрим ситуацию когда форма, показанная на рис. 3.69 остается не заполненной и сразу нажимается кнопка (рис. 3.76).

Рис. 3.76. Содержание формы без ввода информации.

В этом случае на экране получим сообщение (рис. 3.77) на основе выполнения условия .

126

Рис. 3.77. Содержание формы без ввода информации.

Если пользователь вернется на предыдущую страницу и укажет (рис.

3.78)

Рис. 3.78. Содержание формы c информацией.

Нажатие для содержимого рис. 3.78 приведет к результату (рис. 3.79).

Рис. 3.79. Содержание формы (файл Lab6_3.php) c информацией.

127

Тема №7. Работа с массивами

Цель работы: Обучение использованию массивов в сценариях PHP. Массив представляет собой набор переменных, объединенных одним

именем. Каждое значение массива идентифицируется индексом, который указывается после имени переменной-массива в квадратных скобках. Комбинацию индекса и соответствующего ему значения называют элементом массива.

1<?

$i = 1024;

$a[1] = 'abc';

$a[2] = 100;

$a['test'] = $i - $a[2];

echo $a[1] . "<br>\n";

echo $a[2] . "<br>\n";

echo $a['test'] . "<br>\n";

?>

В приведенном примере, в строке три объявляется элемент массива $a с

индексом 1; элементу массива присваивается строковое значение 'abc'. Этой же строкой объявляется и массив $a, так как это первое упоминание переменной $a в контексте массива, массив создается автоматически. В строке 4 элементу массива с индексом 2 присваивается числовое значение

100.

В строке же 5 значение, равное разности $i и $a[2], присваивется элементу массива $a со строковым индексом 'test'.

Как видите, индекс массива может быть как числом, так и строкой.

В предыдущем примере массив создавался автоматически при описании первого элемента массива. Но массив можно задать и явно:

<?

$i = 1024;

$a = array( 1=>'abc', 2=>100, 'test'=>$i-100 );

print_r($a);

?>

Созданный в последнем примере массив $a полностью аналогичен массиву из предыдущего примера. Каждый элемент массива здесь задается в виде индекс=>значение. При создании элемента 'test' пришлось указать значение 100 непосредственно, так как на этот раз мы создаем массив "одним махом", и значения его элементов на этапе создания неизвестны PHP.

128

В строке 4 для вывода значения массива мы воспользовались функцией print_r(), которая очень удобна для вывода содержимого массивов на экран - прежде всего, в целях отладки.

Строки в выводе функции print_r разделяются обычным переводом строки \n, но не тэгом <br>. Для удобства чтения, строку print_r(..) можно окружить операторами вывода тэгов <pre>...</pre>:

echo '<pre>'; print_r($a); echo '</pre>';

Если явно не указывать индексы, то здесь проявляется свойство массивов PHP, характерное для числовых массовов в других языках: очередной элемент будет иметь порядковый числовой индекс. Нумерация начинается с нуля. Пример:

<?

$operating_systems = array( 'Windows', 'Linux', 'FreeBSD', 'OS/2');

$operating_systems[] = 'MS-DOS';

4

echo "<pre>";

print_r($operating_systems);

echo "</pre>";

?>

Ниже приведенное задание 1 показывает особенность использования функции print_r и тега <pre>…</pre> (рис. 3.83 -3.84).

Примечание. Далее в данной теме заголовок типа (рис. 3.80) приводить не будем.

Рис. 3.80. Заголовок в HTML коде.

129

Задание 1. Означивание массива и вывод на экран. Lab7_0.php.

В представленной ниже программе (рис. 3.81) приведены несколько вариантов объявления массива в коде с последующим выводом содержимого массива на экран.

Код Lab7_0.php.

Рис. 3.81. Код Lab7_0.php.

Результат вывода элементов массивов с помощью кода Lab7_0.php.

Рис. 3.82. Вариант 1. Результат работы кода Lab7_0.php.

130

Отметьте, что втором варианте мы явно не указывали индексы: PHP автоматически присвоил числовые индексы, начиная с нуля.

Рис. 3.83. Вариант 2. Результат работы кода Lab7_0.php.

Рис. 3.84. Вариант 3. Результат работы кода Lab7_0.php.

Записи массив можно перебирать с помощью цикла for. Количество элементов массива возвращает оператор count.

Например, если в тело программы Lab7_0.php добавить строки (рис.

3.85)

Рис. 3.85. Модифицированный код Lab7_0.php.

Тогда результат будет

Рис. 3.86. Вариант 4. Результат работы кода Lab7_0.php.

Задание 2. Цикл foreach. Lab7_1.php.

Для перебора элементов массива предусмотрен специальный цикл foreach:

131

На рис. 3.87 показано использование цикла foreach, а на рис. 3.88 результат.

Рис. 3.87. Использование Foreach для вывода массива. Lab7_1.php

Рис. 3.88. Использование Foreach для вывода массива.

132

Этот цикл работает (рис. 3.87) следующим образом: в порядке появления в коде программы элементов массива $languages, переменным $key и $value присваюваются соответственно индекс и значение очередного элемента, и выполняется тело цикла.

Если индексы нас не интересуют, цикл можно записать следующим образом: foreach ($languages as $value).

Т. е. в программе рис. 3.87 произвести следующую замену:

Тогда вывод на экране будет как показано на рис. 3.89.

Рис. 3.89. Использование Foreach для вывода массива.

Задание 3. Конструкции list и each. Lab7_2.php.

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

Допустим, у нас есть массив $lang = array('php', 'perl', 'basic'). Тогда конструкция list($a, $b) = $lang присвоит переменной $a значение 'php', а $b - 'perl'. Соответственно, list($a, $b, $c) = $lang дополнительно присвоит $c = 'basic'.

Если бы в массиве $lang был только один элемент, PHP бы выдал замечание об отсутствии второго элемента массива.

133

А если нас интересуют не только значения, но и индексы? Воспользуемся конструкцией each, которая возвращает пары индекс-значение.

Рис. 3.90. Использование Foreach для вывода массива. Lab7_2.php.

На первый взгляд может удивить тот факт, что в строках 19-21 переменным присваиваются разные значения, хотя выражения справа от знака присваивания совершенно одинаковые. Дело в том, что у каждого массива есть скрытый указатель текущего элемента. Изначально он указывает на первый элемент. Конструкция each же продвигает указатель на один элемент вперед.

Результат работы кода представленного на рис. 3.90 показан ниже.

Рис. 3.91. Использование Foreach для вывода массива. Lab7_2.php.

Эта особенность each позволяет перебирать массив с помощью обычных циклов while и for. Конечно, ранее рассмотренный цикл foreach

134

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

Ниже (рис. 3.92) показан модифицированный код Lab7_2.php, использующий цикл

Рис. 3.93. Использование While для вывода массива. Lab7_2.php.

Результат модифицированной программы приведенной на рис. 3.93, соответствует рис. 3.91.

После завершения цикла, указатель текущего элемента указывает на конец массива. Если цикл необходимо выполнить несколько раз, указатель

надо принудительно сбросить с помощью оператора reset: reset($brows). Этот оператор устанавливает указатель текущего элемента в начало массива.

Задание 4. Сортировка массива. Lab7_3.php.

Реализовать ввод названий месяцев и отсортировать их в алфавитном порядке.

Исходный код Lab7_3.php показан на рис. 3.93.

135

Рис. 3.93. Ввод и сортировка массива . Lab7_3.php.

В результате работы кода представленного на рис. 3.93 получим (рис. 3.94).

Рис. 3.94. Форма для ввода элементов массива . Lab7_3.php.

Если пользователь заполнит, например, форму (рис. 3.94) информацией вида

(рис. 3.95).

Рис. 3.95. Форма с информацией . Lab7_3.php.

136

Тогда нажатие кнопки приведет к следующему результату (рис.

3.96).

Рис. 3.96. Форма с информацией . Lab7_3.php.

137

Тема №8. Функции в сценариях РНР

Цель работы: Получение навыков по применению функций в PHP при обработке сценариев.

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

Данная тема посвящена функциям PHP, их определению и применению на практике. Хотя основное внимание в ней уделяется определению и вызову пользовательских функций, необходимо помнить и о том, что в PHP существуют сотни стандартных функций. Стандартные функции работают точно так же, как пользовательские, и обеспечивают заметную экономию времени при создании новых приложений. Обновленный список стандартных функций PHP можно найти по адресу http://www.php.net.

Что такое функция?

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

Определение и вызов функций

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

Существует и другой способ, заметно повышающий эффективность программирования и способствующий многократному использованию кода, - - выделение функций в отдельный файл (называемый библиотекой). Библиотеки удобны тем, что их функции можно использовать в разных приложениях, не создавая лишних копий и не рискуя допустить ошибки в процессе копирования. Эта тема рассматривается в задании «Построение библиотек функций».

Определение функции обычно состоит из трех частей:

имени функции;

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

138

Обобщенный синтаксис функций PHP выглядит так:

function имя_функции ([$параметр1, ..., $параметрn])

{

тело функции

}

Рис. 3.97. Синтаксис функций .

Имя функции должно подчиняться условиям, приведенным для идентификаторов. После имени функции следуют обязательные круглые скобки, в которые заключается необязательный список входных параметров ($параметр1, $параметр2, ...., $параметрn). Вследствие относительно либеральных принципов определения переменных в PHP указывать тип входных параметров не нужно. Хотя такой подход имеет свои преимущества, следует помнить, что механизм PHP не проверяет аргументы на соответствие тем типам, которые должны обрабатываться функцией. Случайные ошибки в использовании входных параметров могут привести к неожиданным последствиям (чтобы убедиться в том, что параметр относится к нужному типу, можно проверить его стандартной функцией gettype( )). После закрывающей круглой скобки следуют фигурные скобки, в которые заключается программный код, ассоциируемый с именем функции.

Рассмотрим простой пример использования функции. Предположим, вы хотите создать функцию для вывода лицензионной информации на web-странице:

function display_copyright()

{

print "Copyright © 2009 PHP-Powered Recipes. All Rights Reserved.";

}

Рис. 3.98. Простейшая функция .

Если ваш web-сайт состоит из нескольких страниц, достаточно вызвать эту функцию в конце каждой страницы -- и вам не придется заново переписывать один и тот же текст. А когда наступит 2010 год, одно простое изменение текста, выводимого этой функцией, приведет к автоматическому обновлению всех страниц. Если бы не преимущества функционального программирования, вам пришлось бы вручную редактировать все страницы, на которых выводится лицензионная информация.

Рассмотрим разновидность функции display_copyright(), которой при вызове передается параметр. Предположим, вы отвечаете за администрирование нескольких web-сайтов, каждому из которых присвоено отдельное имя. На каждом сайте имеется собственный административный

139

сценарий с несколькими переменными, относящимися к этому сайту; к их числу принадлежит переменная $site_name с именем сайта.

В этом случае функцию display_copyright() можно записать следующим образом:

function display_copyright($site_name)

{

print "Copyright © 2009 $site_name. All Rights Reserved.";

}

Рис. 3.99. Простейшая функция с параметром .

Переменная $site_name, значение которой присваивается за пределами display_copy-right(), передается функции в качестве параметра. Переданное значение можно использовать и модифицировать в любом месте функции, однако любые изменения будут действовать лишь внутри этой функции. Впрочем, специальные ключевые слова позволяют сделать так, чтобы изменения параметров распространялись и за пределы display_copyright(). Эти ключевые слова были представлены в лекции, в общем обзоре области видимости переменных и ее отношения к функциям.

Задание 1. Вложенные функции. Lab8_0_0.php

Функции можно вызывать внутри других функций -- по аналогии с тем, как одна управляющая конструкция (if, while, for и т. д.) может находиться внутри другой. Такая возможность удобна в любых программах, и в больших, и в малых, поскольку она увеличивает степень модульности приложения и упрощает сопровождение программы.

В примере, описанном выше, можно полностью избавиться от необходимости модификации даты. Для этого достаточно включить в display_copyright() вызов стандартной функции PHP date( ):

function display_copyright($site_name)

{

print "Copyright &copy ". date("Y"). "$site_name. All Rights Reserved.";

}

Рис. 3.100. Простейшая функция с параметром и без констант.

Параметр у функции date( ) указывает, что возвращаемое значение представляет собой текущий год, отформатированный в виде четырех цифр. Ниже на рис. 3.101 приведен пример описания и вызова фунцкии в файле Lab8_0_0.php. На рис. 3.102 показан результат вывода на экран работы функции display_copyright.

140

Рис. 3.101. Простейшая функция с параметром и без констант.

Рис. 3.102. Результат работы функции display_copyright. Примечание. Далее, для удобства, на рисунках будет приводиться только PHP код (информация между тегами и).

Задание 2. Объявление функций внутри других функций. Lab8_0.php

Также допускается объявление функций внутри других функций. Тем не менее, вложенное объявление еще не делает функцию «защищенной», то есть не ограничивает возможность ее вызова той функцией, в которой она была объявлена. Более того, вложенная функция не наследует параметров родительской функции; параметры должны передаваться ей точно так же, как и любой другой функции.

Пример вложенного объявления приведен в листинге рис. 3.103.

141

Рис. 3.103. Использование вложенных функций.

Сценарий выводит следующий результат:

Рис. 3.104. Результат Lab8_0.php.

Обратите внимание: функцию display_copyright( ) можно вызвать и за пределами display_footer( ). Концепция защищенных функций в PHP не поддерживается. Так, например, если строку с номером 31 на рис 3.103 раскоментарить, то получим следующий результат (рис. 3.105).

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

142

Рис. 3.105. Результат Lab8_0.php после модификации.

Задание 3. Возврат значений функцией. Lab8_1.php

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

Рис. 3.106. Листинг Lab8_1.php.

Краткое описание алгоритма.

Перед вызовом функции задаются значения переменных: $price (цена товара) и $tax (налоговая ставка).

143

Объявляется функция calculate_cost( ). При вызове функция получает два параметра: налоговую ставку и цену товара. Она вычисляет цену с учетом налога и возвращает ее командой return.

В теле программы вызывается calculate_cost() и значение возвращенное функцией, присваивается переменной $total_cost.

Далее выводятся соответствующие сообщения (рис. 3.107).

Рис. 3.107. Результат Lab8_1.php.

Функции, не возвращающие значений, также называются процедурами.

Задание 4. Возврат нескольких значений функцией. Lab8_2.php

Существует и другой способ использования возвращаемых значений, при котором вызов функции включается прямо в условную/циклическую команду. В следующей программе (листинг 3.108) сумма счета пользователя сравнивается с предельным размером кредита.

Алгоритм выглядит так:

Объявить функцию check_limit( ), которая при вызове получает два параметра. Первый параметр, $total_cost, определяет общую сумму счета, накопленную пользователем до настоящего момента. Второй параметр, $credit_limit, определяет максимальную сумму, которую может потратить пользователь. Объявление и состав функции на рис. 3.108 представлено строками 13-22.

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

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

Вызвать функцию check_limit( ) в условии команды if. Проверить, какое значение было возвращено при вызове -- истинное или ложное. В зависимости от результата проверки выполняется то или иное действие.

144

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

Листинг программы сравнения текущей суммы счета пользователя с предельным размером кредита приведен на рис. 3.108, а результат (при указанных исходных данных) на рис. 3.109.

Рис. 3.108. Результат Lab8_2.php.

При выполнении листинга 3.108 будет выведено сообщение об ошибке, поскольку значение $cost превышает $limit.

Рис. 3.109. Результат Lab8_2.php.

145

Задание 5. Возвращение функцией нескольких величин. Lab8_3.php

Функция также может возвращать сразу несколько значений при помощи списка. Напишем функцию, которая бы возвращала три лучших года для указанного сорта вина. Функция приведена в листинге . 3.110.

Краткий алгоритм:

Объявить функцию best_years( ), вызываемую с одним параметром. Параметр $label определяет сорт вина, для которого пользователь хотел бы узнать три рекомендуемых года.

Объявить два массива, $Tokay и $zinandali. В каждом массиве хранится три рекомендуемых года для соответствующего сорта вина.

Написать команду return, которая бы использовала особые возможности переменных. Выражение $$label сначала интерпретирует переменную $label, а затем интерпретирует полученное значение как имя другой переменной. В настоящем примере массив Tokay возвращается в виде списка, и каждый возвращаемый год занимает свою позицию в списке, для которого вызывалась функция.

Вывести сообщение с информацией о рекомендуемых годах.

Листинг 3.110. Возвращение функцией нескольких величин

Рис. 3.110. Исходный код PHP в Lab8_3.php.

Программа выводит следующий результат:

146

Рис. 3.111. Результат Lab8_3.php.

Задание 6. Рекурсивные функции . Lab8_4.php

Ситуация, при которой функция многократно вызывает сама себя, пока не будет выполнено некоторое условие, открывает замечательные возможности. При правильном использовании рекурсивные функции уменьшают объем программы и делают ее более выразительной. Рекурсивные функции особенно часто используются при выполнении повторяющихся действий -- например, при поиске в файлах/массивах и построении графических изображений (например, фракталов). Классическим примером рекурсивных функций, встречающимся во многих курсах программирования, является суммирование чисел от 1 до N. Программа, приведенная в листинге 3.112, суммирует все целые числа от 1 до 10.

Листинг 3.115. Использование рекурсивной функции для суммирования последовательных целых чисел

Рис. 3.112. Исходный код PHP в Lab8_4.php.

В результате выполнения листинга 3.112 будет выведен следующий результат:

Рис. 3.113. Результат Lab8_4.php.

Если функция вызывается достаточно часто, рекурсия делает программу более эффективной. Тем не менее, при использовании рекурсии

147

необходима осторожность, поскольку ошибки могут привести к зацикливанию программы.

Задание 7. Функции-переменные. Lab8_5.php

Одной из интересных возможностей PHP являются функции-переменные (variable functions), то есть динамические вызовы функций, имена которых определяются во время выполнения программы. Они значительно сокращают объем и сложность программного кода, а также часто снимают необходимость в условных командах if.

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

Следующая программа (листинг 3.114) демонстрирует эту непривычную, но полезную возможность. Допустим, программа выводит разную информацию в зависимости от языка, выбранного пользователем. В нашем примере для простоты используются приветственные сообщения для англо- и русскоязычных пользователей.

Алгоритм:

Создать сообщение для русского языка в функции с именем rushian. Создать сообщение для английского языка в функции с именем english.

Передать информацию о выбранном языке в сценарий, присвоив значение переменной $language.

Переменная $language используется для выполнения функции-переменной (в приведенном примере -- russian ()).

Листинг 3.117. Выбор функции в зависимости от пользовательского ввода

Рис. 3.114. Листинг Lab8_5.php.

148

Листинг 3.114 демонстрирует интересную концепцию функций-переменных и наглядно показывает, что функции-переменные способствуют уменьшению объема программного кода. Если бы не эта возможность, функцию пришлось бы выбирать командой if или switch; это привело бы к заметному увеличению объема программного кода и риску появления дополнительных ошибок при кодировании.

Рис. 3.115. Результат Lab8_5.php.

Задание 8. Построение библиотек функций. Lab8_6_0.php.

Библиотеки функций - одно из самых эффективных средств экономии времени при построении приложений. Включение одного или нескольких файлов в сценарий осуществляется стандартными функциями РНР к ним относятся:

include(имя файла с расширением ); include_once(имя файла с расширением ); require(имя файла с расширением ); require_once(имя файла с расширением ).

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

— происходит стандартное включение файла.

Функция require( ) похожа на include( ) — она тоже включает шаблон в тот файл, в котором находится вызов require( ).

Между функциями require( ) и include( ) существует одно важное различие. Файл, определяемый параметром require( ), включается в сценарий независимо от местонахождения require( ) в сценарии. Например, при вызове requiге( ) в блоке if при ложном условии файл все равно будет включен в сценарий!

Весь код РНР во включаемом файле обязательно заключается в теги РНР.

Чтобы пояснить механизм использования функций require() и include( ) рассмотрим простейший сценарий реализующий переход по ссылке (рис. 3.116).

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">

149

<title>Lab8_6 Библиотеки функций</title></head> <?PHP

print "<b>Простейшее меню на ссылке. Lab8_6.php</b> <br>"; ?>

<body bgcolor=pink> <?PHP

$site_title = "Название сайта"; $contact_email = "Ord@yandex.ru"; $contact_name = "VVS";

print "Вход на сайт- $site_title. <br> Контакт <a href = \"mai1to:$contact_email\">$contact_name</a>.";

?>

</body>

</html>

Рис. 3.116. Листинг Lab8_6.php.

Программа элементарна и ее вывод показан на рис. 3. 117.

Рис. 3.117. Содержимое браузера для Lab8_6.php.

Чтобы уяснить принцип работы require( ) и include( ) представим содержимое файла показагого на рис. 3.116 в виде двух файлов (Lab8_6_0. php -рис. 3.118 и Lab8_6_1. php - рис. 3.119)

Рис. 3.118. Содержимое Lab8_6_0.php.

150

Как показано на рис. 3.118 листинг программы содержит включающий

файл в который вынесено содержимое следующих строк (рис. 3.119) из файла Lab8_6.php.

Рис. 3.119. Содержимое для Lab8_6_1.php.

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

Имя расширения для включаемого файла может быть любым.

Отметим, что если строку раскоментарить, а строку

закоментарить, то реультат будет такой же, как показан на рис. 3.121.

Рис. 3.120. Экран браузера для Lab8_6_0.php.

Результат также не изменится, если первой строкой в листинге (рис. 3.118) будет указано

Задание 9. Построение шаблона сайта. Lab8_7_0.php.

Построение компонентов

При определении структуры типичной web-страницы она обычно разбивается на три части: заголовок, основную часть (контент) и колонтитул. Как правило, в большинстве web-сайтов присутствует заголовок, который практически не изменяется; в основной части выводится запрашиваемое содержание сайта, поэтому она часто изменяется; наконец, колонтитул содержит информацию об авторских правах и навигационные ссылки.

151

Колонтитул, как и заголовок, обычно остается неизменным. Это не обязательная структура, а лишь рекомендации общей структуры, которая может послужить отправной точкой для курсового проекта.

Заголовок

Заголовочный файл (вроде приведенного в листинге 3.121 (Lab8_7_1.php) присутствует практически в каждом из web-сайтов с поддержкой РНР. В этом файле содержится информация, действующая на уровне всего сайта, — например, заголовок, контактные данные и некоторые компоненты кода HTML-страницы.

Колонтитул

Колонтитулом (footer) обычно называется информация, расположенная в нижней части страниц сайта, — контактные данные, ссылки и информация об авторских правах. Эту информацию можно разместить в отдельном файле (Lab8_7_3.php) и включать в качестве шаблона так же, как это делается с заголовком.

Основная часть

В основной части страницы (Lab8_7_2.php) подключается содержимое заголовка и колонтитула. В сущности, именно основная часть содержит информацию, интересующую посетителей сайта. Рекомендации по поводу конкретной структуры страниц определяются семантикой данных и должны упрощать администрирование страниц.

Используя свойства конструкции include (см. тему 8 задание 7) можно построить файл (Lab8_7_0.php, рис. 3.121), содержащий описание составляющих страницы сайта (обычно такой файл на практике получает название Index.php или Index.html).

Как показано на рис. 3.121 файл включает вызов основных компонент головной страницы сайта, которая показана на рис 3.122.

Рис. 3.121. Файл Lab8_7_0.php.

152

Рис. 3.122. Изображение на экране первой страницы сайта.

Ниже приводятся содержимое файлов использованных при построении страницы.

<?php

$site_name = "Мой_Сайт"; $site_email= "wjgnmore@hotrnail.com";

$site_path = "http://localhost/phprecipes"; ?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">

<title>Lab8_7_1 Заголовок </title> </head>

<body bgcolor="#7b8079" text="#ffffff" link="fe7d387" alink="#e7d387" vlink="#e7f0e4">

<table width="45%" cellpadding="0" cellspacing="0" border="1"> <tr>

<td valign = "top">

Курсовой проект

</td>

<td valign = "top" align="right"> <?

153

echo ("<h2 align=center>БАЗЫ ДАННЫХ</h2>");

// Вывести текущую дату и время print date ("F d, h:i a");

?>

</td>

</tr>

</table>

</body>

</html>

Рис. 3.123. Содержимое файла Lab8_7_1.php для прорисовки заголовка.

С помощью данного файла прорисовывается следующая часть рис.

3.122.

Рис. 3.124. Результат Lab8_7_1.php для прорисовки заголовка.

Часть рисунка приведенная ниже реализуется с помощью файла

Lab8_7_2.php (рис. 3.126).

Рис. 3.125. Результат Lab8_7_2.php для прорисовки контента.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=windows-1251"> <title>Lab8_7_2 Контент</title>

</head>

<body bgcolor="#7b8079" text="#ffffff" link="fe7d387" alink="#e7d387" vlink="#e7f0e4">

<table width = "45%" cellpadding="0" cellspacing="0" border="1">

154

<tr>

<td valign="top" width="25%">

<a href = "<? $site_path; ?>/tutorials.php">Обучение</a><br> <!--<a href = "http://localhost/php/articles.php">Скрипты </a> <br>-->

<a href = "<?=$site_path;?>/scripts.php">Таблицы</a><br> <a href = "<?=$site_path;?>/articles.php">Скрипты</a><br> <a href = "<?=$site_path;?>/contact.php">Об авторе</a><br> <!--

По ссылкам пользователь может переходить как на обычные страницы HTML, так и на страницы, содержащие код РНР.

Например:

$link = "date.php";

print "<а href = \"$link\">View today's date</a> <br>\n" -->

</td>

<td valign="top" width="75%">

Добро пожаловать в курсовой проект. <center><!--Заголовок темы по центру синим цветом -->

<h3><font color="#0000FF">Тема курсового проекта</font></h3>

</center>

<p>Цель курсового проекта:

</td>

</tr>

</table>

</body>

</html>

Рис. 3.126. Содержимое файла Lab8_7_2.php для прорисовки контента.

Ниже приводится листинг программы, предназначенный для прорисовки колонтитула (часть 3 на рис. 3.122).

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=windows-1251"> <title>Lab8_7_3 Колонтитул</title>

</head>

<body bgcolor="#7b8079" text="#ffffff" link="fe7d387" alink="#e7d387" vlink="#e7f0e4">

<table width="45%" cellspacing="0" cellpadding="0" border="1">

155

<tr><td valign="top" align="middle">

<? print "Copyright &copy ".date("Y")." $site_name. All Rights Reserved.<br>";?>

<a href = "mailto:<?=$site_email;?>">Контакт</a> |

<a href ="<?=$site_path;?>privacy.php">Конфиденциальность</a> </td></tr>

</table>

</body>

</html>

Рис. 3.127. Содержимое файла Lab8_7_3.php для прорисовки колонтитула.

Рис. 3.128. Результат Lab8_7_3.php для прорисовки колонтитула.

156

Тема №9. Использование файлов для хранения данных в сценариях РНР

Цель работы: Обучение работе с файлами для хранения данных при обработке сценариев.

Задание 1. Разработка интерфейса для загрузки файла. Lab9_0.php.

В данной работе необходимо разработать интерфейс для загрузки файлов на ваш Web-сайт с удаленного компьютера. Интерфейс состоит из двух частей: формы и сценария РНР. В этой теме Вы узнаете, как выполнить следующие действия:

Создать HTML-форму для загрузки файлов;

Создать PHP-сценарий для управления загрузкой файлов.

Чтобы начать процесс загрузки, вам необходимо следующее:

HTML-форма;

Файл для загрузки;

Место под загружаемый файл;

PHP-сценарий для управления загрузкой файлов, т. е сценарий, который поместит файл в назначенное ему место.

Процесс загрузки представляет собой следующую последовательность действий:

Пользователь загружает HTML-форму и видит текстовое поле ввода и кнопку Обзор на своем Web-браузере;

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

Полный путь к выбранному для загрузки файлу появится в поле ввода формы;

Пользователь нажимает кнопку Загрузить на сервер;

Выбранный файл передается на Web-сервер и помещается во временную папку;

Сценарий РНР, используемый для обработки формы, проверяет, был ли файл отправлен, и выполняет команду копирования файла, хранящегося во временной папке, чтобы переместить его в существующую папку на Web-сервере;

Сценарий РНР подтверждает пользователю, что операция загрузки завершена.

Пользователь РНР (пользователи, которые запустили РНР) должны иметь право записи файла во временную папку, так же как и в результирующую папку на сервере.

157

Создание HTML формы может быть проведено на основании следующего кода рис. 3.129. В Вашей шаблонной папке данный код, хранится под именем Lab9_0.php.

Рис. 3.129. HTML форма для выбора файла и отправки его на сервер.

Пояснения к коду.

Чтобы начать форму с использованием метода post и сценария с именем Lab9_1.php в качестве действия, использована строка 11.

Параметр ENCTYPE используется потому, что мы будем отправлять больше, чем просто текст, а именно файл – на это указываеит параметр TYPE="file" в строке 15. Имя для переменной выбирается произвольно и у нас оно равно myfile.

Параметр TYPE="file" в поле ввода формы будет отображаться, как поле ввода с кнопкой Обзор. Кнопка Обзор (рис. ) запускает файловый менеджер, с помощью которого вы можете выбрать файл для загрузки.

Строка 16:

предназначена для формирования кнопки

Примечание. В тексте (рис. 3 ) используется тег strong.

158

< strong > текст </ strong > этот тег предназначен для выделения важных слов жирным шрифтом, поисковики воспринимают, как важны слова на странице, и дают таким словам наибольший вес.

Тег <strong> предназначен для акцентирования внимания в тексту для пользователей, чтобы дать возможность выделить наиболее важные слова, как для посетителей, так и поисковых систем.

Тег <b>текст</b> - является тегом физической разметки и делает разметку слов также жирным шрифтом, а тег <strong> — тег логической разметки и дает возможность выделить наиболее важные слова в тексте.

Если же посмотреть текст, браузером, то текст на странице, оформленный тегами <b> и <strong>, будет отмечен по-разному. Но в браузер которыми мы пользуемся, выделения тегами <b> и <strong> будут равнозначными. Но для наибольшей выгоды в выдаче в поисковых системах целесообразно использовать тег

<strong>

Сохраните созданный файл с именем Lab9_0.php в папке для документов вашего Web-сервера. Запустите свой Web-браузер, в поле ввода Адрес введите,

http://localhost/php/Lab9_0.php и нажмите клавишу Enter.

Браузер загрузит страницу Загрузка файла (Рис. 3.130).

Рис. 3.130. HTML форма на экране.

На рис. 3.130 Вы видите форму загрузки файла с полем ввода и кнопками Обзор и Загрузить на сервер. В следующем параграфе Вы создадите сценарий для обработки этой формы.

Создание сценария загрузки.

Перед началом создания сценария запомните список переменных, которые создаются автоматически после успешной загрузки файла. Основная часть имени переменных - myfile - является именем поля ввода созданной в предыдущей форме (см. строку 15, рис 3.131).

$myfile - значение ссылается на временный файл на Web-сервере. $myfile_name - значение является действительным именем файла, который был загружен. Например, если имя файла было me.jpg, то значение $myfile_name будет me.jpg.

$myfile_size - значение является длиной загруженного файла в байтах. $myfile_type — значение является типом загруженного файла, таким как,

например, image/jpg.

159

Созданный вами файл должен выглядеть так, как показано на рис. 9.3.

Рис. 3.131. Код HTML формы.

160

Целью создаваемого сценария является следующее:

взять загруженный файл, скопировать его в папку для документов Web-сервера и вернуть подтверждающее сообщение пользователю, содержащее все переменные из указанного выше списка.

Создайте с помощью текстового редактора новый файл с именем Lab9_1.php (рис. 3.131).

Сохраните созданный файл с именем Lab9_1.php в папке для документов вашего Web-сервера.

Загрузкa файла с помощью формы и сценария

Теперь, когда вы создали форму и сценарий для загрузки файла, проверим, как все это работает.

Запустите свой Web-браузер, в поле ввода Адрес введите http://localhost/php/Lab9_0.php

и нажмите клавишу Enter. Браузер загрузит страницу Загрузка файла (рис. 3.130). Нажмите кнопку Обзор. На экране появится диалог Выбор файла. В качестве файла пересылки укажите файл

"W:\home\localhost\www\php\img\footer.jpg" (рис. 3.132).

Рис. 3.132. Выбор файла для отсылки на сервер.

Используя этот диалог, найдите на своем компьютере любой файл с изображением размером не более 2 Мбайт, выберите его и нажмите кнопку

161

Открыть. Диалог Выбор файла закроется, а имя выбранного файла с полным путем будет помещено в поле ввода Файл для загрузки (рис. 3.133).

Нажмите кнопку Загрузить на сервер(рис. 3.133).

Рис. 3.133. HTML форма на экране.

По окончании загрузки в рабочем окне браузера появится сообщение об успешном ее завершении (Рис. 3.134).

Рис. 3.134. Сообщение об успешном завершении загрузки файла.

Чтобы убедиться, что файл действительно был загружен, выполните следующие действия:

Выберите команду меню браузера Файл/Открыть. На экране появится диалог Открыть (рис. 3.135)

Рис. 3.135. Диалог Открыть

162

В поле ввода Открыть введите полный путь к загруженному файлу, в нашем случае это w:/tmp/footer.jpg, и нажмите клавишу Enter.

Или в поле Адрес браузера укажите file://localhost/W:/tmp/footer.jpg и

на экране получите следующее (рис. 3.136) Окно браузера отобразит загруженный на ваш Web-сервер файл.

Рис. 3.136. Файл, который был загружен с использованием созданного сценария

Если в программе Lab9_0.php указать другой обработчик (например, Lab9_2.php, рис. 3.137) и переслать этот же файл: "W:\home\localhost\www\php\img\footer.jpg"

<?PHP

$myfile_size = $_FILES["myfile"]["size"];//Размер файла $myfile_type = $_FILES["myfile"]["type"];//Тип файла $error_flag = $_FILES["myfile"]["error"];

$myfile_name = $_FILES["myfile"]["name"];//Имя файла if ($myfile_name !="")

{

echo "Можно копировать файл myfile=".$_FILES["myfile"]["tmp_name"]." <br> ";

if(@copy($_FILES["myfile"]["tmp_name"], "w:/tmp/".$_FILES["myfile"]["name"]) )

{

echo("Файл успешно загружен <br>"); $myfile = $_FILES["myfile"]["tmp_name"];

$fp = fopen($myfile,"r");

$content = fread($fp, filesize($myfile)); fclose($fp);

// Вывод содержимого файла на экран print($content);

}

else

{

echo("Ошибка. Невозможно скопировать файл!!");

}

}

else

163

{

die ("Файл не обнаружен !!");

}

?>

<html>

<head>

<title>Lab9_2 Загрузка файла</title>

</head>

<body>

<h2>Загрузка файла завершена успешно</h2>

<p>Вы отправили файл <? echo "$myfile_name"; ?> </p> <p>Размер файла: <? echo "$myfile_size"; ?> байт </p>

<p>Тип файла: <? echo "$myfile_type"; ?> </p> <p>Результат получен в обработчике Lab9_2.php </p> </body>

</html>

Рис. 3.137. Файл, который был загружен с использованием созданного сценария

Запуск модифицированной программы Lab9_0.php приводит к следующему результату (рис. 3.138).

Рис. 3.138. Файл, который был загружен с использованием созданного сценария Lab9_2.php

Задание 2. Автоматическая отправка данных по электронной почте. Lab9_4.php.

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

В следующем разделе, создается небольшая форма (рис. 3.139), в которой пользователь вводит информацию и комментарии по поводу сайта.

После ввода информации данные форматируются соответствующим образом (рис. 3.140) и передаются стандартной функции PHP mail( ).

Функция mail( ) отправляет сообщение заданному адресату по электронной почте.

164

Рис. 3.139. Форма ввода

Синтаксис функции mail( ).

boolean mail (string получатель, string тема, string сообщение [, string

доп_заголовки])

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

системе UNIX функция mail( ) использует утилиту sendmail. В Windows эта функция работает лишь при наличии установленного почтового сервера или если функция mail( ) связана с работающим сервером SMTP. Эта задача решается модификацией переменной SMTP в файле php.ini.

Если вы сделали все необходимое и функция mail( ) работает в вашей системе, попробуйте выполнить следующий фрагмент (конечно, адрес webserver@example.com заменяется вашим настоящим адресом электронной почты).

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"> <head>

<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" /> <title>Lab9_4 Отправка по Email</title>

</head>

<body bgcolor="#ffffff" text="#000000" link="#cbda74" vlink="#808040" alink="#808040"> <p>Lab9_4.php</p>

165

<?

function sendMail($name,$email,$feedback)//пользовательская функция, //используюшая стандартную функцию Email

//$name

- Фамилия, имя клиента

//$email

-

Email клиента

//$feedback

-мнение клиента

{

$toaddress = 'feedback@example.com'; $subject = 'Обратная связь от Web-сайта'; $mailcontent = 'ФИО клиента: '.$name."\n"

.'Email-адрес клиента: '.$email."\n"

."Комментарии клиента: \n".$feedback."\n"; $fromaddress = 'From: webserver@example.com';

echo ("<br>Сообщение на Mail <br>".$mailcontent."<br>"); // кому тема сообщение отправитель mail($toaddress, $subject, $mailcontent, $fromaddress) or die("Could not send email!");

//

echo ("После вызова функции nl2br<br>");

//функция nl2br заменяет в переданной ей строке все

//символы новой строки (\n) на символ <br/>.

echo ("Сообщение <br>".nl2br($mailcontent)."");

return true;

} // конец тела функции

// тело основной пограммы $name = $_POST['name']; $seenform=$_POST['seenform']; $email=$_POST['email']; $feedback=$_POST['feedback'];

// Создать форму $form = "

<form action=\"Lab9_4.php\" method=\"post\">

<input type=\"hidden\" name=\"seenform\" value=\"z\">

<b>Пожалуйста, сообщите Ваше мнение о нашей работе.</b><br> Фамилия, имя:<br>

<input

type=\"text\"

name=\"name\"

size=\"20\"

maxlength=\"20\"

value=\"$name\"><br>

Ваш Email:<br>

<input

type=\"text\"

name=\"email\"

size=\"20\"

maxlength=\"40\"

value=\"$email\"><br>

Ваше мнение:<br>

<textarea name=\"feedback\" rows=\"3\" cols=\"30\"></textarea><br> <input type=\"submit\" value=\"Отправить мнение\">

166

</form>";//конец создания формы

if ($seenform != "z"): // Заполнялась ли форма ранее? print "$form"; // Первая прорисовка формы

else: // Пользователь заполнил форму. Проверить введенные данные. $error_flag = "n"; //признак что ошибок при заполнении формы нет

if ($name == ""): //поле имени не содержит информацию

print "<font color=\"red\"> Вы забыли ввести Ваше имя </font><br>"; $error_flag = "y";//признак наличия ошибки

else:

if ($email == ""):// поле адреса не содержит информацию $error_flag = "y";

print "<font color=\"red\">Укажите правильный email address! Он не должен быть пустым.</font><br>";

else:

//Преобразовать все алфавитные символы в адресе электронной почты $email = strtolower(trim($email));// к нижнему регистру

endif; //if ($email == "") endif; //if ($name == "")

if(!empty($_POST['email'])):

//Убедиться в правильности синтаксиса адреса электронной почты //Будем считать, что стандартный адрес электронной почты выглядит так:

//admin@mail.ru

//Адрес состоит из двух частей это:

// admin - имя пользователя.

// mail.ru - домен, доменное имя.

//Их разделяет знак @(собака).

//Имя пользователя - может состоять из букв разного регистра, //цифр, знаков подчѐркивания, точек, минусов.

//Доменное имя - так же может состоять из букв разного //регистра, цифр, знаков подчѐркивания, точек, минусов.

if(preg_match("|^[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,6}$|i", $_POST['email'])): echo $_POST['email']. " Email - Правильный.";

$error_flag = "n"; sendMail($name,$email,$feedback); //отсылка почты

else:

$error_flag = "y";

echo $_POST['email']. " Email - НЕправильный.<br>";

print "<font color=\"red\"> Пример правильного возможного email: admin@mail.ru</font><br>";

endif;

else:

//echo "Вы не ввели email.".$error_flag; if ($error_flag == "y"):

167

Если флаг ошибки $error_flag установлен, то

echo "заново отобразить форму.";

print "$form";

else: // Обработать данные пользователя

print "<br>Данные введены правильно<br>"; sendMail($name,$email,$feedback);

endif;

endif; //if(!empty($_POST['email'])) endif;

?>

</body>

</html>

Рис. 3.140. Файл Lab9_4.php для создания формы ввода и отправки данных по электронной почте.

Пусть пользователь ввел в форму (рис. 3.139) следующую информацию

(рис. 3.141).

Рис. 3.141. Заполненная форма (файл Lab9_4.php).

Если пользователь использует кнопку , то программа проверит исходные данные и в случаи их правильности вызовет пользовательскую функцию sendMail(), которая подготовит данные для пересылки и вызовет стандартную функцию mail( ) и пользовательские данные отправляются по адресу, определяемому переменной $toaddress. Затем в браузере выводится сообщение для пользователя.

Рис. 3.142. Сообщение для пользователя (файл Lab9_4.php, функция sendMail()).

168

В теле функции sendMail() использована стандартная функция nl2br, которая заменяет в переданной ей строке все символы новой строки (\n) на символ <br/>.

Таким образом после оператора

echo ("Сообщение <br>".nl2br($mailcontent)."");

будет выведено сообщение вида (рис. 3.143)

Рис. 3.143. Сообщение для пользователя (файл Lab9_4.php, функция nl2br() ).

Задание 3. Сохранение пользовательских данных в текстовом файле

Lab9_5.php

Пользовательские данные сохраняются в текстовом файле для последующего статистического анализа, поиска и т. д. -- короче, любой обработки по вашему усмотрению. В листинге 3.144, как и в предыдущих примерах, данные формы обрабатываются в одном сценарии. Пользователю предлагается ввести четыре объекта данных: имя, адрес электронной почты, язык и профессию. Введенная информация сохраняется в текстовом файле lab9_5.txt. Элементы данных разделяются символами «вертикальная черта»

(|).

Листинг 9.18. Сохранение пользовательской информации в текстовом файле.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"> <head>

<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" /> <title>Lab9_5 Запись в текстовый файл</title>

</head>

<body>

<p>Lab9_5.php Запись ввода в текстовый файл lab9_5.txt</p>

<?PHP //тело основной программы

$DOCUMENT_ROOT = $_SERVER['DOCUMENT_ROOT'];

//Например, DOCUMENT_ROOT= W:/home/localhost/www $name = $_POST['name'];

$seenform=$_POST['seenform']; $email=$_POST['email'];

169

$job=$_POST['job']; $language=$_POST['language'];

// Создать форму

$form = "

<form action=\"Lab9_5.php\" method=\"post\">

<input type=\"hidden\" name=\"seenform\" value=\"z\">

<b>Укажите Ваши данные!<br>

<?php /*?> <?php Внимание! Тег b не закрываем */?>

Фамилия, имя:<br>

<input

type=\"text\"

name=\"name\"

size=\"20\"

maxlength=\"20\"

value=\"$name\"><br>

Ваш Email:<br>

<input

type=\"text\"

name=\"email\"

size=\"20\"

maxlength=\"40\"

value=\"$email\"><br>

Ваш предпочитаемый язык:<br>

<select name=\"language\"> <option value=\"\">Выберите язык:

<option value=\"English\">Английский <option value=\"Spanish\">Испанский <option value=\"Italian\">Итальянский <option value=\"French\">Французкий </select><br>

Ваше занятие:<br> <select name=\"job\">

<option value=\"\">Кто Вы?: <option value=\"student\">Студент

<option value=\"programmed\">Программист <option value=\"manager\">Менeджер <option value=\"slacker\">Пенсионер </select><br>

<input type=\"submit\" value=\"Зафиксировать в файле\"> </form>";

if ($seenform != "z"): // Заполнялась ли форма ранее?

print "$form"; // echo " Первая прорисовка формы"; //exit;

else://Заполнили форму. Проверить введенные данные. $error_flag = "n"; //признак что ошибок нет

if ($name == ""):

// Убедиться в том, что поле имени содержит информацию

print "<font color=\"red\"> Вы забыли ввести Ваше имя</font><br>"; $error_flag = "y";//признак наличия ошибки

else:

170

//Убедиться в том, что поле адреса содержит информацию if ($email == ""):

$error_flag = "y";

print "<font color=\"red\">Укажите правильный email address! Он не должен быть пустым.</font><br>";

else:

Преобразовать все алфавитные символы в адресе

электронной почты к нижнему регистру

$email = strtolower(trim($email)); endif; //if ($email == "")

endif; //if ($name == "")

if(!empty($_POST['email'])and $error_flag == "n"):

//Убедиться в правильности синтаксиса адреса электронной почты //Будем считать, что стандартный адрес электронной почты выглядит так:

// admin@mail.ru

//Адрес состоит из двух частей это:

// admin - имя пользователя.

// mail.ru - домен, доменное имя.

//Их разделяет знак @(собака).

//Имя пользователя - может состоять из букв разного //регистра, цифр, знаков подчѐркивания, точек, минусов. //Доменное имя - так же может состоять из букв разного //регистра, цифр, знаков подчѐркивания, точек, минусов.

if(preg_match("|^[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,6}$|i", $_POST['email'])): //echo $_POST['email']. " Email - Правильный.<br>";

$error_flag = "n";

echo "Данные введены. Можно формировать файл lab9_5.txt<br>";

$fd = fopen($DOCUMENT_ROOT."/../lab9_5.txt", 'ab'); echo 'Открыть файл для добавления<br>Путь='

.$DOCUMENT_ROOT."/../lab9_5.txt".'<br>Результат открытия='.$fd.'<br

/>';

if (!$fd): // ошибка открытия файла

echo '<p><strong> Файл lab9_5.txt не доступен. <br></strong> </p></body></html>';

exit;//выход из программы

endif;

//Убедиться, что во введенных данных не встречается вертикальная черта.

$name = str_replace("|", "", $name); $email = str_replace("|", "", $email);

// Построить строку с пользовательскими данными

171

$user_row = $name." ".$email."|".$language." ".$job."\n"; fwrite($fd, $user_row) or die("Could not write to file!"); fclose($fd);

print "<br>Спасибо что уделили время для ответов на вопросы"; print "<br>Строка в файле ".$user_row;

else://шаблон Email не точен $error_flag = "y";

echo $_POST['email']. " Email - НЕправильный.<br>";

print "<font color=\"red\"> Пример правильного возможного email: admin@mail.ru</font><br>";

endif;

else: //echo "Вы не ввели email.".$error_flag; if ($error_flag == "y"):

// Если флаг ошибки $error_flag установлен, то заново отобразить форму.; print "$form";

endif; //if ($error_flag == "y"): endif; //if(!empty($_POST['email'])) endif;

?>

</body>

</html>

Рис. 3.144. Файл Lab9_5.php, запись данных в текстовый файл.

Обратите внимание на фрагмент: $name = str_replace("|", "", $name); $email = str_replace("|", "", $email);

В данном фрагменте мы проверяем, что пользователь не включил в имя или адрес электронной почты символы «вертикальная черта» (|). Функция str_replace( ) удаляет эти символы, заменяя их пустой строкой. Если бы это не было сделано, пользовательские символы | нарушили бы структуру файла данных и существенно затруднили (а то и сделали невозможным) его правильную обработку.

При работе с относительно малыми объемами информации вполне можно обойтись текстовыми файлами. Однако при большом количестве пользователей или объеме сохраняемой информации для хранения и обработки данных, введенных в форме, лучше воспользоваться базой данных. Эта тема подробно рассматривается далее в лабораторных.

Согласно кода программы, показанного на рис. 3.144 на экран будет выведена форма рис. 3.145.

Заполненная форма ввода показана на рис. 3.146, а результат работы программы (при условии, что пользователь ввел правильные данные) показан на рис. 3.147 и рис. 3.148.

172

Рис. 3.145. Форма ввода для кода Lab9_5.php.

Рис. 3.146. Заполненная форма ввода для кода Lab9_5.php.

Если пользователь использует кнопку , то будет создан текстовый файл по адресу:

Рис. 3.146a. Результат кода Lab9_5.php. Файл Lab9.txt

173

Рис. 3.147. Результат кода Lab9_5.php.

коде программы показанной на рис. 3.144 использована функция

PHP fopen.

$fd = fopen($DOCUMENT_ROOT."/../lab9_5.txt", 'ab');

которая в данном примере используется для открытия файла для добавления в него информации.

Первым параметром указывается файл - $DOCUMENT_ROOT."/../lab9_5.txt", который должен быть открыт. Второй параметр - 'ab' – режим открытия файла (в данном случае режим 'ab' предполагает не только открытие для добавления в конец файла, но и создание файла, если он отсутствовал по указанному пути).

примере для указания пути к файлу использована встроенная переменная $_SERVER['DOCUMENT_ROOT'. Эта переменная указывает на основание дерева документов используемого вами Web-сервера.

Символ .. обозначает родительский каталог корневого каталога документов. В целях безопасности этот коталог находится вне дерева документов, чтобы этот файл не был доступен в WEB, кроме как только через разработанный Вами интерфейс. Этот путь называется относительным, поскольку он описывает позицию в файловой системе относительно корня документов.

Запись в файл в PHP осуществляется функцией: fwrite($fd, $user_row).

Где $fd – номер ресурса возвращенного функцией fopen, а $user_row – значение записываемое в файл.

174

Задание 4. Сохранение пользовательских данных в текстовом файле

Lab9_6_0.php

В данном задании создается форма ввода (рис. 3.148) предназначенная для заказа товара.

Рис. 3.148. Форма ввода, реализованная в коде Lab9_6_0.php.

Листинг программы для реализации формы представлен ниже.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"> <head>

<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />

<title>Lab9_6_0 Запись в текстовый</title>

</head>

<body>

<p>Lab9_6_0.php Запись в текстовый файл Lab9_6_1.txt</p> <h1>Автозапчасти </h1>

<h2>Форма заказа</h2>

<form action="Lab9_6_1.php" method=post> <table border=0>

<tr bgcolor=#cccccc>

<td width=150>Товар</td>

<td width=15>Количество</td> </tr>

<tr> <td>Автопокрышки</td>

<td align=left><input type="text" name="tireqty" size=3 maxlength=3></td> </tr>

<tr>

175

<td>Машинное масло</td>

<td align=left><input type="text" name="oilqty" size=3 maxlength=3></td> </tr>

<tr>

<td>Свечи зажигания</td>

<td align=left><input type="text" name="sparkqty" size=3 maxlength=3></td> </tr>

<tr>

<td>Адрес доставки</td>

<td align=center><input type="text" name="address" size=40 maxlength=40></td> </tr>

<tr>

<td colspan=2 align=center><input type=submit value="Отправить заказ"></td> </tr>

</table>

</form>

</body>

</html>

Рис. 3.149. Код HTML (Lab9_6_0.php) для реализации формы рис. 3.148.

Обработчик формы (как показано в теле кода формы на рис. 3.149)

находится в файле Lab9_6_1.php (рис. 3.150).

Листинг обработчика. Файл Lab9_6_1.php. <?php

// создать короткие имена переменных $tireqty = $_POST['tireqty']; //Автопокрышки $oilqty = $_POST['oilqty']; //Машинное масло

$sparkqty =$_POST['sparkqty'];//Свечи зажигания $address = $_POST['address']; //Адрес доставки

$DOCUMENT_ROOT = $_SERVER['DOCUMENT_ROOT']; //DOCUMENT_ROOT: W:/home/localhost/www

?>

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" /> <title>Автозапчасти - Результаты заказа</title>

</head>

<body>

<h1>Автозапчасти Lab9_6_1</h1> <h2>Результаты заказа</h2>

<?php

$date = date('H:i, jS F');

echo '<p>Заказ обработан в '.$date.'</p>'; if ($oilqty<0 or $oilqty<0 or $sparkqty<0):

echo '<p><font color=\"red\">Заказ не принят!</font></p>';

echo 'Отрицательное число в элементах заказа<br></body></html>'; exit;

176

endif;

echo '<p>Список вашего заказа: </p>';

$totalqty = 0;

$totalqty = $tireqty + $oilqty + $sparkqty; echo 'Заказано товаров: '.$totalqty.'<br />';

if( $totalqty == 0): //{

echo 'Вы ничего не заказали на предыдущей странице!<br />'; exit;

//}

endif;

if ( $tireqty>0 )

echo $tireqty.' автопокрышек <br />'; if ( $oilqty>0 )

echo $oilqty.' бутылок с маслом<br />'; if ( $sparkqty>0 )

echo $sparkqty.' свечей зажигания<br />';

$totalamount = 0.00;//Итого по заказу define('TIREPRICE', 100); //стоимость автопокрышеки define('OILPRICE', 10); //стоимость бутылки с маслом define('SPARKPRICE', 4);

$totalamount = $tireqty * TIREPRICE

$oilqty * OILPRICE

$sparkqty * SPARKPRICE;

$totalamount=number_format($totalamount, 2, '.', ' ');

echo '<p>Итого по заказу: '.$totalamount.'</p>'; echo '<p>Адрес доставки: '.$address.'</p>';

$outputstring = $date."\t"

.$tireqty." автопокрышек\t"

.$oilqty." бутылок с маслом\t"

.$sparkqty." свечей зажигания\t\$"

.$totalamount."\t".$address."\n";

//В качестве разделителя значений использован символ //горизонтальной табуляции "\t". В качестве разделителя //строк использована управляющая последовательность "\n"

177

//открыть файл для добавления

//@$fp = fopen($DOCUMENT_ROOT."/../lab9_6_1.txt", 'ab');

//Верхний fopen откроет правильно, как и следующий оператор //но путь нахождения файла будет различен.

@$fp = fopen($DOCUMENT_ROOT."/php/lab9_6_1.txt", 'ab');

/*

echo 'Lab9_6_1 Открыть файл lab9.txt для добавления Путь='.$DOCUMENT_ROOT."/php/lab9_6_1.txt".' <br>Результат открытия='.$fp.' gettype(fp)='.gettype($fp).' <br />';

//открыть файл lab9_6_1.txt для добавления

//Путь=W:/home/localhost/www/php/lab9_6_1.txt

//Результат открытия=Resource id #3 gettype(fp)=resource

*/

if (!$fp)

{echo '<p><strong>В настоящий момент ваш запрос не может быть обработан.<br>'

'Пожалуйста, попытайтесь позже.</strong></p></body></html>'; exit;}

//запись в файл

fwrite($fp, $outputstring, strlen($outputstring)); fclose($fp);//закрытие файла

echo '<p>Заказ записан в файл (путь): '.$DOCUMENT_ROOT.'/php/lab9_6_1.txt.</p>'; ?>

</body>

</html>

Рис. 3.150. Код обработчика Lab9_6_1.php, для реализации формы рис. 3.148. Если пользователь заполнит форму информацией вида:

Рис. 3.151. Пример заполненной формы.

178

и использует кнопку , то реакция обработчика Lab9_6_1.php будет следующей (рис. 3.152).

Рис. 3.152. Реакция обработчика на ошибочные действия пользователя при заполнении формы.

Если пользователь использует кнопку и приведет форму к виду

(рис. 3.153),

Рис. 3.153. Пример заполненной формы.

реакция обработчика, после нажатия кнопки ―Отправить заказ‖ показана на рис. 3.154.

Введенная информация будет записана а текстовый файл функцией

fwrite($fp, $outputstring, strlen($outputstring));

Этот вызов указывает PHP на необходимость записи строки из переменной $outputstring в файл на который указывает $fp. Третий параметр функции strlen($outputstring) указывает на длину записи, заносимой в файл.

Например, состав текстового файла после добавления информации из формы показанной на рис. 3.153, представлен на рис. 3.155.

179

Рис. 3.154. Реакция обработчика на действия пользователя при заполнении формы.

продожение записи в файле Lab9_6_1.txt

Рис. 3.155. Состав файла Lab9_6_1.txt после заполнения формы.

Закрытие файла производится с помощью следующей функции:

fclose($fp);//закрытие файла

Вероятность ошибки при закрытии файла намного меньше, чем при открытии файла, но она существует.

180

Тема № 10. Работа с каталогами в сценариях РНР

Цель работы: Получение практических навыков по работе с деревом каталогов.

Задание 1. Создать каталог и добавить в него файл.

Пусть необходимо создать каталог Users1 по пути: W:/home/localhost/www/php/Lab/Users1

и сформировать в этом каталоге файл с именем users10.txt на основе информации показанной в форме на рис. 3.156.

Рис. 3.156. Форма ввода и результат работы файла Lab10.php.

Форма показанная на рис. 3.156, создается с помощью листинга программы Lab10.php, приведенной на рис. 3.157.

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" /> <title>Lab10 Создание каталога</title></head>

<body>

<p>Lab10 Создание каталога</p>

<?PHP

// тело основной программы

echo 'Текущий каталог realpath(.)='.realpath(".").'<br>';//выводит имя текущего каталога W:\home\localhost\www\php

//т. е. имя рабочего каталога в котором //находится исполняемый скрипт.

$pos = strpos($_SERVER['PHP_SELF'],"/php/"); // //Например $_SERVER['PHP_SELF']=/php/Lab10.php

181

$str=substr($_SERVER['PHP_SELF'],$pos+5);//вырежет только

// имя исполняемого скрипта (например Lab10.php) echo "Имя исполняемого скрипта=".$str;

$DOCUMENT_ROOT = $_SERVER['DOCUMENT_ROOT']; //Например, DOCUMENT_ROOT= W:/home/localhost/www

$ndir="Users1";//имя создаваемой папки $FileName=$DOCUMENT_ROOT."/php/Lab/".$ndir."/users10.txt"; //$FileName=W:/home/localhost/www/php/Lab/Users1

if (!isset($_POST["Submit"]))://первая прорисовка формы

print("<form action=\"Lab10.php\" method=post> Name:<input type=text name=\"UserName\"><br> Password:<input type=password name=\"Password\"><br> <input type=submit name=\"Submit\" value=\"ok\"> </form>\n ");

echo "Введенная информация должна быть сохранена <br>

в каталоге ".$ndir.", в файле users10.txt";

else: //форма ввода уже на экране и нажата OK

if ((strlen($_POST["UserName"]))

and (strlen($_POST["Password"]))):

//&& и and - эквивалентны (логическое И) //echo("Если имя и пароль пользователя указан. Длина

//имени пользователя=".strlen($_POST["UserName"]).

//",Password=".strlen($_POST["Password"]));

$Check=WriteFile($_POST["UserName"],$_POST["Password"], $ndir,$FileName,$DOCUMENT_ROOT);

if ($Check):

print("<br>Ваша регистрация прошла успешно: <p>\n"); ReadFromFile($ndir,$FileName);

else:

print("<br>Регистрация не была выполнена <br>\n");

endif;

else: //при вводе что-то не указали print("Вернитесь и введите значения Alt+Left");

endif;

endif;

182

?>

</body>

</html>

<?PHP

//функции пользователя function

WriteFile($UserName,$Password,$ndir,$FileName,$DOCUMENT_ROOT)

{

//$UserName //$Password

//$ndir - имя создаваемой папки. Например,$ndir="Users1" //$DOCUMENT_ROOT = $_SERVER['DOCUMENT_ROOT']; //Например, DOCUMENT_ROOT= W:/home/localhost/www //$FileName=$DOCUMENT_ROOT."/php/Lab/".$ndir."/users10.txt";

Назначение:

Создание папки $ndir по пути:

W:/home/localhost/www/php/Lab/$ndir

если она отсутствует, и создание файла $FileName для

добавления в него информации $UserName и $Password.

Если файл существует - только добавление информации.

В качестве разделителей значений атрибутов использовать

символы "\t".

echo '<br>Write Путь FileName='.$FileName.',<br> UserName='.$UserName.',Password='.$Password.',is_writeable='.is_writeable($Fil eName).' ='.gettype(is_writeable($FileName)).',<br>_SERVER[PHP_SELF]='.$_SERVER[' PHP_SELF'].'<br>';

//Формирование пути для папки с именем $ndir $newdir=$DOCUMENT_ROOT."/php/Lab/".$ndir; $isdir = is_dir($newdir); // Возвращает TRUE

if ($isdir== TRUE):

//print "<br>Каталог //существует:".gettype($isdir).".isdir=".$isdir."<br>"; $nh=($isdir) ? 'True' : 'False';

echo '<br>Каталог '.$newdir.' уже существует isdir='.$nh; else:

print "<br>Каталог '.$newdir.' Не существует."; $rs = @mkdir( $newdir, '0777' );

echo '<br>Каталог создан isdir='.($isdir) ? 'True' : 'False';

endif; //не забывайте точку с запятой if (is_writeable($newdir)):

//Функция is_writeable($newdir)-сообщает, можно ли

183

//записывать в newdir. Возвращает TRUE, если newdir //существует и является доступным (writable). $Open=fopen($FileName,"ab");

if ($Open):

if (filesize($FileName)==0):

echo '<br>Успешное создание и открытие файла'; else:

echo '<br>Успешное открытие файла. Он уже существовал'; endif;

echo "<br>Файл $FileName доступен!<br> Размер файла=".filesize($FileName)." байт <br>";

$Password=md5($Password);//шифровка пароля

fwrite($Open,"$UserName \t $Password \n");

echo '<br>В файл Lab10.txt добавлена запись о пользователе <br> и его зашифрованном пароле.';

fclose($Open); $Directory=TRUE;

else:

print("Невозможно открыть файл $FileName<br>\n"); $Directory=FALSE;

endif;//

else:

print("<br>В файл запрещена запись".$newdir); $Directory=FALSE;

endif; //}

//echo '<br>WriteTo return Directory='.$Directory;

return $Directory;

}

function ReadFromFile($ndir,$FileName)

{//Назначение // Чтение и вывод информации на экран

//$ndir - имя папки (Например,$ndir="Users1")

//$DOCUMENT_ROOT = $_SERVER['DOCUMENT_ROOT']; //Например, DOCUMENT_ROOT= W:/home/localhost/www //$FileName=$DOCUMENT_ROOT."/php/Lab/users/users10.txt";

$Open=fopen($FileName,"rb");

//echo '<br>ReadFromFile Open='.$Open;

184

if ($Open):

$Data=file($FileName);//закачка файла в массив

echo '<br>Число записей в файле='.count($Data).'<br>'; for ($n=0;$n<count($Data);$n++)

{

$GetLine=explode("\t",$Data[$n]); print("<b>$GetLine[0]</b> $GetLine[1] <br>\n");

}

fclose($Open);// закрытие файла

else:

print("Невозможно открыть файл $FileName<br>\n"); endif;

}//конец функции ReadFromFile

?>

Рис. 3.157. Листинг скрипта с именем Lab10.php.

Пусть пользователь заполнил форму следующим образом (рис. 3.158):

Рис. 3.158. Заполненная форма для скрипта с именем Lab10.php.

185

Тема №11. Создание панели управления файлами

Цель работы: Получение практических навыков по обработке файлов в сценариях.

Задание 1. Разработать форму и сопутствующее ей приложение для панели управления файлами.

Пример формы показан на рис. 3.159, ее обработчик приведен на рис. 3.161 (имя сценария - Lab11.php ). Вариант работы обработчика формы показан на рис. 3.160.

Рис. 3.159. Форма панели управления файлами

Рис. 3.160. Результат работы кода lab11.php

186

Листинг создания и обработки формы lab11.php. html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />

<title>Lab11 Files manager</title> </head>

<body>

<table border=0 width=80% align=center> <?PHP

if ($_POST["Upload"])

{

$dir = "W:\home\localhost\www\php\Lab\users"; echo("Upload File=".$File);

print("<tr><td colspan=4 align=center>Uploaded file: $File_name</td></tr>");

print("<tr><td colspan=4 align=center>File size: $File_size</td></tr>");

//if (copy($File,"USERS/$File_name")) if (copy($File,$dir."/$File_name"))

{

print("<tr><td colspan=4 align=center>Your file:$File_name, successfully uploaded</td></tr>");

}

else

{

print("Upload was not success");

}

//unlink($File);

unlink($Files);//unlink - удаляет файл.

print("<tr><td colspan=4> </td></tr>");

}

if ($Delete)

{

for($i=0;$i<count($Delete);$i++)

{

if ($Delete[$i]==$Rename[$i])

{ print("<center>It is impossible to delete and rename file in the same time</center>");}

else

{

//if (unlink("USERS/$Delete[$i]")) if (unlink($dir."/$Delete[$i]"))

187

{

print("<tr><td colspan=4 align=center> Your file, $Delete[$i],was deleted</td></tr>");

}

else

{

print("<tr><td colspan=4 align=center> Your file, $Delete[$i], cannot be deleted</td></tr>");

}

}

}

print("<tr><td colspan=4 align=center> </td></tr>");

}

if ($Rename)

{

for($i=0;$i<count($Rename);$i++)

{

if ($Delete[$i]==$Rename[$i]) {}

else

{

//$OldName="USERS/".$Rename[$i]; $OldName=$dir."/".$Rename[$i]; $Newfile=$Rename[$i]; //$New="USERS/".$NewName[$Newfile]; $New=$dir."/".$NewName[$Newfile];

if (rename("$OldName","$New"))

{

print("<tr><td colspan=4 align=center> Your file, $Rename[$i], was renamed in $NewName[$Newfile]</td></tr>");

}

else

{

print("<tr><td colspan=4 align=center> Your file, $Rename[$i], cannot be renamed</td></tr>");

}

}

}

print("<tr><td colspan=4 align=center> </td></tr>");

}

print("<form action=\"lab11.php\" method=post enctype=\"multipart/form-data\">\n");

print("<tr><td><b>File name</b></td>

188

<td><b>File size</b></td> <td><b>Delete</b></td>

<td><b>Rename (Укажите новое имя)</b></td></tr>");

//if ($dir = @opendir("W:\home\localhost\www\php\Lab\users")) $dir = "W:\home\localhost\www\php\Lab\users";

//$Open=opendir("USERS");//функция PHP $Open=opendir($dir);//функция PHP

while ($Files=readdir($Open))

{

//$FileName="USERS/".$Files; $FileName=$dir."/".$Files;

if (is_file($FileName))

{

$Size=filesize($FileName); print("<tr><td>$Files</td>

<td>$Size</td>

<td><input type=checkbox name=\"Delete[]\" value=\"$Files\"</td> <td><input type=checkbox name=\"Rename[]\" value=\"$Files\">

<input type=text name=\"NewName[$Files]\"></td></tr>\n");

}

}

closedir($Open);

print("<tr><td colspan=4 align=center> </td></tr>"); print("<tr><td colspan=4 align=center>

<input type=checkbox name=\"Upload\" value=\"yes\">Upload file<br> <input type=file name=\"File\" size=40><br>

<input type=submit name=\"Submit\" value=\"Ok\"></td></tr>"); print("</form>");

?>

</table>

</body>

</html>

Рис. 3.161. Код lab11.php для реализации менеджера файлов

189

Тема № 12. Работа с базой через монттор MySQL и PhpMyAdmin

Цель работы: Изучение команд MySQL для хранения, выборки и обработки данных с использованием монитора MySQL и средств

PhpMyAdmin.

Интернет ресурс http://www.php.ru/mysql/

Задание 1. Создать базу данных через командную строку

Соединиться с сервером MySQL и создать базу данных можно, используя утилиту PhpMyAdmin, или использовать окно монитора MySQL.

В последнем случае можно воспользоваться командным (пакетным) файлом Cmysql.bat, листинг которого приведен ниже (рис. 3.162).

CLS

rem Cmysql.bat Input in MySQL Запуск с любого диска c:\Webservers\usr\local\mysql5\bin\mysql --user=root --character-sets-dir="c:\Webservers\usr\local\mysql5\share\charsets"

Рис. 3.162. Командный файл Cmysql.bat для запуска монитора MySQL.

После запуска Cmysql.bat появится приглашение в MySQL вида: mysql> (рис. 3.163):

Рис. 3.163. Окно монитора MySQL с приглашением mysql > для ввода команды при использовании Cmysql.bat.

190

Если после приглашения указать: create database <имя базы>;

, где <имя базы> - имя новой базы, а ―;‖ – признак конца команды, то если имя такой базы отсутствует в справочнике баз MySQL и присутствует точка с запятой в конце команды, то система создаст новую базу.

Пусть, например, Вы указали в приглашении следующее: mysql> create database books;

(создать базу с именем books (книги)) и нажали Enter (ответ показан ниже).

Рис. 3.164. Окно монитора MySQL после создания базы books.

Появление нового приглашения mysql> означает, что предыдущее действиe выполнено правильно. В скобках указывается время затрачиваемое на выполнение команды.

Если Вы не выйдете из монитора командой Quit, и запуститите

утилиту PhpMyAdmin (указав в адресной строке: рис. 3.165), то реакция утилиты будет подобна, как это показано на рисунке

3.165.

Для правильной работы утилиты, окно монитора MySQL должно быть закрыто командой MySQL exit или Quit.

(выход из монитора MySQL).

Рис. 3.165 12.4. Окно утилиты PhpMyAdmin при неуспешном создании базы books.

Если монитор будет закрыт , то перевывод окна

браузераприведет к стандартному окну PhpMyAdmin (на рис. 3.166 – показана часть окна PhpMyAdmin и раскрыт список баз, использованных в СУБД MySQL в данный момент времени). Среди доступных баз данных

191

также будет находиться и созданная база данных с именем books (если Вы раскроете список ).

Если возникает необходимость создать таблицы базы данных не используя средства PhpMyAdmin, то можно подготовить в любом текстовом редакторе SQL-код, показанный на рис. 3.169 (тема №12. Задание 2.) и использовать командный файл Hmysql.bat представленный на рис. 3.171, который используя содержимое файла Lab13_00.sql создает таблицы в базе данных автоматически.

Рис. 3.166. Окно браузера PhpMyAdmin после создания базы books. Обратите внимание, что база данных не содержит таблиц.

Создать таблицы внутри базы можно непосредственно средствами

PhpMyAdmin.

Однако цель, в данном задании, научиться работать с MySQL через ее монитор (через строку приглашение mysql> монитора MySQL).

Пусть например, Вы решили создать в базе таблицу с именемcustomers, атрибуты которой описываются следующими именами:

Customers (CustomerId, Name, Address, City) - Клиент

Каждому столбцу таблицы необходимо присвоить тип и другие характеристики, определяющие поведение создаваемого объекта как в СУБД,

192

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

Первый столбец в схеме модели CustomerId - это первичный ключ (m key), позволяющий однозначно отделять объекты, подлежащие хранению в базе данныъх друг от друга. Пусть это будет целое (int) беззнаковое (unsigned) число, которое должно присутствовать в каждой записи таблицы (not null). Учитывая, что значение должно быть уникально и автоматически формироваться системой MySQL, укажем для него характеристику - auto_increment.

Все остальные столбцы будут содержать данные строкового типа, который в нашем случае обозначен типом char. В скобках после типа укажем максимальное количество символов, отводимое для значений каждого столбца.

Ниже (рис. 3.167) приведены характеристики столбцов таблицы.

Customers

( customerid int unsigned not null auto_increment primary key, name char(50) not null,

address char(100) not null, city char(30) not null)

Рис. 3.167. Состав таблицы Customers.

Создание таблицы производится с помощью SQL-команды CREATE TABLE, которая указывается в строке монитора.

Рис. 3.168. Окно монитора Mysql c командами создании базы books и создания в ней таблицы с именем Customers.

Обратите внимание, что перед созданием таблицы CREATE TABLE CUSTOMERS база данных должна быть открыта командой USE BOOKS;.

Если посмотреть в PhpMyAdmin созданную базу и таблицу, то увидим

следующее описание (рис. 3.169 и рис. 3.170).

193

Рис. 3.169. Часть окна PhpMyAdmin c базой данных books.

Рис. 3.170. Часть окна PhpMyAdmin c описанием таблицы Customers базы данных books.

Посмотреть список таблиц в базе можно командой SHOW TABLES если вурнуться в окно монитора MySQL.

194

Рис. 3.171. Окно монитора с списком таблиц базы BOOKS.

.

Если возникает необходимость удалить созданную таблицу через монитор системы, то после приглашения mysql> необходимо указать команду DROUP TABLE CUSTOMERS; (удалить таблицу с именем

CUSTOMERS).

Рис. 3.172. Окно монитора MySQL с командой удаления таблицы

CUSTOMERS из базы BOOKS.

195

Задание 2. Создание таблиц базы данных через командную строку.

Существует более удобный способ создания баз данных и таблиц ее составляющих, если их описание вынесено в отдельный файл (Lab13_00.sql) с расширением *.SQL (рис. 3.174).

Пусть в базе данных BOOKS (см. задание 1, тема 12) решено хранить следующие таблицы. Т.е. схема базы представлена в виде нормализованных

таблиц (рис. 3.171 12.12).

Customers (CustomerId, Name, Address, City)

- Клиент

Оrders (ОrderId, CustomerId, Аmount, Date)

-

Заказ

Books (ISBN, Author, Title, Price)

-

Книга

Оrder_items (ОrderId, ISBN, Quantity )

-

Покупка

Рис. 3.171. Схема базы данных books.

Ниже на рис. 3.174 12. 15 приведен код Lab13_00.sql (наберите его в любом редакторе или скопируйте его из этого файла) создания таблиц. Учтите, что база данных books в нашем примере уже должна быть создана, но в ней не должно быть таблиц и она должна быть открыта.

База данных должна быть открыта командой USE BOOKS:

Рис. 3.172. Окно монитора с использованием команды открытия базы данных с именем books.

Рис. 3.173 12.14. Окно PhpMyAdmin после создания базы books.

Выполните следующие действия:

Укажите CMD команду в командной строке (рис. 3.176 12.17).

В полученном Dos окне введите имя командника Hmysql.bat (рис. 12.19).

Используя команду Exit завершите работу в Dos окне CMD.exe.

Листинг SQL-кода создания таблиц базы, указанных в файле Lab13_00.sql.

196

create table customers

( customerid int unsigned not null auto_increment primary key, name char(50) not null,

address char(100) not null, city char(30) not null

);

create table orders

( orderid int unsigned not null auto_increment primary key, customerid int unsigned not null,

amount float(6,2), date date not null

);

create table books

( isbn char(13) not null primary key, author char(50),

title char(100), price float(4,2)

);

create table order_items

( orderid int unsigned not null, isbn char(13) not null, quantity tinyint unsigned, primary key (orderid, isbn)

);

Рис. 3.174. Листинг Lab13_00.sql создания схемы базы данных books.

Обратите внимание на расширение (.SQL) в имени программы Lab13_00.sql, использованное в данной лабораторной работе.

Листинг командного файла Hmysql.bat.

CLS

rem Hmysql.bat Запуск с любого места диска c:\Webservers\usr\local\mysql5\bin\mysql -h localhost -u root -D books -p -- character-sets-dir="c:\Webservers\usr\local\mysql5\share\charsets" < lab13_00.sql

Рис. 3.175. Состав BAT файла для работы с командной строки Hmysql.bat.

Символ < перед именем файла сценария lab13_00.sql для построения таблиц базы данных Books на рис. 3.175 обозначает операцию перенаправления для операционной системы. Монитор MySQL запустится из адреса:

c:\Webservers\usr\local\mysql5\bin\mysql.exe.

197

В качестве параметров запуска ему будет передана строка:

-h localhost -u root -D books –p.

Ключ –h используется для указания хоста, к которому надо подключиться (в нашем случае сервер Mysql находится на текущей машине).

Ключ –u указывает на имя пользователя, который подключается к серверу (в нашем случае сервер установлен на вашем собственном компьютере – поэтому имя его root, что обозначает привилигированного пользователя). Если Mysql используется на компьютере, администратором которого является кто-либо другой, применяйте имя пользователя выданное Вам администратором.

Ключ -D указвыает что будет проводится работа с базой данных books. Ключ –p сообщает серверу о том, что Вы хотите соедениться с ним с использование пароля.

Строка character-sets-

dir="c:\Webservers\usr\local\mysql5\share\charsets"

необходима из-за того тем, что используется Денвер и путь к MySQL не указан в пути поиска машины.

Если Вы будете использовать командный файл Hmysql.bat. то прежде чем будут созданы таблицы базы данных (указанные в листинге 3.174) Вам необходимо ответить на вопрос следующего вида:

(см. рис. 3.179).

Рис. 3.176. Вызов командного процессора CMD.exe из командной строки файлового менеджера Total Commander.

Подтверждение команды на рис. 3.176 приведет к следующему

Dos окну (рис. 3.177):

198

Рис. 3.177. Результат использования команды CMD.

Обратите внимание, что запуск CMD произведен из папки в которой находится командный файл HMYSQL.bat (рис. 3.175). Если в Dos приглашении указать имя этого файла (рис. 3.178), то его исполнение (Enter) приведет к созданию таблиц, указанных в сценарии файла lab13_00.sql (рис. 3.174).

Рис. 3.178. Уназание файла HMySQL.bat в Dos приглашении.

Если база данных с именем books открыта, то нажатие Enter в окне рис. 3.178 приведет к следующему окну Cmd.exe.

Рис. 3.179. Использование команды CMD и файла HMYSQL.bat в командной строке.

Правильное указание пароля приведет к следующему приглашению для ввода команды Dos (рис. 3.180) (создание таблиц будет выполнено).

Рис. 3.180. Окно Cmd.exe после исполнения сценария lab13_00.sql.

Выход из Cmd.exe возможен через команду

Рис. 3.181. Окно Cmd.exe после исполнения сценария lab13_00.sql.

Ниже (рис. 3.182) представлено окно PhpMyadmin с результатом работы HMYSQL.bat, т.е. с набором вновь созданных таблиц (рис. 3.183).

199

Рис. 3.182. Окно PhpMyadmin.

Если посмотреть (рис. 3.183) состав таблиц в базе данных, то Вы увидете именно перечень тех таблиц, которые указаны в файле lab13_00.sql

(рис. 3.174).

Интересна таблица

Используя пиктограмму ( ) проанализируйте ее состав (рис.

3.184).

Рис. 3.183. Окно PhpMyAdmin c составом таблиц базы BOOKS.

200

Рис. 3.184. Окно PhpMyAdmin c составом таблицы ORDER_ITEMS базы BOOKS.

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

Использованный тип tinyint unsigned для столбца Quantity указывает, что значения в нем могут принимать значения от 0 до 255.

Если перейти в монитор MySQL, то набор следующих команд (рис. 3.185) дает состав таблиц интересующей нас базы данных.

Рис. 3.185. Окно монитора с составом таблиц базы BOOKS. Отметьте что в базе BOOKS содержится одноименная таблица books. Команда DESCRIBE дает возможность увидеть подробную

информацию о конкретной таблице хранимой в базе.

201

Рис. 3.186. Окно монитора с описанием таблицы ORDER_ITEMS.

Примечание. Заметьте в одном и том же SQL-операторе нельзя одновременно применять строчные и прописные буквы.

Следующий пример показывает применение двух команд в одном приглашении.

Рис. 3.187. Окно монитора с информацией о текущем пользователе и текущей дате.

202

Задание 3. Вставка данных в базу данных

Каждая строка таблицы базы данных описывает какой-то реальный объект или отношение, а значения столбцов в этой строке хранят информацию о реальном объекте.

Вставка (добавление) строки в таблицу базы данных производится оператором INSERT.

Синтаксис оператора INSERT:

INSERT [INTO] table [(columnl, column2, column3, ...)] VALUES (value1, value2, value3, . . .) ;

Например, чтобы вставить запись в таблицу Customers (Клиенты) базы данных BOOKS, можно набрать:

insert into customers values

(NULL, "Иван Иванов", "ул. Марата д.8, кв. 7", "С. Петербург");

Как видите, table заменяется реальным именем таблицы, в которую требуется внести данные, a values — необходимыми значениями. Значения в данном примере заключены в двойные кавычки. В MySQL строки в любом случае должны быть помещены в пару одинарных или двойных кавычек. Числа и даты в кавычках не нуждаются.

Если использовать командный файл CmySQL.bat (его содержимое см.

на рис. 3.162) в командной строке ( рис. 3.188) Total Commander, то мы войдем в монитор MySQL (рис. 3.189).

203

Рис. 3.188. Вызов монитора MySQL с помощью CmySQL.bat.

Рис. 3.189. Приглашение на ввод команды в мониторе MySQL.

Указав, что нам необходимо работать с базой books (use books;), вводится команда INSERT с указанием имени таблицы и значениеми элементов вставляемой строки в таблицу.

Рис. 3.190. Использование команды вставки в мониторе MySQL.

Посмотреть введенные данные можно непосредственно из монитора,

если использовать команду SELECT * FROM customers; (рис. 3.191).

Рис. 3.191. Использование команды SELECT (выбор) в мониторе MySQL.

Обратите внимание, что на рис. 3.190 столбцу customerid присвоено значение null, а в таблице на рис. 3.191 его значение равно единице. Т.е. система MySQL, анализируя описание таблицы customers находит в столбце customerid описатель auto_increment (см. рис. 3.174), что подразумевает автоматическое формирование значения этого поля – следующее по порядку число последовательности.

С оператором INSERT связано несколько интересных моментов.

Указанные значения в операторе INSERT into customers values

(NULL, "Иван Иванов", "ул. Марата д.8, кв. 7", "С. Петербург") будут использованы для того, чтобы заполнять столбцы таблицы по порядку указанному при создании таблицы. Если необходимо заполнить только отдельные столбцы, или если вы хотите сами указать их порядок — можно

204

поместить список столбцов в ту часть оператора, которая относится к столбцам.

Например:

insert into customers (name, city) values ("Петр Петров", "Выборг");

Такой подход полезен, когда о какой-либо записи есть лишь частичная информация или если несколько полей записи необязательны. Аналогичного эффекта можно достичь, прибегнув к следующему синтаксису:

insert into customers

set name="Иван Иванов",address="ул. Победы", city="Петербург";

Заметите, что, добавляя Петр Петров, столбец customerid просто игнорируется. Когда мы создавали базу данных поле customerid было объявлено первичным ключом для таблицы Customers и было обозначено как AUTOINCREMENT. Это значит, что если вставить строку с нулевым (Null) значением или без значения, MySQL сгенерирует следующее число в автоинкрементной последовательности и вставит его автоматически.

Если посмотреть содержимое таблицы Customers используя PhpMyadmin (указав в адресной строке браузера путь http://localhost/tools/phpmyadmin/), и состав таблицы будет как показан на рис. 3.192, то необходимо изменить кодировку (рис. 3.199) при работе в мониторе

MySQL.

Рис. 3.192. Таблица при отсутствии команды SET NAMES cp866 при вставке из монитора.

205

Удалите введенную строку используя средства PhpMyAdmin (рис. 3.194).

Рис. 3.193. Пример использования пиктограммы - удалить для

удаления записи из таблицы.

Рис. 3.194. Пример реакции оболочки PhpMyAdmin при нажатии

.

Если запись будет удалена, то используя кнопку (рис. 3.195)

Рис. 3.195. Окно оболочки PhpMyAdmin после удаления единственной записи в таблице Customers.

добавьте запись (рис. 3.196)

206

Рис. 3.196. Вставка новой записи через PhpMyAdmin.

Результат вставки приведен на рис. 3.197.

Рис. 3.197. Результат вставки новой записи через PhpMyAdmin.

Если посмотреть таблицу (SELECT * FROM customers) после вставки через PhpMyAdmin в мониторе MySQL, то получим результат (рис. 3.198 12.39).

Рис. 3.198. Результат команды SELECT через монитор MySQL.

Чтобы привести результат к нормальному виду необходимо использовать в мониторе команду SET NAMES cp866 (Dos кодировка).

207

Результат использования команды приведен на рис. 3.199, на этом же рисунке указана команда выборки данных.

Рис. 3.199. Результат команды SET NAMES cp866 и SELECT, полученный через монитор MySQL.

Далее, если использовать команду INSERT into customers values (NULL, "Иван Иванов", "ул. Марата д.8, кв. 7", "С. Петербург") в мониторе MySql, получим результат (рис. 3.200).

Рис. 3.200. Вставка второй записи в таблицу Customers через монитор

MySQL.

Заметьте, что добавленная запись будет отображаться в PhpMyAdmin в необходимой нам кодировке (рис. 3.201).

Рис. 3.201. Состав таблицы Customers в окне PhpMyAdmin.

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

insert into customers values

(NULL, "Петр Петров", "пр. Мира д.7", "Москва"),

208

(NULL, "Юлия Вонг", "ул. Шевченко д.1, кв 5", "Киев");

Например, вставка через монитор (рис. 3.202), указанных выше двух записей приведет к результату (рис. 3.203).

Рис. 3.202. Вставка двух записей в таблицу Customers через монитор.

Указание ―;‖ в приглашении ―->‖ и нажатие Enter даст результат.

Рис. 3.203. Состава таблицы Customers (Клиенты) в окне монитора Mysql.

209

Задание 4. Создание командных файлов и файлов сценариев для вставки данных в базу данных.

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

Ниже приводится листинг сценария lab13_02.sql (рис. 3.204), выполняющий действия по автоматизации вставки информации в базу данных.

Листинг сценария ввода данных.

Рис. 3.204. Листинг lab13_02.sql ввода данных в таблицу customers базы данных books.

Сценарий, показанный на рис. 3.204, можно запустить через MySQL

следующим образом (если путь к системе указан в Pach Вашей машины): > mysql -h localhost -u root –p < lab13_02.sql

Однако, при выполнении лабораторных работ в дисплейных классах университета, чаще всего, доступ к системным ресурсам ЭВМ закрыт паролем.

Поэтому приходится исполнять ряд вспомогательных действий:

Перейти в командный процессор Cmd.exe. Запустить консоль: Пуск -> Выполнить -> "cmd".

Указать путь, где находится исполняемый модуль MySQL.exe.

Перейти в каталог c:\webservers\usr\local\Mysql5\bin\ , используя

команду OC смены директория: cd.

3. Указать параметры входа в Mysql и путь к сценарию Lab13_02Ins.sql.

Запустить клиент: mysql -u root –p набрав на клавиатуре строку: c:\Webservers\usr\local\mysql5\bin\mysql -h localhost -u root -D books -p -- character-sets-dir="c:\Webservers\usr\local\mysql5\share\charsets" < C:\WebServers\home\localhost\www\php\Lab13_02Ins.sql

Введенная информация в Dos окне имеет плохо читаемый вид:

210

После ввода указанной строки в шаге 3 и нажатия Enter, подтвердить пароль.

Правильный ввод пароля выведет следующую информацию на экран в виде как показано на рис. 3.205.

Рис. 3.205. Таблица customers базы

данных

BOOKS.

Обратите внимание, что вывод содержимого таблицы на рис. 3.205

осуществляется за счет команды

, вставленной в

Lab13_02Ins.SQL сценарий, представленный

на рис.

3.204. Кроме того,

использование команды , позволяет согласовать кодировку с PhpMyadmin.

На рис. 3.206 показано состояние таблицы customers базы данных books средствами PhpMyAdmin.

Рис. 3.206. Таблица customers базы данных books в PhpMyAdmin.

Сценарий показанный на рис. 3.204 можно поместить в пакетный файл Insmysql.bat, как показано на рис. 3.207. В этом же файле указываются все необходимые данные, которые ранее вводились в окне Cmd.exe. Набрать содержимое файла Insmysql.bat можно в любом текстовом редакторе.

211

Рис. 3.207. Состав пакетного файла Insmysql.bat.

Заметьте, что содержимое файла, например в Блокноте, будет представлено в виде одной строки (конец строки на рис. 3.208 не виден).

Рис. 3.208. Изображение пакетного файла Insmysql.bat в Блокноте.

Использовать командный файл Insmysql.bat можно, указав его в командной строке менеджера файлов (например, Total Commander рис. 3.209).

Рис. 3.209. Вызов пакетного файла Insmysql.bat.

Вызов пакетного файла Insmysql.bat приведет к окну (рис. 3.210), указав в котором пароль, получим сообщение о составе таблицы customers

(рис. 3.211).

212

Рис. 3.210. Этап работы пакетного файла Insmysql.bat.

В файле Insmysql.bat (рис. 3.207) использована команда перенаправления , приказывающая вызвать на обработку файл сценарий

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

В файле сценария (рис. 3.204) использована команда

,

которая осуществляет выборку (и вывод на экран в данном случае) всей информации из таблицы customers (рис. 3.211).

Заметьте, что строка с номером 6 (рис. 3.211) соответствует строке с номером 5 на этом же рисунке.

Рис. 3.211. Результат работы пакетного файла Insmysql.bat.

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

MySQL.

Однако, если модифицировать файл Insmysql.bat (рис. 3.207) и вставить

в нем команду вывода результатов во внешний файл(рис. 3.212), то результат работы (рис. 3.211) становится доступен через любой редактор.

213

Рис. 3.212. Модификация пакетного файла Insmysql.bat.

Далее (рис. 3.218) будет показано, как следует модифицировать

пакетный файл (рис. 3.212), чтобы имя файла являлось в нем формальным параметром.

Ниже приводится листинг сценария lab13_03.sql (рис. 3.215), выполняющий действия по вставке информации в базу данных, схема которой представлена на рис. 3.212 и для удобства продублирована ниже

(рис. 3.214).

Для продолжения работы очистите таблицу Customers. Для этого перейдите в монитор MySQL (CmySql.bat) и выполните команды USE BOOKS и DELETE FROM customers (рис. 3.213).

Рис. 3.213. Использование команды Delete - чистки таблицы базы.

Customers (CustomerId, Name, Address, City)

- Клиент

Оrders (ОrderId, CustomerId, Аmount, Date)

-

Заказ

Books (ISBN, Author, Title, Price)

-

Книга

Оrder_items (ОrderId, ISBN, Quantity )

-

Покупка

Рис. 3.214. Схема тестовой базы.

Листинг (lab13_03.sql) ввода данных в таблицы базы данных для схемы рис. 3.214.

use books;

SET NAMES cp1251;

Соседние файлы в папке metoda