|
|
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) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/13416f4ae0b43.html, оценка из 5, голосов 10
|