Главная страница


ru.perl

 
 - RU.PERL ----------------------------------------------------------------------
 From : Igor Nikolaev                        2:5030/266     27 Apr 2002  05:05:45
 To : Alexey Cheglyakov
 Subject : Re: PERL на providerZ.ru.  Четвертый выпуск. Работа с базами данных. Кр
 -------------------------------------------------------------------------------- 
 
 Subject: Re: 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иколаев
 --- ifmail v.2.12.os.sensi
  * Origin: Чукча не читатель. Он писатель. (2:5030/266@fidonet)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 Re: PERL на providerZ.ru. Четвертый выпуск. Работа с базами данных. Кр   Igor Nikolaev   27 Apr 2002 05:05:45 
Архивное /ru.perl/13416f4ae0b43.html, оценка 1 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional