Работа с MySqlВ последнее время весьма популярной базой данных стала MySql ( http://webscript.ru///www.mysql.com/ ). Это неудивительно - небольшой, весьма и весьма шустрый, бесплатный сервер баз данных. Не лишенный, правда, недостатоков, среди которых основной (на мой взгляд) - отсутствие поддержки вложенных запросов. Но его скорострельность и бесплатность, по-видимому, сыграли решающую роль в выборе многих веб-мастеров использовать именно MySql в своих разработках. Если я не ошибаюсь, то язык Perl занимает главенствующее положение в области Web-приложений. Основная масса CGI - скриптов и разнообразных информационных/управляющих систем на Web интерфейсе в данное время написано именно на Perl. Для этого языка накоплен огромный мировой опыт программирования, нашедший свое воплощение в библиотеке CPAN ( http://webscript.ru///www.cpan.org/ ). Уже написана масса библиотек для всех случаев жизни (как вам например, bioperl - "A library of tools and modules of particular interest to biologists."?), и зачастую, вместо "изобретения велосипеда" нужно просто просмотреть список готовых библиотек Perl, наверняка, что-то уже написано по поводу решаемой вами проблемы. В данном случае, мы рассматривая взаимодействие языка Perl с сервером баз данных MySql, будем использовать библиотоеку DBD::mysql. Для использования библиотеки DBD необходимо наличие библиотеки DBI, поэтому они должны быть установлены на компьютере, где используется скрипт. Кроме того, необходимо наличие сервера MySql где-нибудь поблизости от вас для тестовых работ. Итак,В первую очередь,вы должны договориться с сисадмином сервера предоставить вам доступ к MySql с возможностью создавать базу или хотя бы таблицы в базе. После этого, можно протестировать подключение к MySql серверу:#!/usr/bin/perl use DBI; my $dbh = DBI->connect("DBI:mysql:database=ваша_база_данных;host=адрес_сервера_mysql", "логин", "пароль") || die $DBI::errstr; @tables = $dbh->func( '_ListTables' ); foreach $line(@tables) { print $line,"\n"; } $dbh->disconnect();При этом, если все нормально, вы на выходе этого скрипта должны ничего получить что-то типа: таблица1 таблица2 таблица3Где таблица1 - наименование таблиц в вашей базе данных. Если соединение создать не получилось, тогда что-то неправильно, или не тот хост, пароль, логин или нет такой базы - например, если нет базы данных, то будет что-то типа: Unknown database 'ваша_база_данных' at try.pl line N.Если нет доступа пользователю под "логин" или неправильные логин или пароль, то будет выдано сообщение Access denied for user: 'логин@ваш_хост.домен' (Using password: YES) at try.pl line N.Адрес сервера может быт как каноническим вида dbserver.domain.com (если корректно работет DNS) или абсолютным IP адресом. Итак, если удалось успешно законнектится, то вы получите список таблиц в вашей БД. Если нет - проверьте логин/пароль, поругайтесь с сисадмином, чтобы он вам разрешил доступ с вашей машины к серверу MySql. (Только на сисадмина сильно не наезжайте - может что-то плохое сделать вам, сам знаю, сам сисадмин:)). Теперь попробуем создать таблицу в вашей базе данных. Определимся сразу - мы сделаем небольшой каталог ссылок на ваши любимые ресурсы. Создадим таблицу, гордо именуемую "links". В таблице будут следующие поля: ї
CREATE TABLE links ( id TINYINT, name VARCHAR(64), url VARCHAR(128), category TINYINT }В Perl его надо исполнять следующим образом: #!/usr/bin/perl use DBI; my $dbh = DBI->connect("DBI:mysql:database=ваша_база_данных;host=адрес_сервера_mysql", "логин", "пароль") || die $DBI::errstr; $dbh->do("CREATE TABLE linksВот таков код для создания таблицы в базе данных. Метод указателя базы данных do готовит и исполняет одиночную инструкцию SQL. Возвращает количество выбранных строк или undef в случае ошибки. Если возврат = -1, то количество строк неизвестно или отсутствует. В нашем случае количество строк неактуально, поэтому мы опустили оператор присваивания. Этот метод эквивалентен следующему набору кода:sub do { my($dbh, $statement, $attr, @bind_values) = @_; my $sth = $dbh->prepare($statement, $attr) or return undef; $sth->execute(@bind_values) or return undef; my $rows = $sth->rows; ($rows == 0) ? "0E0" : $rows; }Как описано в таблице 1 ( http://webscript.ru/#tab1 ), поле id должно быть autoincrement. Теперь возникают некоторые замечания:
... $dbh->do("ALTER TABLE links CHANGE id id TINYINT (4) not null"); $dbh->do("ALTER TABLE links ADD PRIMARY KEY(id)"); $dbh->do("ALTER TABLE links CHANGE id id TINYINT (4) not null AUTO_INCREMENT"); ...SQL инструкция ALTER TABLE позволяет изменять свойства таблицы. Более подробно смотри Документацию по MySql ( http://webscript.ru///www.mysql.com/documentation/mysql/bychapter/manual_Reference.html ) Теперь таблица links соответствует нашим требованиям. При добавлении новой записи знаяение поля id в оной автоматически будет увеличиваться на 1. Далее надо создать табличку категорий. Ее структура: ї
CREATE TABLE category (id TINYINT not null AUTO_INCREMENT,Исполняем его уже известным нам методом do : $dbh->do("CREATE TABLE category (id TINYINT not null Теперь нужно в наши таблицы внести данные. Об этом в следующей статье |