Использование Perl DBI как интерфейс для MySQL
Почему PERL? Почему не PHP? Как-никак, но считается, что PHP4 достаточно быстр за счёт нового интерпретатора?
Я отвечу, потому, что Perl - это язык, который наиболее часто сейчас используется. А я люблю идти в ногу со стандартами индустрии. Perl имеет большую поддержку online и большинство книг написано о нём. Существует CPAN, the Comprehensive Perl Archive Network, где Вы можете найти модули для исполнения Ваших самых сокровенных желаний, относительно программирования, конечно :-). DBI даёт Вам интерфейс, который будет работать как с самой примитивной БД, так и с самой последней версией Oracle РСУБД.
Давайте начнём с соединения с базой данных: use DBI;
my $dsn = 'DBI:mysql:my_database:localhost'; my $db_user_name = 'admin'; my $db_password = 'secret'; my ($id, $password); my $dbh = DBI->connect($dsn, $db_user_name, $db_password);
Давайте предположим, что мы получили из формы логин и пароль пользователя. Итак, $input_nickname = 'Cowlick' и $input_password = 'udder'
Естественно наше желание проверить действительно ли введёный пароль соответствует введёному логину в нашей БД. my $sth = $dbh->prepare(qq{select id, password from users where nickname = $input_nickname}); $sth->execute();
Отмечу отсутствие точки с запятой. При одной команде она не обязательна.
Как же мы получим результат? Т.к. мы ожидаем всего один ряд то, ($id, $password) = $sth->fetchrow_array(); $sth->finish(): # закончили запрос if ($input_password eq $password) # чувствительно к регистру { ... # вход удачен }
Что же делать если результат - более одной строки? Продолжающиеся запросы к $sth->fetchrow_array()
вернут нам оставшуюся часть данных. my $sth = $dbh->prepare(qq{ select nickname, favorite_number from users }); $sth->execute(); while (my ($nickname, $favorite_number) = sth->fetchrow_array()) # делать выборку данных # пока ничего не останется { print "$nickname, $favorite_number\n"; } $sth->finish();
Если же мы хотим сохранить все результаты для последующего использования my (@matrix) = (); while (my @ary = $sth->fetchrow_array()) { push(@matrix, [@ary]); # [@ary] это ссылка } $sth->finish();
Ссылка для программистов на C может быть расценена как указатель. Матрица теперь является массивом массивов ссылок или же двумерным массивов ссылок.
Вы можете достать ряд $i при помощи: @{matrix[$i]}
Или, достать нужный ряд и колонку ($i, $j) в таблице: $matrix[$i][$j]
Для операций MySQL, которые не возвращают результатов можно использовать метод do вместо prepare для того, чтобы выполнить SQL-команду. $dbh->do("insert into message_votes (message_id, user_id, vote) values (1, 3, 'good')");
И, наконец, чтобы окончить работу с базой - рассоединение: $dbh->disconnect();