- •Вводный раздел
- •1. Информационные системы. Основные понятия
- •Моделирование информационных систем
- •2. Архитектуры распределенного приложения с базой данных. Функции клиента и сервера при различных вариантах расслоения. Типовые клиенты доступа к бд на основе различных технологий.
- •Модель Клиент – Сервер
- •Трехуровневая модель
- •Распределенная (многоуровневая) модель
- •4 Технологии программ расширений
- •Тема 1. Средства взаимодействия клиента и сервера бд
- •1.1 Сервисы сети Internet. Сетевая архитектура osi.
- •1.2 Протоколы прикладного уровня в стеке tcp/ip. Унифицированный локатор ресурса при работе с бд
- •1.3 Блоки данных в стеке протоколов
- •Тема 2. Удаленные базы данных
- •2.1 Понятие удаленных баз данных
- •2.2 Инструментальные средства проектирования структуры бд. Утилиты автоматизированного проектирования бд.
- •2.3 Характеристика субд удаленного доступа
- •Тема 3. Разработка и эксплуатация серверной части
- •3.1 Проектирование структуры базы данных (на самостоятельное изучение) Вопросы для самостоятельной работы
- •3.2 Создание баз данных, таблиц и индексов
- •Удаление баз данных, таблиц
- •Изменение структуры таблиц
- •3.3 Типы данных в MySql
- •Integer и его вариации
- •3.4 Методы заполнения полей базы данных Использование insert
- •Использование replace
- •Использование delete
- •Использование truncate
- •Использование update
- •Загрузка данных с помощью load data infile
- •Тема 4. Разработка и эксплуатация клиентской части.
- •4.1 Простые запросы
- •4.2 Выбор строк с помощью where
- •Удаление повторений с помощью distinct
- •Выбор групп с помощью having
- •Сортировка результатов поиска с помощью order by
- •Ограничение результатов поиска с помощью limit
- •4.4 Сложные запросы Объединение двух таблиц
- •Объединение нескольких таблиц
- •Самообъединение таблиц
- •Типы объединений
- •4.5 Создание подзапросов
- •4.6 Встроенные функции MySql
- •Операторы
- •Типы таблиц MySql
- •Тема 5. Язык html как средство внешнего представления данных.
- •5.1 Основные правила проектирования пользовательского интерфейса
- •5.2. Построение абзацев в гипертекстовом документе
- •5.3 Построение заголовков в гипертекстовом документе
- •Тема 6. Разработка бизнес-слоя и интерактивных компонентов
- •6.1 Perl как средство разработки программ –приложения
- •6.2 Типы данных в Рerl
- •Переменные
- •Скалярные переменные
- •Массивы
- •Ассоциативные массивы
- •6.3 Конструкции языка Рerl Простые и составные операторы
- •Условные операторы
- •Оператор unless
- •Оператор do
- •Циклы и ветвления
- •Цикл until
- •Циклы for и foreach
- •Оператор безусловного перехода goto
- •Генерация динамических выражений с помощью функции eval
- •6.4 Подпрограммы
- •Использование пакетов для изоляции подпрограмм
- •6.5 Операторы языка Perl .Операторы сравнения
- •Логические операторы
- •6.6 Работа с файлами и строками
- •Функция chop
- •Функция index
- •Функция length
- •Функция substr
- •Функция join
- •Функция split
- •Функции для обработки списков
- •Функция reverse
- •Функция sort
- •Функции работы с массивами
- •Функции push и pop
- •Функция shift
- •Функция unshift
- •Функция splice
- •Функция scalar
- •Функция grep
- •Функции обработки ассоциативных массивов
- •Функция keys
- •Функция values
- •Функция each
- •Функция delete
- •Пример скриптов для выполнения практического задания
- •1. Добавление информации в базу (на примере винного погреба -добавление страны)
- •Часть 1
- •Удаление информации из базы (удаление страны)
- •Часть 2
- •Часть 3
- •Поиск информации в базе данных
- •Занесение новой информации во все таблицы базы данных
- •Часть 1
- •Часть 2
Функция values
Функция values возвращает обычный массив, состоящий из значений ассоциативного массива. Она имеет следующий формат:
@value_list = values(%Array)
Функция values возвращает массив значений ассоциативного массива в виде регулярного списка. Следующий фрагмент программы иллюстрирует использование функции values:
# Используем значения из предыдущего примера
%ages = ('Bob', 25, 'Mary', 30, 'Zack', 15);
@list = sort values %ages; # @list (15, 25, 30)
@list = %ages; # @list ('Zack', 15, 'Bob', 25, 'Mary', 30)
Функция each
Функция each осуществляет итерации элементов в ассоциативном массиве. Она имеет следующий формат:
@key_values = each(%Array);
Всякий раз, когда скрипт вызывает функцию each, она возвращает список из двух компонент, которые содержат пару ключ-значение. Когда функция достигает конца списка, она возвращает пустой список. При следующем вызове функции процесс итерации начнется сначала. Следующий фрагмент программы иллюстрирует использование функции each:
# Используем значения из предыдущего примера
%ages = ('Bob', 25, 'Mary', 30, 'Zack', 15);
While (($name, $age) = each %ages)
{
# Выведем ages
Print "$key is $ages{$key}\n";
}
Функция delete
Функция delete удаляет элементы ассоциативного массива. Она имеет следующий формат:
Delete $Array{Key}
Следующая инструкция использует функцию delete для того, чтобы удалить элемент, отвечающий ключу Bob из ассоциативного массива $Employees:
Delete $Employees{'Bob'}
Пример скриптов для выполнения практического задания
1. Добавление информации в базу (на примере винного погреба -добавление страны)
Часть 1
#!d:/actiperl/bin/perl.exe
# add new country to database - 1-st stage -- check existing countries
use DBI;
# declarations
my $dbh ; #database handler
my $sth ; #database statement handler
my @countries = (); #declared countries
my $base = 'wineyard'; #database name
my $comp = 'localhost'; #IP-address of host computer
my $dbport = '3306'; #standard MySQL port
my ($ky, $val);
print "Content-type: text/html\n\n";
print <<EOH;
<HTML>
<HEAD>
<META NAME="Author" CONTENT="Alexandre Lazarev">
<style type="text/css">
.norm {padding-left: 20; padding-right: 10; padding-top: 10; }
a {text-decoration: none; }
</style>
<TITLE>Wineyard DB_connection</TITLE>
</HEAD>
<BODY BGCOLOR="#F0F0F0" TEXT="#000000" LINK="#0000EE" VLINK="#CC0080" ALINK="#CC66CC">
<h1 align="center"><font color="#0602B0" size="+4">Wineyard</font></h1>
<p class="norm" align="center"><font size="+1">Интерфейс к базе данных по винам
на основе <b>MySQL</b></font></p>
<hr align="center" noshade size="2" width="90%">
EOH
# process database index files
$dbh = DBI->connect("DBI:mysql:database=$base;host=$comp;port=$dbport", '', '');
if (not $dbh) {
print <<ERRDB;
<p class="norm">Не удалось открыть связь с базой <b>$base</b> по порту $dbport.<br>
Причина ошибки – <b>$DBI::errstr</b></p>
<hr align="center" noshade size="2" width="90%">
<p class="norm" align="left"><font size="+1"><a href="/wineyard/index.html">Вернуться
к главной странице</a></font></p>
</body></html>
ERRDB
exit;
};
$sth = $dbh->prepare('select ctry, id from country where id > 0 order by ctry');
$sth->execute;
while(($ky, $val)=$sth->fetchrow_array) { #country list will be ordered
push(@countries, $ky);
};
$sth->finish;
print <<SOF;
<p class="norm" align="center"><font color=navy size="+1">В настоящее время в базе
зарегистрированы следующие страны:</font></p>
<table cellpadding="5" align="center">
SOF
#creating neat table
$lines = int(scalar(@countries)/5); # 5-column table
if ((scalar(@countries) % 5) != 0) {
$lines++;
};
for ($i=0; $i < $lines; $i++) {
print "<tr>";
foreach $j (0..4) {
print "<td width=10>$countries[$i+$j*$lines]</td>";
};
print "</tr>";
};
# table isn't closed yet
print <<EOFR;
</table>
<hr align="center" noshade size="2" width="90%">
<form name="add_cn" action="apache/Apache/cgi-bin/addcnt.pl" method="post">
<p class="norm">
<table align="center" cellpadding="5"><tr><td>
Введите новую страну:</td><td><input type="text" size="20" name="ncnt"</td></tr>
<tr><td> </td><td> </td></tr>
<tr><td width="10%"><input type="submit" value="Занести в базу"></td>
<td width="10%"><input type="reset" value="Очистить поле"></td></tr>
</table>
</p>
</form>
<hr align="center" noshade size="2" width="90%">
<p class="norm" align="left"><font size="+1"><a href="/wineyard/index.html">Вернуться
к главной странице</a></font></p>
<hr align="center" noshade size="2" width="90%">
</BODY>
</HTML>
EOFR
exit;
Часть2
#!d:/actiperl/bin/perl.exe
# add new country to database - 2-nd stage -- updating countries data
use DBI;
use CGI qw(:standard);
# declarations
my $dbh ; #database handler
my $sth ; #database statement handler
my $base = 'wineyard'; #database name
my $comp = 'localhost'; #IP-address of host computer
my $dbport = '3306'; #standard MySQL port
my ($ky, $val);
my @countries = ();
print "Content-type: text/html\n\n";
print <<EOH;
<HTML>
<HEAD>
<META NAME="Author" CONTENT="Alexandre Lazarev">
<style type="text/css">
.norm {padding-left: 20; padding-right: 10; padding-top: 10; }
a {text-decoration: none; }
</style>
<TITLE>Wineyard DB_connection</TITLE>
</HEAD>
<BODY BGCOLOR="#F0F0F0" TEXT="#000000" LINK="#0000EE" VLINK="#CC0080" ALINK="#CC66CC">
<h1 align="center"><font color="#0602B0" size="+4">Wineyard</font></h1>
<p class="norm" align="center"><font size="+1">Интерфейс к базе данных по винам
на основе <b>MySQL</b></font></p>
<hr align="center" noshade size="2" width="90%">
EOH
# process database index files
$dbh = DBI->connect("DBI:mysql:database=$base;host=$comp;port=$dbport", '', '');
if (not $dbh) {
print <<ERRDB;
<p class="norm">Не удалось открыть связь с базой <b>$base</b> по порту $dbport.<br>
Причина ошибки – <b>$DBI::errstr</b></p>
<hr align="center" noshade size="2" width="90%">
<p class="norm" align="left"><font size="+1"><a href="/wineyard/index.html">Вернуться
к главной странице</a></font></p>
</body></html>
ERRDB
exit;
};
# here database is connected
# process input parameters
$ncnt = param('ncnt');
if ($ncnt eq "") { # a very looong block of input error processing
print <<EOR;
<p class="norm" align="left"><b>Не указано наименование страны-производитедя</b> – обязательное поле</p>
<hr align="center" noshade size="2" width="90%">
EOR
$sth = $dbh->prepare('select ctry, id from country where id > 0 order by ctry');
$sth->execute;
while(($ky, $val)=$sth->fetchrow_array) { #country list will be ordered
push(@countries, $ky);
};
$sth->finish;
$dbh->disconnect;
print <<SOF;
<p class="norm" align="center"><font color=navy size="+1">В настоящее время в базе
зарегистрированы следующие страны:</font></p>
<table cellpadding="5" align="center">
SOF
#creating neat table
$lines = int(scalar(@countries)/5); # 5-column table
if ((scalar(@countries) % 5) != 0) {
$lines++;
};
for ($i=0; $i < $lines; $i++) {
print "<tr>";
foreach $j (0..4) {
print "<td width=10>$countries[$i+$j*$lines]</td>";
};
print "</tr>";
};
# table isn't closed yet
print <<EOFR;
</table>
<hr align="center" noshade size="2" width="90%">
<form action="apache/Apache/cgi-bin/addcnt.pl" method="post">
<p class="norm">
<table align="center" cellpadding="5"><tr><td>
Введите новую страну:</td><td><input type="text" size="20" name="ncnt"</td></tr>
<tr><td> </td><td> </td></tr>
<tr><td width="10%"><input type="submit" value="Занести в базу"></td>
<td width="10%"><input type="reset" value="Восстановить поле"></td></tr>
</table>
</p>
</form>
<hr align="center" noshade size="2" width="90%">
<p class="norm" align="left"><font size="+1"><a href="/wineyard/index.html">Вернуться
к главной странице</a></font></p>
<hr align="center" noshade size="2" width="90%">
</BODY>
</HTML>
EOFR
exit; # when country wasn't entered
};
#everything is Ok with parameters
# create record in country table
$qry = "INSERT INTO country (id, ctry) VALUES (NULL, "
. $dbh->quote($ncnt) . ")";
$rows = $dbh->do($qry);
$dbh->do('FLUSH TABLES, STATUS');
$dbh->disconnect;
if ($rows < 1) {
print qq[<p class="norm">Ошибка базы данных – страна <b>$ncnt</b> не внесена в базу данных];
print "<br>Причина ошибки – <b>$DBI::errstr</b></p>\n";
} else {
print qq[<p class="norm" align="left">Новая запись внесена в таблицу стран: ];
print "<font color=navy><b>$ncnt</b></font></p>";
};
print <<EODT;
<hr align="center" noshade size="2" width="90%">
<p class="norm" align="left"><font size="+1"><a href="/cgi-bin/addcn.pl">Добавить еще
одну запись в базу</a></font></p>
<p class="norm" align="left"><font size="+1"><a href="/wineyard/index.html">Вернуться
к главной странице</a></font></p>
<hr align="center" noshade size="2" width="90%">
</BODY>
</HTML>
EODT
exit;
