|
форма вывела число запрошенных пользователем записей, нет гарантии, что
пользователь заполнил их все. Он мог пропустить строку, которая не будет
включена в данные формы. Поэтому необходимо выявить все введенные числа.
Результаты работы этой функции пересылаются следующей вспомогательной функции
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;
# Для включения в базу данных все строки
|
|