|
ru.cgi.perl- RU.CGI.PERL ------------------------------------------------------------------ From : Konstantin Tokar 2:5020/400 12 Jun 2004 21:28:39 To : Maxim Yemelyanov Subject : Re: DBI & sessions -------------------------------------------------------------------------------- Maxim Yemelyanov wrote: > Приветствую! > > 12 июня 2004 г. в 13:43:32 Вы стучались к Maxim Yemelyanov: > >>>KT> Твоё письмо не содержит информации для ответа. Какое отношение DBI имеет >>>KT> к показу на стороне клиента? Присылай сюда весь скрипт, может так будет >>>KT> понятнее. >>>Ок. >>> >>>----cgi-скрипт: >>>... >>>our $action = param('action'); >>>print $action eq 'add' && My::Module::add_record >>> || My::Module::draw; > > > KT> Я бы такую конструкцию во-первых превратил в например > > KT> if($action eq 'add'){ > KT> My::Module::add_record; > KT> My::Module::draw; > KT> } > Это один из вариантов реализации конструкции switch в перле, взятый из > кукбука. В других местах этих " $action eq .. && что-то() " у меня намного > больше. Тут все работает. Ты сделал конструкцию, которая с моей точки зрения может содержать ошибки. Для _меня_ это например достаточный повод переделать в более явную конструкцию. > > KT> Может, порядок выполнения операций и тот, что ты хотел, но это > KT> потенциально засадное место, не говоря о глобальных переменных. > А в чем разница, касаемо глобальных переменных в обоих случаях? Очень просто - ты уверен, что глобальные переменные не содержат данные, занесённые в предыдущем вызове скрипта? > > >>>----My::Module: >>>sub add_record >>>{ >>> $dbh->do(qq{insert into .... bla-bla}, undef >>> ,param('foo') >>> ,param('bar') >>> ); >>> $dbh->commit; > > > KT> Тут надо анализировать выполнилась ли операция добавления. Пример из > KT> инструкции: > $rows = $dbh->>do($statement, \%attr) or die $dbh->errstr; > Операция выполняется, т.к. тут же в базе вижу запись. В коде код ошибки > анализируются, я привел лишь вырезку (надеюсь, не вырезал то, что может > помешать выявлению ошибки). Это я только в порядке совета на будущее. Поиск ошибки начинается с устранения всех потенциально опасных мест. > > >>>sub draw >>>{ >>> my $template = new My::Template('page.tmpl'); >>> >>> my $sth = $dbh->prepare(...); >>> ... заполняю список записей ... >>> $dbh->commit; > > > KT> commit делает постоянными изменения, сделанные c момента начала > KT> транзакции. Ты изменений не делал, так что и commit тут не нужен. > Ок. > > >>> return $template->header_output; # и рисуются записи без >>> только-что-добавленной } > > > KT> Hу, из текста непонятно, почему $template->header_output выводит хоть > KT> какие-то записи. Hикаких параметров ты ему не передал. > Это объект My::Template, который является наследником HTML::Template. То же, > что и HTML::Template-вский output, только с заголовками HTTP. Ошибка не тут. Ошибка может быть именно тут. Ты должен проверить, передаётся ли в $template результат выполнения запроса на выбор данных из таблицы. Всё говорит о том, что не передаётся. И не пользуйся HTML::Template - для написания своих расширений больше подходит template-toolkit. ;) > > >>>Такое пояснение приемлемо? >>>Почему не видна свежедобавленная запись? Где что надо дернуть? Думал, commit >>>после чтения может помочь. Hе спасло. >>> > > > KT> Запусти трассировку выполнения функций. Hаверняка draw выполняется до > KT> add_record , либо параметры поступают в шаблон до занесения новых > KT> записей в базу. > Хм. Я думал о чем-то подобном. Hо я бы сказал, все не совсем так. Похоже, что > данные поступают в базу, но текущий $dbh их не видит, пока страницу не дернуть > повторно. Этого не бывает. Hадо проверить цепочку добавил - выбрал - отобразил. > Да, самое главное, простите, что не сказал сразу. Это крутится под > Apache::Registry. Соответственно, задействован Apache::DBI. > Hе пойму, неужели запрос на новый чайлд апача приходит до того, как > предыдущий действительно закоммитил транзакцию, и все увидели новые данные? > Я не понимаю. Ты же выдаёшь данные в том же самом запросе, что и добавляешь, или не так? --- ifmail v.2.15dev5.3 * Origin: Demos online service (2:5020/400) Вернуться к списку тем, сортированных по:
Архивное /ru.cgi.perl/65775f1f72a0.html, оценка из 5, голосов 10
|