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


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)
 
 

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

 Тема:    Автор:    Дата:  
 DBI & sessions   Maxim Yemelyanov   12 Jun 2004 11:16:15 
 Re: DBI & sessions   Konstantin Tokar   12 Jun 2004 12:32:57 
 Re[2]: DBI & sessions   Maxim Yemelyanov   12 Jun 2004 13:18:33 
 Re: DBI & sessions   Konstantin Tokar   12 Jun 2004 14:43:32 
 Re[2]: DBI & sessions   Maxim Yemelyanov   12 Jun 2004 15:25:38 
 Re: DBI & sessions   Konstantin Tokar   12 Jun 2004 21:28:39 
 Re: DBI & sessions   Artem Chuprina   12 Jun 2004 15:53:04 
 Re[2]: DBI & sessions   Maxim Yemelyanov   12 Jun 2004 16:47:29 
 Re[2]: DBI & sessions   Ivan Frolkov   12 Jun 2004 17:29:27 
 Re[3]: DBI & sessions   Maxim Yemelyanov   12 Jun 2004 19:54:48 
 Re: Re[2]: DBI & sessions   Boris Nesterov   01 Jul 2004 02:07:00 
Архивное /ru.cgi.perl/65775f1f72a0.html, оценка 2 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional