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

   Здесь необходимо создать пакет программ по созданию простой базы данных(БД), ее дополнению, распечатке в алфавитном порядке выбранного поля(например всех имен сотрудников), поиску записи, удалению записи и ее редактированию. Пакет программ должен содержать общее меню по выполняемым действиям в котором должен быть установлен счетчик его посещения. Пакет программ должен оперировать с графическими объектами (например, фотографии сотрудников). Все программы, включая счетчик посещений, должны быть написаны на языке Perl. Вызов программы счетчика посещений должен выполняться из главного меню с использованием технологии SSI - server side includes. После изучения представленных ниже текстов программ студент должен разработать подобный пакет программ для БД, заданной преподавателем. Например, БД может включать в себя поля:
1.Название изделия
2.Время выпуска
3.Краткая характеристика изделия
4.Фотография изделия
В качестве изделия могут рассматриваться автомобили, самолеты, суда и др.

Тексты HTML документов для формирования форм:

index_l3.shtml
<html>
<head>
<title>Menu</title>
</head>
<body>
<b>
<a href="http://www.tup.km.ua:8082/~ismm25/form1_l3.html">
1.Добавить запись в базу данных </a><br>
<a href="http://www.tup.km.ua:8082/ismm25/form2_l3.pl">
2.Распечатать базу данных </a><br>
<a href="http://www.tup.km.ua:8082/~ismm25/form3_l3.html">
3.Найти запись по Ф.И.О. </a><br>
<a href="http://www.tup.km.ua:8082/~ismm25/form4_l3.html">
4.Удалить запись </a><br>
<a href="http://www.tup.km.ua:8082/~ismm25/form5_l3.html">
5.Редактировать запись</a>
</b>
<!--#include virtual="/ismm25/count.pl"-->
</body>
</html>

form1_l3.html
<html>
<head>
<title>form1_l3</title>
</head>
<body>
<form method=post action="/ismm25/form1_l3.pl">
<br><b>Введите Ваше имя:</b>
<br><input name="user_name" value="" size=20>
<br><b>Введите номер Вашего телефона:</b>
<br><input name="phone" value="" size=10>
<br><b>Введите Ваш адрес и краткую характеристику:</b>
<br><textarea name="address" rows=10 cols=60>
</textarea>
<br><b>Введите имя фото лат.буквами:</b>
<br><input name="img" value="babich.jpg" size=20>
<br><input type="submit" value="Зарегистрировать">
</form>
</body>
</html>

form3_l3.html
<html>
<head>
<title>form3_l3</title>
</head>
<body>
<form method=post action="/ismm25/form3_l3.pl">
<b>Введите нужную фамилию:</b><br>
<input name="user_name" value="" size=30>
<input type="submit" value="Послать!">
</form>
</body>
</html>

form4_l3.html
<html>
<head>
<title>form4_l3</title>
</head>
<body>
<form method=post action="/ismm25/form4_l3.pl">
<b>Введите фамилию, запись по которой будет удалена:</b><br>
<input name="user_name" value="" size=30>
<input type="submit" value="Послать!">
</form>
</body>
</html>

form5_l3.html
<html>
<head>
<title>form5_l3</title>
</head>
<body>
<form method=post action="/ismm25/form5_l3.pl">
<b>Введите фамилию, запись по которой будет отредактирована:</b><br>
<input name="user_name" value="" size=30>
<input type="submit" value="Послать!">
</form>
</body>
</html>

Тексты программ на языке Perl:

form1_l3.pl
#!/usr/bin/perl
#
#Этот скрипт предназначен для создания базы данных и ее дополнения
#
# Загружаем модуль CGI
use CGI qw/:standard/;
use strict;
# Присваиваем локальным переменным значения, переданные формой
my $user_name=param('user_name');
my $phone=param('phone');
my $address=param('address');
my $img=param('img');
my $len;
# Определяем длину введенного поля user_name
$len=length($user_name);
# Заменяем символ новой строки на пробел и удаляем символ возврата
# Это необходимо, если ввод данных проводится через форму
# с дескриптором <TEXTAREA>
$address=~s/\n/ /g;
$address=~s/\r//g;
# Если len больше 0 добавляем запись в файл
if ( $len > 0 )
{
open (FIL,">>names.txt");
# При записи в качестве разделителей используем :::
print FIL $user_name,":::",$phone,":::",$address,":::",$img,"\n";
close(FIL);
}
# Формируем HTML страничку
print
header(-charset=>'Windows-1251'),
start_html('form1_l3.pl'),
a({href=>'http://www.tup.km.ua:8082/~ismm25/index_l3.shtml'},"Возврат в меню"),
hr,
end_html;

