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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ViSession, управление сессиями 
:(
    Опции темы
Vaneska
Дата 16.6.2005, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Наконец-то свершилось! Я доделал свой модуль управления сессиями.
Реализовал работу через kookies и без них (sid передается через параметры).
Имеется возможность подключать систему к ЛЮБЫМ хранилищам информации, но пока есть интерфейс только для MySQL. Скоро напишу и для DBM.
Вот ссылка:
http://vaneska.shatt.ru/download/visession.zip
Кто не поленится разобраться в моем коде, тестируйте.
Все найденные глюки, ошибки, корявости синтаксиса и т.д. и т.п. пишите сюда.
Буду очень благодарен.

В архиве есть 2 папки visession - тестовые программки, lib - сами модули.

Модуль ViSession.pm - движок системы.
Модуль ViMySQL.pm - интерфейс доступа к бызе MySQL.
файл db.sql содержит sql-скрипт используемых таблиц.

файл test_visession.cgi тестирует систему ( тестирует только режим с kookies)
файл test_vimysql.cgi тестирует модуль ViMySQL.pm
( на корявость тестировочных программ не обращайте особого внимания)

хелпа пока нет, но по тестировочным программам в принципе ясно как работает система.
--------------------
http://isokolov.blogspot.com/
PM MAIL ICQ   Вверх
korob2001
Дата 16.6.2005, 21:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

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



Vaneska - отлично.

Оптимизировать будем??? smile


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Vaneska
Дата 17.6.2005, 09:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Будем.

Вопрос 1.

Вот конструкнор:
Код

sub new {
  my $self = shift;
  my $type = ref($self) || $self;
    my %arg=@_;
  my $obj={ 
              local_time => defined $arg{'local_time'} ? $arg{'local_time'} : '+4',
              life_time => defined $arg{'life_time'} ? $arg{'life_time'} : 15,
              cookie => defined $arg{'cookie'} ? $arg{'cookie'} : 0,
                        cookie_name => defined($arg{'cookie_name'}) ? $arg{'cookie_name'} : 'mysession',
                        sep => defined $arg{'sep'} ? $arg{'sep'} : ':',
                                                
                    funcs => 0 
                };
                    
    return bless($obj, $type);
}


хорошо ли так
Код

life_time => defined $arg{'life_time'} ? $arg{'life_time'} : 15,

заполнять параметры?

Вопрос 2.

Приемлема ли такая работа с кукисами?
Код

my $c = new CGI::Cookie(-name => $self->{'cookie_name'},
                     -value => $uid . $self->{'sep'} . $new_id, 
                    -expires => '+'.$self->{'life_time'}.'m' );

Или лучше написать свою функцию, специально оптимизированную для этого модуля?
--------------------
http://isokolov.blogspot.com/
PM MAIL ICQ   Вверх
korob2001
Дата 17.6.2005, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

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



Давай сначала и по порядку. Сначала разберёмся с конструктором:
Код

sub new {
  my $self = shift;
  my $type = ref($self) || $self;
        my %arg = @_;

  my $obj = { db_name => defined $arg{'db_name'} ? $arg{'db_name'} : 'db',
              db_host => defined $arg{'db_host'} ? $arg{'db_host'} : 'localhost',
              db_login => defined $arg{'db_login'} ? $arg{'db_login'} : 'login',
              db_pass => defined $arg{'db_pass'} ? $arg{'db_pass'} : 'password',
              db_port => defined $arg{'db_port'} ? $arg{'db_port'} : 3306,
                                             tbl_users => defined $arg{'tbl_users'} ? $arg{'tbl_users'} :
                                                                                           { 'table' => 'users',
                                                                                              'uid' => 'uid',
                                                                                                                                                                                                                                             'user' => 'user',
                                                                                                                                                                                                                                             'pass' => 'pass'
                                                                                           },
                                            tbl_sessions        => defined $arg{'tbl_sessions'} ? $arg{'tbl_sessions'} :
                                                                                              { 'table' => 'sessions',
                                                                                                'sid' => 'sid',
                                                                                                                                                                                                                                                'uid' => 'uid',
                                                                                                                                                                                                                                                'id' => 'id',
                                                                                                                                                                                                                                                                        'time' => 'time'
                                                                                              },
                                            dbh => ''
        };

        # подключение к базе данных
  $obj->{'dbh'}=DBI->connect("DBI:mysql:".$obj->{'db_name'}.":".$obj->{'db_host'}.":".$obj->{'db_port'},
                                    $obj->{'db_login'}, $obj->{'db_pass'});

        unless ($obj->{'dbh'}) { return undef; } # если db не подключена, обьект не создавать
        else { return bless($obj, $type); }
}

Тебя интересует именно, определён ли параметр или же тебя интересует его истеннось? Другими словами если будет передана пустая строка вот этому параметру: db_host, тебя это устроит или нет???


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Vaneska
Дата 17.6.2005, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



скорее всего интересует, определен ли пораметр или нет. Если пользователю надо параметр изменить, он явно не будет вписывать пустой параметр. А если всетаки будет пустой, ошибка всплывет при подключении к базе.

Задача здесь стоит в установке значения по умолчанию. Если пользователя это значение устраивает (db_host, db_port), он просто не пишет параметр, когда создает обьект.
--------------------
http://isokolov.blogspot.com/
PM MAIL ICQ   Вверх
korob2001
Дата 17.6.2005, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

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



Вобщем ладно, попробуй заюзать такой конструктор, вместо того, который мы начали разбирать выше.
Код

sub new {
    my $check = shift;
    my $class = ref( $check ) || $check;
    my $self  = { db_name      => 'db',
                  db_host      => 'localhost',
                  db_login     => 'login',
                  db_pass      => 'password',
                  db_port      => 3306,
                  tbl_user     => { table => 'users',
                                    uid   => 'uid',
                                    user  => 'user',
                                    pass  => 'pass' },
                  tbl_sessions => { table => 'sessions',
                                    sid   => 'sid',
                                    uid   => 'uid',
                                    id    => 'id',
                                    time  => 'time' },
                  dbh          => '', @_ };
    $self->{'dbh'} = DBI->connect("DBI:mysql:".$self->{'db_name'}.":".$self->{'db_host'}.":".$self->{'db_port'},
                                    $self->{'db_login'}, $self->{'db_pass'});
    return $self->{ dbh } ? bless( $self, $class ) : undef;
}

Если что-то будет не понятно, пиши.

Удачи.

Это сообщение отредактировал(а) korob2001 - 17.6.2005, 20:40


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Vaneska
Дата 18.6.2005, 07:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Великий и могучий Перл!!
получилось все гораздо компактней! smile
спасибо.

А теперь с вопросом №2.
Я думаю сделать так: написать свою специализированную функцию для обработки cookies,
но стоит и это делать? Есть еще модуль CGI::Simple::Cookie. Может лучше его использовать. Он вроде покомпактней и по оптимизированней?
--------------------
http://isokolov.blogspot.com/
PM MAIL ICQ   Вверх
korob2001
Дата 18.6.2005, 08:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

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



А почему не CGI???


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Vaneska
Дата 18.6.2005, 09:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Задача стоит сделать все помаксимуму компактно, удобно, чтобы быстро работало.
Зачем подключать целиком CGI, когда можно обойтись тем же CGI::Cookie?

З.Ы. в кукисах, в параметре expires надо в дате часовой пояс менять ( +4 GMT ) или браузер сам разберется в каком часовом поясе ему дату получать?

Это сообщение отредактировал(а) Vaneska - 18.6.2005, 09:43
--------------------
http://isokolov.blogspot.com/
PM MAIL ICQ   Вверх
korob2001
Дата 18.6.2005, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

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



Vaneska - а зачем же весь модуль подключать? Подключи только то, что тебе нужно.
Код

use CGI qw( :cookie );

Подключишь только функцию cookie.
Удачи.


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Vaneska
Дата 20.6.2005, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Тоже вариант, попробую.

Далее:
у меня в классе ViMySQL есть параметр tbl_users,
а в классе ViSession есть параметр funcs, сожержащий обьект класса ViMySQL
Код

tbl_users     => { 
             'table'  => 'users',
             'uid'    => 'uid',
             'user'   => 'user',
             'pass'   => 'pass'                                                                                                                                                    
            },

Следуя правилам ООП, доступ например к параметру uid из программы
должен выглядеть так:
Код

# $ses - обьект класса ViSession
$ses->funcs->tbl_users->uid

Я добился, что бы работала такая конструкция
Код

$ses->funcs->tbl_users->{'uid'}

# Visession
sub funcs {
  my $self = shift;
  return $self->{'funcs'};
}
# ViMySQL
sub tbl_users { 
  my $self = shift;
    return $self->{'tbl_users'}; 
}

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


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

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


 




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


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

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