Модераторы: korob2001, ginnie

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> правильная работы с DBI 
:(
    Опции темы
gcc
Дата 7.3.2009, 05:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 1
Всего: 17



столкнулся с проблемой, есть база данных в которой из всех таблиц есть 3-4 таблицы и с ними все время надо работать, у них много int занечений

при запросе нужно делать программное построение запросов...

и это очень портит программу...

примерно вот так только еще больше усложнить условий:

Код

if ('moderator') {
push @sql, 'AND bla = ?'
push @sqlp. 'AND bla = ?'
}

if ('moderator') {
push @sql, 'AND bla = ?'
push @sqlp. 'AND bla = ?'
}

if ('moderator') {
push @sql, 'AND bla = ?'
push @sqlp. 'AND bla = ?'
}

$sql = join ('', @sql);


        my $sth = $self->{dbh}->prepare(
            "SELECT t1.username,
                                t1.name,
                                t1.quota,
                                t1.domain

                         FROM mailbox AS t1,
                              domain AS t2                    
                         WHERE t1.domain = ?
                         AND t1.username = ?
                         $sql 
                         AND t1.domain = t2.domain 
                         LIMIT 1
                          "
        );
        $sth->execute(@sqlp);


Код


        if ($ps->{type_content_privat} eq 'on') {
        $ps->{type_content_privat} = '1';
        } else {
        $ps->{type_content_privat} = '0';
        } 
    
        
        my $section;
        if ($ps->{type_content_privat} eq 'on') {
        $ps->{type_content_privat} = '1';
        $ps->{section_child} = $c->user->{user}->{id};
        } else {
        
           if (defined ($ps->{section_child})) {
       
             my $dbh = $c->model('DBI')->dbh;
             my $sth = $dbh->prepare("SELECT id_se
                                      FROM section
                                      WHERE id_se = ?
                                      LIMIT 1");
             $sth->execute($ps->{section_child});
               $section = $sth->fetchrow_hashref();
             $sth->finish();
               $type_section_privat = 0;   
           } 
        }
        
        my $error_se;
        unless  ($ps->{name_content} 
              || $ps->{name_hiden_content} 
              || $ps->{content_keys} 
              || $ps->{content_text}  ) {
              
        $error_se = 1;
        
        }
            
        # If the username and password values were found in form
        if ($error_se != 1 && $section->{id_se}) {
         
        # exit;
                        # $c->stash->{error_msg} = "Bad username or password2.";
                        #  $c->forward('add_section');
                        #  return;
         my $sql;
         my @sql; 
                        
        if ( $ps->{submit} && $ps->{submit} eq 'Add content' ) {         
              
         $sql = '
         INSERT INTO content (  id_un,            
                                    id_se,             
                                        name_co,          
                                            heading_name_co,  
                                            keys_co,          
                                            text_co,         
                                            active_co,        
                                            hiden_co,         
                                            hiden_g_co,       
                                            close_co,         
                                            voting_co,        
                                            vo_all_co,       
                                            vo_balls_co,     
                                            vo_per,           
                                            created  ) 
              VALUES (?,
                      ?,
                      ?,
                      ?,
                      ?,
                      ?,
                      ?,
                      ?,
                      ?,
                      ?,
                      ?,
                      ?,
                      ?,
                      ?,
                      ?)
         
         ';
        
        push @sql,
             $c->user->{user}->{id},
             $ps->{section_child},
             $ps->{name_content},
             $ps->{name_hiden_content},
             $ps->{content_keys},
             $ps->{content_text},
             '0',
             $ps->{type_hiden_content},
             '0',
             '0',
             $ps->{type_voting_content},
             '1',
             '1',
             '1',
             time;
             
             
         }
                 
        if ( $ps->{submit} && $ps->{submit} eq 'Edit content' ) {
        
            my $sql = 'UPDATE content 
                              SET 
                              id_se = ?,
                              name_co = ?,
                              heading_name_co,  
                                            keys_co,          
                                            text_co,         
                                            active_co,        
                                            hiden_co,         
                                            hiden_g_co,       
                                            close_co,         
                                            voting_co,        
                                            vo_all_co,       
                                            vo_balls_co,
                                                                       
                        WHERE id = ?
               " );
       
       push @sql,
            $self->{p}->{fPassword},
            $self->{p}->{fCreateddomain},
            $self->{p}->{id}->{id}
        );

           
            
        }


по-моиму это как-то криво, или нет?

мне ORM не понравился сразу, может быть тут есть какие-то ньюансы при использвоании DBI, сделать нужно свой класс, но а что именно чтобы в нем было?

или "забит" на sql и использовать DBIx::Class?
PM WWW ICQ Skype GTalk Jabber   Вверх
klem4
Дата 7.3.2009, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 100
Регистрация: 27.7.2008

Репутация: 2
Всего: 2



Мм ну оптимизировать тут определенно можно, возможно не тот момент, что вы казали.

Во-первых по моему после выполнения вот этого кода в самом начале:

Код

       if ($ps->{type_content_privat} eq 'on') {
           $ps->{type_content_privat} = '1';
        } else {
           $ps->{type_content_privat} = '0';
        } 
    


Следующая за ним ветка не выполнится никогда ....

Код
 if ($ps->{type_content_privat} eq 'on') {



Думаю стоит начать с этого.
PM MAIL   Вверх
gcc
Дата 7.3.2009, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 1
Всего: 17



какая ветка?
я просто так это написал для примера, я не про это спрашивал...

не красиво выглядит когда есть большой запрос и его надо массива строить... и if else усложнить более не читаемое суть действия...

Это сообщение отредактировал(а) gcc - 7.3.2009, 19:03
PM WWW ICQ Skype GTalk Jabber   Вверх
tolkien
Дата 8.3.2009, 07:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 277
Регистрация: 5.4.2008

Репутация: 4
Всего: 4



Вы можете сделать так:
1. создать отдельно файл pl (sub1.pl) в котором определить процедуры
2. в основном файле загрузить этот файл через do

соответ. код в основном файле будет чистым и содержать только вызовы процедур определенных в файле sub1.pl 


PM MAIL   Вверх
Vaneska
Дата 8.3.2009, 20:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 141
Регистрация: 15.3.2005
Где: Москва

Репутация: 3
Всего: 4



1. Если у Вас таких запросов единичные случаи, то наверно не стоит сильно чего-то менять,
единственное что надо сделать - как можно тщательней причесать код, поставить комментариев побольше,
чтобы сразу можно было понять, что к чему.

2. Если все таки хочется хоть как-то унивесиализировать код, то я делаю что-то на подобие такого:

Код


# параметры, передаваемые функции
# $request - запрос до where
# $where_array - различные условия, например
# [
#    { 'field1' => [ ?, ?, ? ] }, # переводится в field1 in ( ?, ?, ? )
#    { 'field2' => { '>' => 1234 } } # переводится в field2 > 1234
#]
# $after_where - то что после where
# $params_array - массив параметров
# возврвщает executed sth

sub select_request {
    . . .
}

my $sth = select_request( 
    'select id, field1 from table', 
    [
        { id => [ ,1 ,2, ? ],
    ],
    'order by id',
    [ 345 ]
);


Естественно это абстрактный пример, но идея, надеюсь, понятна.
--------------------
http://isokolov.blogspot.com/
PM MAIL ICQ   Вверх
IceSunrise
Дата 10.3.2009, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 7.4.2008
Где: Санкт-Петербург

Репутация: 3
Всего: 3



А почему вам сразу ORM не понравился? DBIx::Class для таких целей и предназначен.
PM MAIL   Вверх
KSURi
Дата 10.3.2009, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 887
Регистрация: 8.6.2006
Где: Russia

Репутация: 20
Всего: 27



UPD: не так понял первый пост сначала

Посмотрите в сторону SQL::Abstract. Менее комплексный модуль, но для простого составления запросов может подойдет

Это сообщение отредактировал(а) KSURi - 10.3.2009, 13:57


--------------------
Died at Life.pl line 21
PM Jabber   Вверх
gcc
Дата 11.3.2009, 05:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 1
Всего: 17



Цитата(IceSunrise @ 10.3.2009,  10:47)
А почему вам сразу ORM не понравился? DBIx::Class для таких целей и предназначен.


не понравилось тем что не видел большого приемущества, там есть некоторые вещи по лучше, например  insert_update()  мне показалось что ради этого не стоит пробовать... тем более оно уменьшает код по численности, но не по логике, так показалось по крайнем мере...  больше не увидел новых вещей... а что там еще есть полезно?

но в книге и везде рекомендовано использовать именно это, буду использовать, DBIx::Class, значит

еще есть 
Код

Rose::DBx
 разницу пока не увидел....

Цитата(KSURi @ 10.3.2009,  13:55)
UPD: не так понял первый пост сначала

Посмотрите в сторону SQL::Abstract. Менее комплексный модуль, но для простого составления запросов может подойдет


недавно увидел DBIx::Abstract  не много больше возможностей, но в каталисте нету модели для него, но можно сделать легко из DBI...


Это сообщение отредактировал(а) gcc - 11.3.2009, 05:26
PM WWW ICQ Skype GTalk Jabber   Вверх
dmitryk1
Дата 11.3.2009, 07:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 118
Регистрация: 10.6.2008
Где: Новосибирск

Репутация: 2
Всего: 2



Вообще странно, что приходится так эти запросы конструировать... 

Видимо что-то не правильно спланировано. Лучше сделать несколько запросов. Полных. Отражающих суть приложения, а потом получать их из хэша в зависимости от условий.

Типа: 
Если 'Admin' то  $ps->{Admin} а в  $ps->{Admin} лежит полный готовый и неизменяемый селект. Ну и разумеется везде в запросах "?" используется, чтобы уж совсем единичных запросов не было.
PM MAIL GTalk Jabber   Вверх
IceSunrise
Дата 11.3.2009, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 7.4.2008
Где: Санкт-Петербург

Репутация: 3
Всего: 3



Цитата

а что там еще есть полезно?


ORM преследует вполне конкретные цели. Во-первых, вы уходите от конкретного типа СУБД и ее специфических языковых конструкций. Во-вторых, теоритически, ваш код сможет читать и поддерживать человек, не знающий SQL, хотя это достаточно сложно представить smile Ну и в третьих, вся работа с базой получается хорошо локализована: изменилась табличка - меняете ее описание в соответствующем модуле. Если запрос достаточно сложный, то всегда можно написать нативный SQL.
PM MAIL   Вверх
gcc
Дата 12.3.2009, 04:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 1
Всего: 17



Код

sub add_section : Local {
    my ( $self, $c ) = @_;
    $c->stash->{template} = '/home/x0/data/www/MyApp/root/add_section.tt';
    my $dbh = $c->model('DBI')->dbh;
    my $sth = $dbh->prepare(
        "SELECT id_se, name_se 
                             FROM section
                      ");
    $sth->execute();
    my $loop_data;
    push @{$loop_data}, $_ while $_ = $sth->fetchrow_hashref();
    $sth->finish();
    $c->stash->{user_exists} = $c->user_exists();
    my $ff = $c->user;
    $c->stash->{messages} = $loop_data;
    $c->stash->{admin} = 1 if ( $c->user->{user}->{username} eq 'admin' );
}

sub add_section2 : Local {
    my ( $self, $c ) = @_;
    $c->stash->{template} = 'add_section.tt';
   my  $ps;   my $er;      %{$er}=();
    $ps = $c->request->params;
    my $lastid;        my $re;
   my @sql;     my @sqlp;
    my $section;
    %{$section} = ();
    
        $ps->{type_section_privat} = $ps->{type_section_privt} eq 'on' ? '1' : '0';    

            if ( $c->user->{user}->{username} eq 'admin' )
              {
               $ps->{type_section_hidden_guest} = $ps->{type_section_hidden_guest} eq 'on' ? '1' : '0';    
                 $ps->{type_section_forb_s} = $ps->{type_section_forb_s} eq 'on' ? '1' : '0';    
                 $ps->{type_section_forb_c} = $ps->{type_section_forb_c} eq 'on' ? '1' : '0';   
                 $ps->{type_section_active} = $ps->{type_section_active} eq 'on' ? '1' : '0';   
              }


    if ( $ps->{type_section_privat} eq 'on' ) {
        $ps->{type_section_privat} = 1;
        $section->{id_se} = 'privat';
    }
    else {

        if ($ps->{section_child}) {

            my $dbh = $c->model('DBI')->dbh;
            my $sth = $dbh->prepare(
                "SELECT id_se
                                      FROM section
                                      WHERE id_se = ?
                                      LIMIT 1"
            );
            $sth->execute($ps->{section_child});
            $section = $sth->fetchrow_hashref();
            $sth->finish();
            $ps->{type_section_privat} = '0';

        }
    }

    my $error_se;
    unless ($ps->{name_section}) {
        $error_se = 1;

    }

    if ( $error_se != 1 && $section->{id_se} ) {
       
        push @sql, 
             $c->user->{user}->{id},
             $section->{id_se},
             $ps->{name_section},
             $ps->{type_section_privat},
             '0',
             time;    
        
        
            if ( $c->user->{user}->{username} eq 'admin' ) {
                    
                push @sql,
                   $ps->{type_section_active},
                   $ps->{type_section_forb_s},
                    $ps->{type_section_forb_s},
                    $ps->{type_section_hidden_guest};
                    
            } else {
                push @sql,
                   '1',
                   '0',
                    '0',
                    '0';            
            }
            
            my $sql;
         if ( $ps->{submit} && $ps->{submit} eq 'Add section' ) {
        
          $sql = "INSERT INTO section (  id_un,
                                            parent_se_id,
                                            name_se,
                                            privat_se,
                                            close_se,
                                            created,
                                            active_se,
                                            forbi_section_se,
                                            forbi_content_se,
                                            hiden_g_co 
                               ) 
              VALUES (?,
                      ?,
                      ?,
                      ?,
                      ?,
                      ?,
                      ?,
                      ?,
                      ?,
                      ?)
               ";
         
          }
                        
         if ( $ps->{submit} && $ps->{submit} eq 'Edit section' ) {
            
                    if ( $c->user->{user}->{username} eq 'admin' ) {
            push @sqlp,
               'active_se = ?',
                    'forbi_section_se = ?',
                    'forbi_content_se = ?',
                    'hiden_g_co = ?';
                    
                push @sql,
                   $ps->{type_section_active},
                   $ps->{type_section_forb_s},
                    $ps->{type_section_forb_s},
                    $ps->{type_section_hidden_guest};                    
                     } 
                             
              push @sql, $ps->{id_content};
                my $sql2    = join(',', @sqlp);    
                
              $sql = " UPDATE section 
                         SET     parent_se_id = ?,
                                            name_se = ?,
                                            privat_se = ?,
                                            close_se = ?,
                                            created = ?,
                                        $sql2       
                       WHERE id_se = ?
                             ";
        }
        
        my $dbh = $c->model('DBI')->dbh;
        my $sth = $dbh->prepare($sql);
        $sth->execute(@sql);
        $sth->finish();
        $lastid = $dbh->{mysql_insertid} if ($ps->{submit} eq 'Add section');
      
        if ($ps->{type_redirect} eq 'on') {
          $lastid = $lastid eq '' ? $ps->{id_se} : $lastid;    
            $c->response->redirect($c->uri_for('/profile/edit_personal_section/'.$lastid));
         } else {
            $c->response->redirect($c->uri_for('/profile/view_pesonal_section'));
        }
    }
    else {
      $c->response->redirect($c->uri_for('/profile/view_pesonal_section'));
    }

sub add_content : Local {

    my ( $self, $c ) = @_;

    $c->stash->{template} = 'add_content.tt';

    my $dbh = $c->model('DBI')->dbh;

    my $sth = $dbh->prepare(
        "SELECT id_se, name_se 
                             FROM section
                                                         ");
    $sth->execute();
    my $loop_data;
    push @{$loop_data}, $_ while $_ = $sth->fetchrow_hashref();
    $sth->finish();
    $c->stash->{user_exists} = $c->user_exists();
    my $ff = $c->user;
    $c->stash->{messages} = $loop_data;
}

sub add_content2 : Local {
    my ( $self, $c ) = @_;
    $c->stash->{template} = 'add_section.tt';
  my $lastid;     my  $ps;
  my $er;     %{$er}=();
   $ps = $c->request->params;

    my $content;
    if ( $ps->{submit} && $ps->{submit} eq 'Edit content' ) {
        if ( $ps->{id_content} ) {
            my @sql, my $sqlp;
            if ( $c->user->{user}->{username} eq 'admin' )
              {
                  push @sql, $ps->{id_content};
            }
            else {
                  push @sql, $ps->{id_content}, $c->user->{user}->{id};
                  $sqlp = 'AND id_un = ?';
            }
            my $dbh = $c->model('DBI')->dbh;
            my $sth = $dbh->prepare(
                  "SELECT id_co
                                        FROM content
                                       WHERE id_co = ?
                                             $sqlp
                                       LIMIT 1"
            );
            $sth->execute(@sql);
            $content = $sth->fetchrow_hashref();
            $sth->finish();
            unless ( $content->{'id_co'} ) {
            $er->{'no_id_content'} = 1;
            }
        } else {
            $er->{'id_content_error'} = 1;
        }
   }

$ps->{type_hiden_content} = $ps->{type_hiden_content} eq 'on' ? '1' : '0';    
 
    
$ps->{type_voting_content} = $ps->{type_voting_content} eq 'on' ? '1' : '0';        


    my $section;
    if ( $ps->{type_content_privat} eq 'on' ) {
          $ps->{type_content_privat} = '1';
          $ps->{section_child}       = $c->user->{user}->{id};
    }
    else {

          if ( defined( $ps->{section_child} ) ) {

              my $dbh = $c->model('DBI')->dbh;
              my $sth = $dbh->prepare(
                  "SELECT id_se
                                      FROM section
                                      WHERE id_se = ?
                                      LIMIT 1"
              );
              $sth->execute( $ps->{section_child} );
              $section = $sth->fetchrow_hashref();
              $sth->finish();

              $er->{'no_id_content'} = 1 unless ( defined $section->{'id_se'} );
          }
    }


    unless ( defined $er->{'no_id_content'} ) {

              my @sqlp;              my @sql;
              my $sqlw;       my $sql;
          if ( $ps->{submit} && $ps->{submit} eq 'Add content' ) {

             $sql = '
           INSERT INTO content ( id_un,            
                                    id_se,             
                                        name_co,          
                                            heading_name_co,  
                                            keys_co,          
                                            text_co,         
                                            active_co,        
                                            hiden_co,         
                                            hiden_g_co,       
                                            close_co,         
                                            voting_co,        
                                            vo_all_co,       
                                            vo_balls_co,     
                                            vo_per,           
                                            created  ) 
              VALUES (?,
                      ?,
                      ?,
                      ?,
                      ?,
                      ?,
                      ?,
                      ?,
                      ?,
                      ?,
                      ?,
                      ?,
                      ?,
                      ?,
                      ?)
         
         ';

              push @sql,
                $c->user->{user}->{id},
                $ps->{section_child},
                $ps->{name_content},
                $ps->{name_hiden_content},
                $ps->{content_keys},
                $ps->{content_text},
                '0',
                $ps->{type_hiden_content},
                '0',
                '0',
                $ps->{type_voting_content},
                '1',
                '1',
                '1',
                time;
               
          }

          if ( $ps->{submit} && $ps->{submit} eq 'Edit content' ) {

            push @sql,
            $ps->{name_content},
            $ps->{name_hiden_content},
            $ps->{content_keys},
            $ps->{content_text},
            $ps->{type_hiden_content},
            $ps->{type_voting_content},
            time;

              if ( $c->user->{user}->{username} eq 'admin' )
                {
                
                unless ($ps->{type_content_privat} eq 'on') {
                push @sql, $ps->{section_child};                
                push @sqlp, 'id_se = ?';
                }
                
                    push @sql, 
                    $ps->{type_active_admin},
                    $ps->{type_hiden_admin},
                    $ps->{type_close_admin} ;

                    push @sqlp, 'active_co = ?',   
                               'hiden_co = ?',
                             'close_co = ?';
              }
              else {
                    push @sql,
                    $ps->{section_child}, 
                    $c->user->{user}->{id};

                    push @sqlp, 'id_se = ?';            
                    $sqlw = 'id_un = ?';
              }
              
              push @sql, $ps->{id_content};
                my $sql2    = join(',', @sqlp);    
                
              $sql = " UPDATE content 
                         SET  name_co = ?,
                              heading_name_co  = ?,  
                                        keys_co = ?,          
                                        text_co = ?, 
                                        hiden_g_co = ?,
                                        voting_co = ?,
                                        modified = ?,

                                        $sql2       

                       WHERE $sqlw                  
                         AND id_co = ?
                             ";
               }
   my $dbh = $c->model('DBI')->dbh;
                     my $sth = $dbh->prepare($sql);
       $sth->execute(@sql);
        $sth->finish();
        $lastid = $dbh->{mysql_insertid} if ($ps->{submit} eq 'Add content');
        if ($ps->{type_redirect} eq 'on') {
          $lastid = $lastid eq '' ? $ps->{id_content} : $lastid;    
                    $c->response->redirect($c->uri_for('/profile/edit_pesonal_content/'.$lastid));
            
         } else {
                            $c->response->redirect($c->uri_for('/profile/view_pesonal_content'));
        }
                return;
        } else {
            $c->stash->{no_id_content} = $er->{'no_id_content'};
            
            $c->stash->{id_content_error} = $er->{id_content_error};
                         $c->forward('/profile/edit_pesonal_content/'.$ps->{id_content});
        }
}
}



а вот как это можно:

Код


package AddressBook::Controller::Address;
use strict;
use warnings;
use base qw(Catalyst::Controller::FormBuilder Catalyst::Controller::
BindLex');
sub add : Local Form('/address/edit') {
my ($self, $c, $person_id) = @_;
$c->stash->{template} = 'address/edit.tt2';
$c->forward('edit', [undef, $person_id]);
}

sub edit : Local Form {
my ($self, $c, $address_id, $person_id) = @_;
my $address : Stashed;
if(!$address_id && $person_id){
my $person = $c->model('AddressDB::People')->
find({id => $person_id});
if(!$person){
$c->stash->{error} = 'No such person!';
$c->detach('/person/list');
}
# create the new address
$address = $c->model('AddressDB::Addresses')->
new({person => $person});

}
else {
$address = $c->model('AddressDB::Addresses')->
find({id => $address_id});
if(!$address){
$c->stash->{error} = 'No such address!';
$c->detach('/person/list');
}
}
if ($c->form->submitted && $c->form->validate){
# transfer data from form to database
$address->location($c->form->field('location'));
$address->postal ($c->form->field('postal' ));
$address->phone ($c->form->field('phone' ));
$address->email ($c->form->field('email' ));
$address->insert_or_update;
$c->stash->{message} =
($address_id > 0 ? 'Updated ' : 'Added new ').
'address for '. $address->person->name;
$c->detach('/person/list');
}
else {

if(!$address_id){
$c->stash->{message} = 'Adding a new address ';
}

else {
$c->stash->{message} = 'Updating an address ';
}
$c->stash->{message} .= ' for '. $address->person->name;
$c->form->field(name => 'location',
value => $address->location);
$c->form->field(name => 'postal',
value => $address->postal);
$c->form->field(name => 'phone',
value => $address->phone);
$c->form->field(name => 'email',
value => $address->email);
}
}
sub delete : Local {
my ($self, $c, $address_id) = @_;
my $address = $c->model('AddressDB::Addresses')->
find({id => $address_id});
if($address){
$c->stash->{message} =
'Deleted ' . $address->person->name. q{'s }.
$address->location. ' address';
$address->delete;
}
else {
$c->stash->{error} = 'No such address';
}
$c->forward('/person/list');
}
1;


первый вариант очень плохой?
PM WWW ICQ Skype GTalk Jabber   Вверх
gcc
Дата 15.3.2009, 05:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 1
Всего: 17



кто знает, кто использовал в чем разница в удобстве между Rose::DBx и DBIx::Class? я не вижу, но интересно...
PM WWW ICQ Skype GTalk Jabber   Вверх
gcc
Дата 25.3.2009, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 1
Всего: 17



хочется спросить вопрос такого плана, не много оффтопик...

правильно ли написан код в низу, не очень ли глупо он выглядит?

я не много под другому написал чем в предыдущие разы...

ORM я решил использовать в конце, то есть перевести некоторые запросы в больших модулях, в этом примере самый маленький модуль....

если выглядит плохо, то можно примеры на какой-то готовый код для примера, чтобы посмотреть, желательно тыкнуть пальцем 
(для обрабоки данных с форм я решил сделать класс другой, сейчас без него)

Код

sub edit_comment : Global {
    my ( $self, $c, @args ) = @_;

    $c->stash->{template} = 'edit_comment.tt';


if ($args[0] && $c->user_exists() == 1) {

     my $dbh = $c->model('DBI')->dbh;

    my $sth = $dbh->prepare("SELECT t1.id_cm,
                                             t1.id_co,  
                                       t1.id_se,                                       
                                       t1.id_un,
                                       t1.text_cm,
                                       t1.hiden_g_cm,
                                       t1.created,
                                       t2.name_se,
                                       t3.heading_name_co,  
                            FROM comment AS t1
                            
                            LEFT JOIN section AS t2
                            ON t1.id_se = t2.id_se
                            
                            LEFT JOIN content AS t3
                            ON t1.id_co = t3.id_co                                                 

                           WHERE t1.id_cm = ?
                           LIMIT 1

                             ");
    $sth->execute($args[0]);
    my $loop_data = $sth->fetchrow_hashref();
    $sth->finish();


        if ($loop_data) {

    
    if ($loop_data->{created} < time - 86400 
        && $loop_data->{id_un} == $c->user->{user}->{id};
        && !$c->check_user_roles('moder_co')) {
    
    $c->flash->{time_error} = 1;
    
            $c->response->redirect($c->uri_for('/edit_comment/'.$args[0]));
             return;

    } elsif ( $loop_data->{id_un} != $c->user->{user}->{id} 
        && !$c->check_user_roles('moder_co') ) {
    
    $c->flash->{error_user_comment} = 1;   

            $c->response->redirect($c->uri_for('/edit_comment/'.$args[0]));
             return;

        }

   }  elsif ( ($loop_data->{id_un} == $c->user->{user}->{id}
              && $loop_data->{created} > time - 86400)
              || $c->check_user_roles('moder_co') ) {


                while ( my ( $key, $value ) = each( %{$loop_data} ) ) {
                                                         
                      if ( $key eq 'hiden_g_co' ) {
                     $value = $value == 1 ? '1' : undef;            
                   }    
              $c->stash->{$key} = $value;            

               }    
               
             } else {

             }
             
   }    else {
   
             $c->flash->{no_edit_comment} = 1;

            $c->response->redirect($c->uri_for('/edit_comment/'.$args[0]));
             return;

             }
   
   $c->flash->{moder} = 1 $c->check_user_roles('moder_co');
   
   } else {

            $c->response->redirect($c->uri_for('/error/'));
             return;
  
   }    

}



sub edit2 : Local {
    my ( $self, $c, @args ) = @_;
    
    
    
   if ($args[0] && $c->user_exists() == 1) {
    
        if (!$c->request->params->{text_cn}) {

             $c->flash->{no_edit_comment} = 1;

            $c->response->redirect($c->uri_for('/edit_comment/'.$args[0]));
             return;
        }
        

 my $dbh = $c->model('DBI')->dbh;

    my $sth = $dbh->prepare("SELECT t1.id_cm,
                                             t1.id_co,  
                                       t1.id_se,
                                       t2.forbi_comm_co  
                            FROM comment AS t1                                             

                            LEFT JOIN content AS t2
                            ON t1.id_co = t2.id_co        
                           
                           WHERE t1.id_co = ?
                           LIMIT 1

                             ");
    $sth->execute($args[0]);
    my $loop_data = $sth->fetchrow_hashref();
    $sth->finish();


        if ($loop_data->{id_co} && $loop_data->{forbi_comm_co} != 1) {
               my $loop_data2;
               my $sql2,
               my @sql;
        
                if ($loop_data->{forbi_comm_co} == 1 && !$c->check_user_roles('moder_co') ) {
                
                $c->flash->{no_edit_comment} = 1;
                
            $c->response->redirect($c->uri_for('/edit_comment/'.$args[0]));
             return;

            
                } elsif ( $loop_data->{id_un} != $c->user->{user}->{id} 
                           && !$c->check_user_roles('moder_co') ) {
    
            $c->flash->{error_user_comment} = 1;
            
            
            $c->response->redirect($c->uri_for('/edit_comment/'.$args[0]));
             return;
    
             } elsif ($loop_data->{created} < time - 86400 
                      && $loop_data->{id_un} == $c->user->{user}->{id};
                      && !$c->check_user_roles('moder_co')) {
    
                 $c->flash->{time_error} = 1;

            $c->response->redirect($c->uri_for('/edit_comment/'.$args[0]));
             return;
                 
             }  elsif ( ($loop_data->{id_un} == $c->user->{user}->{id}
                               && $loop_data->{created} > time - 86400)
                               || $c->check_user_roles('moder_co') ) {
             
                   if ($loop_data->{type_move_admin} eq 'on'
                         && $c->check_user_roles('moder_co')) {
                    
                        if ($loop_data->{id_co}) {
                        
                           my $sth = $dbh->prepare("
                            SELECT id_co,
                                     id_se                                       
                            FROM content                          
                           WHERE t1.id_co = ?
                           LIMIT 1
                             ");
                                 $sth->execute($loop_data->{id_co});
                                 $loop_data2 = $sth->fetchrow_hashref();
                                 $sth->finish();
                                 
                                 if (!$loop_data2->{id_co}) {
                                 
                                 $c->flash->{id_co_error} = 1;

                $c->response->redirect($c->uri_for('/edit_comment/'.$args[0]));
             return;
                                 
                                 }
                                  else {
                                  
                            $sql2 = ', id_co = ?,
                                         id_se = ?,
                                             created = ?';  
                        push @sql,
                             $loop_data2->{id_co},
                             $loop_data2->{id_se},
                             time;    
                                  
                                  }
                        }                                      
                          
                        $c->request->params->{hiden_g_cm} = $c->request->params->{hiden_g_cm} eq 'on' ? '1' : '0'; 
                 
                             $sql2 .= ', hiden_g_cm = ?';                            
                               push @sql,
                              $c->request->params->{hiden_g_cm};
                   }
                
                 push, $c->request->params->{text_cn},
                        $loop_data->{id_cm};
                        
                      
                  my $sth = $dbh->prepare("
                         UPDATE comment 
                         SET     text_cm = ?
                                        $sql2      
                       WHERE id_cm = ?
                             ");
                        $sth->execute(@sql);
                                $sth->finish();

               }
            } 

        } else {
        
        $c->flash->{no_edit_comment} = 1;
        
            $c->response->redirect($c->uri_for('/errort/'));
             return;
        
        }

}





Это сообщение отредактировал(а) gcc - 25.3.2009, 17:09
PM WWW ICQ Skype GTalk Jabber   Вверх
gcc
Дата 25.4.2009, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 1
Всего: 17



использую DBIx::Abstract и DBI

http://search.cpan.org/~turnera/DBIx-Abstr...006/Abstract.pm

DBIx::Abstract сразу просит ввести данные для подключения

если я инициализирую два модуля, то будет 2 соединения к СУБД или одно?

если два, то как передать $dbh в DBIx::Abstract?


тут вот нашел модуль для переопределения модели... не понятно зачем он сделан
http://desert-island.me.uk:8888/~castaway/...ss/Storage.html

Это сообщение отредактировал(а) gcc - 25.4.2009, 15:50
PM WWW ICQ Skype GTalk Jabber   Вверх
Vaneska
Дата 25.4.2009, 22:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 141
Регистрация: 15.3.2005
Где: Москва

Репутация: 3
Всего: 4



Немного оффтопика..
gcc, позволю себе немного подправить код.
Уж больно он не красиво смотрится..
Читаемости Ваших программ на пользу пойдет. 
Цитата(gcc @  12.3.2009,  04:34 Найти цитируемый пост)

Код

sub add_section : Local {

...
    my $loop_data = $dbh->selectall_arrayref(
        " SELECT id_se, name_se 
        FROM section",
        { Slice => {} }        
    );

    $c->stash->{messages} = $loop_data;

    ...
}


В DBI много разных инетесных таких функций.
А Slice - делает из массива полей в строке хеш.
Очень удобно  smile

Добавлено через 9 минут и 27 секунд
Цитата(gcc @  25.4.2009,  10:16 Найти цитируемый пост)
если я инициализирую два модуля, то будет 2 соединения к СУБД или одно?

если два, то как передать $dbh в DBIx::Abstract?


Да. Будет 2 соединения.

А $dbh передать, похоже, просто

Код

my $dbh = DBI->connect(...);
DBIx::Abstract->connect({ dbh => $dbh });


Посмотрите исходный код метода connect модуля.
Там в начале кода видно..  smile 

Щас еще получше посмотрел.
Похоже и так можно:
Код

DBIx::Abstract->connect( DBI->connect(...) );


--------------------
http://isokolov.blogspot.com/
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1303 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.