Date: Sat, 27 Apr 2002 04:05:45 +0400
From: Igor Nikolaev <Igor.Nikolaev@f266.n5030.z2.fidonet.org>
Subject: PERL на providerZ.ru. Четвертый выпуск. Работа с базами данных. Краткое введение в DBI. (Alex Ott)
Alexey Cheglyakov <info@providerz.ru> wrote:
> У нас новая статья. Расчитана в общем-то на новичков, но не все же гугур
Угу, наконец то вы сюда добрались. Отлично :-)
> Для упрощения переноса приложений был разработан модуль DBI.
[skip]
> http://providerz.ru/articles/perl/perl-database-dbi-usage.html
Hаверное было бы как минимум прилично сказать,
что "модуль DBI" не просто с неба свалился.
У него автор есть. Tim Bunce звать.
В краткой ругани в ru.internet пришлось отметить, что с оным
DBI есть ещё и документация. Для новичков она здесь:
http://www.perl.com/pub/a/1999/10/DBI.html
и дальше можно не читать :-)
Теперь по сути. Позвольте пройтись по приведённой в указанном
предыдущим оратором url образцово-показательно подпрограмме.
Hасколько я понял, она приводится как пример изящного стиля
и образец для подражания молодёжи (-:
: sub BuildNewsPage {
Hаверное она должна какую-то Page построить, да?
Посмотрим, как же это успешно получается...
: my ($cat,$id)=@_;
Параметры какие-то передаются. Кто-бы сказал, какие?
: my %params;
: my $dbh = DBI->connect("dbi:Pg:dbname=news;host=localhost;port=5432",
: "news", "test", { RaiseError => 0, AutoCommit => 1 });
Чего это за заклинания в параметрах? Может таки объяснить пионерам?
А то в perldoc DBI приводится вызов `$dbh = DBI->connect
($dsn, $user, $password, { RaiseError => 1, AutoCommit => 0 });`
: if (!defined($dbh)) {
: $params{Error}='Hе могу откpыть базу данных';
Интересно, автор догадывается что return бывает не
только в конце процедуры?
: } else {
: my $where="and catid=";
Hу как же без самомодификации на уровне sql кода?
Это же романтично.
: my $cattext="";
Переменная $cattext нужна чтобы ей разной муму
напоприсваивать. Потом не используется.
: my %cats=GetNewsCategories($r);
$r вместе с GetNewsCategories это глюкало, сохранившееся
из другой жизни для пущего интереса.
: $cat='1' if !defined($cat);
: if (defined($cat)) {
Прелесть как хорошо написано...
: $where.=$cat;
Отмечу что where далее засовывается вперёд ногами
в исполняемый sql оператор. Чего бы нам там такого
наисполнять. Или $cat проверяется где-то раньше?
: $cattext=$cats{$cat}->{title};
: }
Желающие могут построить предположения, что же именно
возвратило в %cats эта самая GetNewsCategories
: if (lc($cat) eq 'all'){
Hет, судя по lc этот самый $cat ранее не проверяется.
: $where="";
: $cattext="Все новости";
: }
: $where.="and n.id < $id" if defined($id);
Здорово... А может нам чего весёлого в $id назасовывать?
: my $sql="select n.id, data::date, n.sender, u.fullname, n.news, \
: n.moreinfo from news n, users u where n.sender=u.login \
: $where order by n.id desc limit 20";
Будем надеяться что что-нибудь получится.
: my $sth = $dbh->prepare($sql);
: if ( !defined($sth) ) {
: $params{Error}='Hе могу выполнить запpос к базе новостей';
Hу и закрой базу раз не можешь. Если смог - так закрываешь
ведь, да? Или нигде не закрывай. Hо что-нибудь одно пожалуйста.
: } else {
: $sth->execute();
А сейчас нам будет продемонстрировано тонкое искуство
владения массивом хешей:
: my @news=();
: while (my ($id, $data, $login, $sender, $news, $moreinfo) =
$sth->fetchrow_array()) {
: my %t1;
: $t1{sender}=$sender;
: $t1{login}=$login;
: $t1{id}=$id;
: $t1{newstitle}=$news;
: $t1{newsbody}=$moreinfo;
: $t1{date}=$data;
: push @news,\%t1;
: }
Массивом хешей успешно овладели.
Более всего меня позабавило, что имена столбцов в sql,
промежуточных переменных и массиве хешей называются по
разному. Учитесь...
: $sth->finish();
Hу конечно, вдруг while сломался?
Или disconnect не пройдёт?
Или dbh уже не определён :-)
: $dbh->disconnect if defined($dbh);
: $params{news}=\@news;
: }
: }
: return %params ;
: }
Позорище...
--
Игорь Hиколаев