# нужно процитировать.
my ($first, $middle, $last, $ext) = (
$dbh->quote(param("first$i")),
$dbh->quote(param("middle$i")),
$dbh->quote(param("last$i")),
$dbh->quote(param("ext$i")) );
my $query = "insert into student (id, first, middle, last,
ext, subjects) VALUES ($sid, $first, $middle,
$last, $ext, ':$id:')";
$dbh->query($query); } }
И эта функция обращается к таблице student, а не subject. Из последовательности,
определенной в таблице student, извлекаются ID для новых учащихся, затем
учащиеся вводятся в таблицу с этими ID.
MysqIPerl
Монти Видениус, автор MySQL, написал также и интерфейс Perl к MySQL, Mysql.pm.
Он основывался на модуле Msql.pm для mSQL, поэтому интерфейсы двух модулей
почти идентичны. На практике мы недавно преобразовали целый сайт из mSQL в
MySQL, выполнив команду «perl -e 's/^Msql/Mysql/>> *.cgi» в каждом каталоге,
содержащем CGI. Это составило 95% всей работы. Разумеется, при этом вы не
получаете преимуществ MySQL, но таким путем можно быстро и легко встать на путь
использования MySQL. Mysql.pm входит составной частью в пакет
msql-mysql-modules Йохена Видмана (Jochen Wiedmann).
Одним из самых больших различий между MySQL и mSQL является их работа с
последовательностями. В mSQL последовательность определяется в таблице командой
CREATE SEQUENCE on tablename . Значение последовательности можно получать после
этого, как обычное поле таблицы командой SELECT _se.q from tablename . В MySQL
к первичному ключу добавляется флаг AU-TO_INCREMENT . При попытке ввода null в
это поле оно автоматически инкрементируется. Как MySQL, так и mSQL допускают в
каждой таблице только одну последовательность. Подробное обсуждение
последовательностей в MySQL и mSQL см. в главе 6 «Диалект SQL, используемый в
MySQL и mSQL».
Чтобы показать некоторые функции Mysql.pm, вернемся к примеру с экзаменами.
Разобравшись с subject.cgi, займемся таблицей сведений об учащихся. Ее
структура такова:
CREATE TABLE student (
id INT NOT NULL auto_increment,
first VARCHAR(50),
middle VARCHAR(50),
last VARCHAR(50),
ext VARCHAR(50),
subjects VARCHAR(100),
age INT,
sex INT,
address BLOB,
city VARCHAR(50),
state VARCHAR(5),
zip VARCHAR(10),
phone VARCHAR(10),
PRIMARY KEY (id)
)
В этой таблице находятся все данные, используемые программой subject, cgi, a
также другие сведения, которые относятся к учащемуся. Программа student.cgi,
работающая с этой таблицей, должна выполнять все те функции, которые программа
subject.cgi выполняла в отношении таблицы subject.
Нельзя работать с базой данных mSQL через модуль Mysql.pm, как и с базой MySQL
через Msql.pm. Программа stu-dent.cgi предполагает, что таблица предметов
находится в базе данных MySQL. Аналогично, программа subject.cgi рассчитывает
на mSQL-версию таблицы учащихся.
Чтобы продемонстрировать, как работает Mysql.pm, мы подробно изучим ту часть
student.cgi, которая позволяет пользователю изменять сведения об учащемся. Так
же как операция «add» (добавление) в примере для Msql.pm была разбита на четыре
отдельные функции, операция «change» (изменение) разбита здесь на три отдельные
функции.
Первая функция - изменения, выводит форму, позволяющую пользователю найти
учащегося, данные о котором нужно изменить:
sub change {
print header, start_html('title'=>'Поиск учащегося для изменения денных'
'BGCOLOR'=>'white');
&print_form('search2', Поиск учащегося для изменения данных',1);
print <