form2_l3.pl
#!/usr/bin/perl
# Этот скрипт выводит все имена, находящиеся в базе данных
# Перед выводом производит сортировку базы данных
use strict;
use CGI qw /:standard/;
my ($user_name,$user,@file,@newfile);
# Чтение базы данных в массив @file, сортировка этого массива,
# запись отсортированных строк из массива @newfile в файл БД names.txt
open(OLD,"names.txt");
@file=<OLD>;
close(OLD);
@newfile=sort(@file);
open(NEW,">names.txt");
print NEW @newfile;
close(NEW);
# Формирование документа HTML
print
header(-charset=>'Windows-1251'),
start_html('form2_l3.pl'),
"<pre>";
open (FIL,"names.txt");
while (<FIL>)
{
($user_name)=split(':::');
$user=$user_name;
# Замена пробелов в Ф.И.О. на символ "_" , т.е. например Иванов И.И. будет
# представлен как Иванов_И.И..Если это не сделать, методом GET будет
# передано "Иванов", т.е. без имени и отчества. Это может привести к
# некорректной работе программы, если фамилия встречается несколько раз
# с различными именем и отчеством.
$user_name=~s/ /_/g;
print a({href=>"http://www.tup.km.ua:8082/ismm25/forma_l3.pl?name=$user_name"},$user),"\n";
}
close(FIL);
print "</pre>",
a({href=>"http://www.tup.km.ua:8082/~ismm25/index_l3.shtml"},"Возврат в меню"),
end_html;

form3_l3.pl
#!/usr/bin/perl
#
# Скрипт предназначен для поиска записи в базе данных по введеному
# имени. Причем имя может быть не полным.
#
use strict;
use CGI qw /:standard/;
my $user_name_form=param('user_name');
my $user_name_form_len=length($user_name_form);
my ($user_name,$phone,$address,$img,$user);
print header(-charset=>'Windows-1251'),
start_html('form3_l3.pl');
# Если имя введено в форму, происходит обращение к базе данных
if ($user_name_form_len != 0)
{
open(FIL,"<names.txt");
# Чтение всех записей из базы данных до обнаружения конца файла
while(<FIL>)
{
($user_name,$phone,$address,$img)=split(':::');
# Сохранение в переменной $user_name первых символов в количестве,
# равному числу символов, введенных в форме поиска. Запись их в $user.
$user=substr($user_name,0,$user_name_form_len);
# Если введенное значение в форму совпадает с $user, сформировать HTML
# документ с полным выводом в броузер найденной записи
if($user_name_form eq $user)
{
print qq[<center><IMG SRC='http://www.tup.km.ua:8082/~ismm25/pics/$img' HEIGHT=100></center>],
"<br>",
hr(),
"<u>Имя:</u><br>",$user_name,
hr(),
"<u>Номер телефона:</u><br>",$phone,
hr(),
"<u>Адрес и краткая характеристика:</u><br>",$address,
hr();
}
}
close(FIL);
}
print qq[<a href='http://www.tup.km.ua:8082/~ismm25/index_l3.shtml'>Возврат в меню</a>],
end_html;

form4_l3.pl
#!/usr/bin/perl
# Скрипт предназначен для удаления записи по имени
use strict;
use CGI qw /:standard/;
my $user_name1=param('user_name');
my $len_user_name1=length($user_name1);
my ($user_name,$phone,$address,$img);
my $i=0;
# Если имя введено в форму, происходит обращение к базе данных
if ($len_user_name1 != 0)
{
open(FILUP,"names.txt");
open(FILOUT,">names1.txt");
while(<FILUP>)
{
($user_name,$phone,$address,$img)=split(':::');
# Если имя, введенное в форму, соответствует имени записи БД,
# данная запись не записывается в новый файл names1.txt БД.
if ($user_name1 eq $user_name) {$i=1;}
if ($user_name1 ne $user_name)
{
print FILOUT $user_name,":::",$phone,":::",$address,":::",$img;
}
}
close(FILUP);
close(FILOUT);
# Удаляется старая БД (файл names.txt)
unlink("names.txt");
# Переименовывается новая БД (файл names1.txt) в файл старой БД ( names.txt)
rename("names1.txt","names.txt");
}
#
print
header(-charset=>'Windows-1251'),
start_html('form4_l3.pl');
if ( $i == 0 ) { print "Запись не найдена<br>"; }
print
qq[<a href='http://www.tup.km.ua:8082/~ismm25/index_l3.shtml'>Возврат в меню</a>],
end_html;

