The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

PERL на providerZ.ru. Четвертый выпуск. Работа с базами данных. Краткое введение в DBI. (Alex Ott)


<< Предыдущая ИНДЕКС Поиск в статьях src Установить закладку Перейти на закладку Следующая >>
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иколаев

<< Предыдущая ИНДЕКС Поиск в статьях src Установить закладку Перейти на закладку Следующая >>



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру