Один из самых распространенных вопросов, связанных с Perl на форумах SitePoint : «Как получить доступ к моей базе данных с помощью Perl?» Perl может работать практически со всеми типами баз данных на рынке, но сегодня я буду использовать MySQL в качестве примера.
Для целей этой демонстрации, скажем, у нас есть база данных с именем «обувь» с одной таблицей с именем «подписчики». Вот расположение таблицы:
create table subscribers (
uid int not null primary key auto_increment,
username varchar(32) not null,
emailaddr varchar(32) not null
);
Мы подключимся к MySQL с помощью модулей DBI и драйвера базы данных DBD :: mysql. Эти модули не поставляются со стандартным дистрибутивом Perl, поэтому вам придется получить их самостоятельно. Если вы поддерживаете свой собственный сервер, следуйте приведенным ниже инструкциям, но если у вас есть веб-хост, они смогут позаботиться об установке за вас, если у них еще не установлены модули.
Установите модули
Чтобы установить модули DBI и DBD :: mysql в Unix-подобной ОС или Perl в Windows, установленной как часть Cygwin, выполните следующие команды.
Обратите внимание, что у вас уже должен быть установлен MySQL, иначе вы не сможете установить модуль DBD :: mysql. Кроме того, если вы не установили другие модули таким образом, вас попросят указать параметры конфигурации. К счастью, это говорит само за себя. Как только вы закончили ввод значений конфигурации, начнется установка модуля.
perl –MCPAN –e 'install DBI'
perl –MCPAN –e 'install DBD::mysql'
Вы увидите несколько экранов текста, но в конечном итоге он должен вернуть вас в дружественную командную строку.
Там будут редко какие-либо ошибки, потому что эти модули были протестированы тысячами людей. Однако, если вам не повезло с ошибками, быстрый поиск в Google, вероятно, найдет для вас решение.
Работа с базой данных
Теперь, когда модули и драйверы базы данных установлены, мы можем перейти к фактическому коду Perl для работы с базой данных. Сейчас мы просто подключимся к базе данных.
# set the data source name
# format: dbi:db type:db name:host:port
# mysql's default port is 3306
# if you are running mysql on another host or port,
# you must change it
my $dsn = 'dbi:mysql:shoes:localhost:3306';
# set the user and password
my $user = 'user';
my $pass = 'pass';
# now connect and get a database handle
my $dbh = DBI->connect($dsn, $user, $pass)
or die "Can't connect to the DB: $DBI::errstrn";
ОК, в этом коде было много нового. Сначала мы определили DSN или имя источника данных. Это сообщает DBI, где найти сервер базы данных и с какой базой данных вы будете работать. Затем мы устанавливаем имя пользователя и пароль для подключения к базе данных как. Наконец, мы вызываем DBI->connect
Из этой команды мы получаем дескриптор базы данных, который мы будем использовать для выполнения запросов к базе данных.
Выполнение запроса выполняется в два этапа: подготовка и выполнение. Во-первых, вы должны подготовить запрос следующим образом:
my $sth = $dbh->prepare('insert into subscribers(username, emailaddr)
values "jim", "[email protected]")');
Тогда вы можете выполнить это:
$sth->execute();
Поскольку мы запустили запрос INSERT
Но что, если мы использовали SELECT
Как бы мы получили данные? Как это:
my $sth = $dbh->prepare("select username, email from subscribers");
$sth->execute;
while(@row = $sth->fetchrow_array()) {
print "$row[0]: $row[1]<br>";
}
Как видите, $sth->fetchrow_array
Если хотите, вы можете написать цикл таким образом, чтобы сделать его немного более читабельным:
while(my($username, $email) = $sth->fetchrow_array()) {
print "$username: $email<br>";
}
Вместо того, чтобы присваивать значения нормальному массиву, это присваивает значения строк каждому разной переменной.
Создайте веб-приложение
Теперь давайте использовать DBI для создания (несколько) полезного веб-приложения для управления подписчиками каталога вымышленного магазина обуви. Будет две страницы, view.pl
add.pl
Опять же, помните, что вы должны ввести свое имя пользователя и пароль в этих сценариях вместо значений по умолчанию «user» и «pass».
Вот add.pl:
use CGI;
use DBI;
print CGI::header();
my $username = dbquote(CGI::param('name'));
my $email = dbquote(CGI::param('email'));
unless($username) {
print <<PAGE;
<h1>Add a Subscriber</h1>
<form action=add.pl method=post>
Name: <input type=text name=name><br>
Email: <input type=text name=email><br>
<input type=submit value="Add Subscriber">
</form>
PAGE
exit;
}
# connect
my $dbh = DBI->connect("dbi:mysql:shoes:localhost:3306", "user", "pass");
# prepare the query
my $sth = $dbh->prepare("insert into subscribers(username, emailaddr)
values('$username', '$email')");
# execute the query
$sth->execute();
print <<PAGE;
<h1>User Added</h1>
The user $username was just added. Want to
<a href=add.pl>add another</a>? PAGE
sub dbquote {
my($str) = @_;
$str =~ s/"/\"/g;
$str =~ s/\/\\/g;
$str =~ s/'/\'/g;
return $str;
}
А вот view.pl:
use DBI;
use CGI;
print CGI::header();
print "<h1>Subscribers</h1>";
# connect
my $dbh = DBI->connect("dbi:mysql:shoes:localhost:3306", "user", "pass");
# prepare the query
my $sth = $dbh->prepare("select username, emailaddr from subscribers");
# execute the query
$sth->execute();
while(my ($username, $email) = $sth->fetchrow_array()) {
print "$username: $email<br>n";
}
Это оно! Если вам нужна дополнительная информация, попробуйте эти ресурсы:
- Программирование Perl DBI (О’Рейли)
- Perl в двух словах (О’Рейли)
- Документация по DBI (Perldoc DBI)