form5_l3.pl
#!/usr/bin/perl
# Скрипт предназначен для формирования формы редактирования записи,
# удаления из БД редактируемой записи и передачи новых данных
# скрипту для формирования БД с внесенными изменениями
use strict;
use CGI qw /:standard/;
my $user_name1=param('user_name');
my ($user_name,$phone,$address,$img);
# Открывается файл БД и формируется документ HTML
open(FIL,"names.txt");
print header(-charset=>'Windows1251'),
start_html('form5_l3.pl');
while(<FIL>)
{
# Если имя записи БД совпадает с введенным, формируется форма для
# редактирования записи
($user_name,$phone,$address,$img)=split(':::');
if($user_name1 eq $user_name)
{
print "<IMG SRC='http://www.tup.km.ua:8082/~ismm25/pics/$img' HEIGHT=100>";
print qq[<form method=post action="/ismm25/form6_l3.pl">];
# Тип hidden не высвечивает поле user_name, но позволяет передать его
# значение программе form6_l3.pl
print "<input type=hidden name='user_name' value='$user_name'>";
print '<b>Телефон:</b><br>';
print "<input name='phone' value='$phone' size=10>","<br>";
print '<b>Адрес и характеристика:</b><br>';
print "<input name='address' value='$address' size=30>","<br>";
print '<b>Фотография:</b><br>';
print "<input name='img' value='$img' size=20>","<br>";
print "Обязательно нажми на кнопку, иначе запись будет утеряна!";
print '<br><input type="submit" value="Ввести!">';
print '</form>';
}
}
close(FIL);
# Считывается файл БД names.txt и удаляется из него редактируемая запись
open(FILUP,"names.txt");
open(FILOUT,">names2.txt");
while(<FILUP>)
{
($user_name,$phone,$address,$img)=split(':::');
# Если имя, введенное в форму, соответствует имени записи БД,
# данная запись не записывается в новый файл names2.txt БД.
if ($user_name1 ne $user_name)
{
print FILOUT $user_name,":::",$phone,":::",$address,":::",$img;
}
}
close(FILUP);
close(FILOUT);
# Удаляется старая БД (файл names.txt)
unlink("names.txt");
# Переименовывается новая БД (файл names1.txt) в файл старой БД ( names.txt)
rename("names2.txt","names.txt");
print end_html;

form6_l3.pl
#!/usr/bin/perl
# Скрипт предназначен для внесения изменений в БД после редактирования
# записи
use strict;
use CGI qw /:standard/;
my $user_name=param('user_name');
my $img=param('img');
my $address=param('address');
my $phone=param('phone');
# Добавление в файл БД отредактированной записи
open (FIL,">>names.txt");
# При записи в качестве разделителей используем :::
print FIL $user_name,":::",$phone,":::",$address,":::",$img,"\n";
close(FIL);
# Формирование документа HTML
print
header(-charset=>'Windows1251'),
start_html('form6_l3.pl'),
a({href=>'http://www.tup.km.ua:8082/~ismm25/index_l3.shtml'},"Возврат в меню"),
end_html;

forma_l3.pl
#!/usr/bin/perl
# Скрипт предназначен для распечатки параметров записи по конкретной Ф.И.О.
use strict;
use CGI qw /:standard/;
my $name=param('name');
my ($user_name,$phone,$address,$img);
# Замена символа "_" на пробел для преобразования переданного значения
# параметром 'name' в действительное значение Ф.И.О.
$name=~s/_/ /g;
# Формирование документа HTML
print header(-charset=>'Windows-1251'),
start_html('forma_l3.pl');
# Чтение файла с распечаткой параметров записи, для которой $user_name
# совпадает с переданным значением Ф.И.О.
open(FIL1,"names.txt");
while(<FIL1>)
{
($user_name,$phone,$address,$img)=split(':::');
if($name eq $user_name)
{
print qq[<center><IMG SRC='http://www.tup.km.ua:8082/~ismm25/pics/$img' HEIGHT=100></center>],
"<br>",
hr(),
"<u>Имя:</u><br>",$user_name,
hr(),
"<u>Номер телефона:</u><br>",$phone,
hr(),
"<u>Адрес и краткая характеристика:</u><br>",$address,
hr();
}
}
close(FIL1);
print qq[<a href="http://www.tup.km.ua:8082/~ismm25/index_l3.shtml">Возврат в меню</a>],
end_html;

Текст программы счетчика посещений
#!/usr/bin/perl
open (FIL1,"<count.dat");
$count=<FIL1>;
close(FIL1);
$count=$count+1;
open (FIL2,">count.dat");
print FIL2 $count;
close(FIL2);
print "Content-Type:text/html\n\n";
print "<br><br>","Страницу посетили ";
print $count;
print " раз";

В этом же каталоге должен первоначально существовать файл
count.dat с содержимым "0"
К каталогу cgi-bin должна быть применена команда chmod 0777 cgi-bin .
Причем Вы должны находиться в каталоге public_html . Иначе не создасться файл базы данных names.txt

Для просмотра, как работает рассмотренный комплект программ, нажми сюда.