Druzya.org
Возьмемся за руки, Друзья...
 
 
Наши Друзья

Александр Градский
Мемориальный сайт Дольфи. 
				  Светлой памяти детей,
				  погибших  1 июня 2001 года, 
				  а также всем жертвам теракта возле 
				 Тель-Авивского Дельфинариума посвящается...

 
liveinternet.ru: показано количество просмотров и посетителей

Библиотека :: Компьютеры и Программирование :: Начинаем изучать MySQL
<<-[Весь Текст]
Страница: из 157
 <<-
 
форма вывела число запрошенных пользователем записей, нет гарантии, что 
пользователь заполнил их все. Он мог пропустить строку, которая не будет 
включена в данные формы. Поэтому необходимо выявить все введенные числа. 
Результаты работы этой функции пересылаются следующей вспомогательной функции 
find_matching_students , как показано ниже:
sub find_matching_students { my §list = @_;
my ($i,@students,@notstudents); §students = ();
@notstudents = ();
if (@list) {
foreach $i (@list) {
my @query = ();
# Строим запрос, который ищет заданного учащегося, 
my $query = "select id, subjects from student where "; 
foreach ('first','middle','last', 'ext') {
if (param("$_$i")) {
my $temp = param("$_$i");
# В mSQL и MySQL одиночные кавычки служат ограничителями
# имен полей, и им должен предшествовать 
# управляющий символ "\",
# который управляет и сам собой,
# чтобы быть введенным буквально.
$temp =~ s/7\\'/g;
push(@query, "$_ = '$temp'"); } } 
$query = join(" and ",§query);
# Посылаем запрос базе данных.
my $out = $dbh->query($query);
# Если база данных ничего не возвращает, добавляем 
# учащегося к массиву @notstudents.
if (not $out->numrows) {
push(@notstudents, [ param("first$i"), param("middle$i"), param("last$i"), 
param("ext$i") ]); 
# В противном случае добавляем студента в массив ©students. 
} else {
my ($id,$subjects) = $out->fetchrow;
push(@students,[$id,$subjects]); } } }
return(\§students,\@notstudents); }
Эта функция пробегает по всем заданным именам учащихся и проверяет, есть ли уже 
они в базе данных. Если они существуют, данные о них записываются в массив с 
именем ©students , в противном случае - в массив @notstudents . Данные о каждом 
учащемся хранятся в безымянном массиве, создавая своего рода объект учащегося. 
В итоге функция возвращает ссылки на оба массива. Она не может возвратить 
данные как обычный массив, поскольку будет невозможно определить, где 
закончился один массив и начался другой.
И последняя вспомогательная функция - update_students , которая добавляет класс 
к списку классов для каждого существующего учащегося.
sub update_students { 
my $id = shift; 
my ©students = @_;
foreach (©students) {
my($sid, $subjects)=©$_;
if (not Ssubjects) { Ssubjects = ":$id:"; }
elsif (Ssubjects !" /:$id:/)
{ Ssubjects .= "$id:"; }
my $query = "update sti/dent set subjects='Ssubjects'
where id=$id";
$dbh->query($query); } }
Эта функция осуществляет запрос к таблице student, совершенно независимой от 
таблицы subject. В пределах одной CGI-программы можно работать с любым числом 
различных таблиц одной базы данных. Можно переключаться с одной базы данных на 
другую, но одновременно может быть активна только одна база данных. Эта функция 
извлекает список предметов для каждого учащегося и добавляет к нему новый 
предмет, если его еще нет в списке.
Функция обрабатывает все возможные случаи, кроме одного, когда к предмету 
приписаны учащиеся, которых еще нет в таблице student. В этом случае список 
новых учащихся передается функции add4, как показано ниже:
sub add4 {
#получить список ©students и @notstudents
&update_students($id,@students) if @students; 
&insert_students($id,@notstudents) if @notstudents;
# Вывести страницу успешного завершения. }
Эта функция разделяет список учащихся на существующих и несуществующих тем же 
способом, что и add3. Затем она обновляет список существующих учащихся с 
помощью функции update_students , показанной раньше. Несуществующие учащиеся 
посылаются новой вспомогательной функции insert_students :
sub insert_students { foreach $i (@list) {
# Производится выбор очередного числа из последовательности,
# определенной в таблице. Зто число используется как ID учащегося, 
my $out = $dbh->query('select _seq from student');
my($sid) = $out->fetchrow;
# Для включения в базу данных все строки
 
<<-[Весь Текст]
Страница: из 157
 <<-