Статьи

Доступ к вашей базе данных MySQL с помощью Perl

Один из самых распространенных вопросов, связанных с 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.pladd.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";  
}

Это оно! Если вам нужна дополнительная информация, попробуйте эти ресурсы: