Просмотр сообщений

В этом разделе можно просмотреть все сообщения, сделанные этим пользователем.


Сообщения - pirojok

Страницы: [1]
1
Добрый день.

есть самописный скрипт фотогаллереи работающий с MySQL.

Он имеет следующию структуру:

главный файл
                       модули

В отдельные файлы, модули вынесены подпрограммы работы с БД, с сессиями, загрузка файлов и т.д.
Насколько мне извесно при работе с БД, очень много времени тратиться на установку соединения.

my $dbh 
DBI->connect($dsn$db_user_name$db_password)|| die "Error while conecting to DB: $DBI::errstr()";


Вопрос в следующем:
в большинстве подключаемых модулей я соединяюсь с БД. Я попробовал использовать соединение которое осуществляеться в главном файле для всех модулей.
Сделал я это  следующим образом:
В модуле создал ссылку на $dbh
[/phpl]
$dbh_ref=\\$dbh
[/code]

а главном файле сделал вот так


my $dsn 
= \'DBI:mysql:xxxxxxxxxxx.ru\';
my $dbh = DBI->connect($dsn, $db_user_name, $db_password)|| die "Error while conecting to DB: $DBI::errstr()";
$$dbh_ref=$dbh;



В модуле который работает с сессиями это походу не прокатывает(выдаёт ошибку). В остальном прекрасно работает.
[code=perl]
Can\'t connect to data source , no database driver specified and DBI_DSN env var not set at /usr/local/lib/perl5/site_perl/5.8.8/CGI/Session/Driver/DBI.pm line 23
[/php]

Вот пример как всу устроено в модуле сессий:

package security
#Íàçâàíèå ïàêåòà è êëàññà

########################################################
#Êëàññ
########################################################

use Exporter;
@
ISA=(\'Exporter\');
@EXPORT=qw(&ses $dbh_ref);
use CGI::Session;
#use DBI;
use CGI qw(:all);
use CGI::Carp qw(fatalsToBrowser);
use expiresessions;
use error_log;
########################################################
$CGI::Session::MySQL::TABLE_NAME = \'kr_sessions\';
my $cgi = new CGI;
$dbh_ref=\\$dbh;


my $sql="SELECT * FROM kr_users WHERE id=$user_id";
                  my $sql_request=$dbh->prepare(qq[$sql]);
                  $sql_request->execute || error_log("Error while to execute the SQL comand <b>$sql</b>: $DBI::errstr()");
                  %OUT=%{$sql_request->fetchrow_hashref};


В чём может быть причина ошибки? вообще так можно делать?

И ещё вопрос если в главном файле подключены модули типо:
#!/usr/bin/perl
use CGI qw(:all);
use CGI::Carp qw(fatalsToBrowser);
use File::Path;
use DBI;
use Time::HiRes qw(time);

Надо ли эти же модули поключать в своих(самописных)?
В примере предоставленном выше, строка use DBI закоментирована, но модуль всё равно хорошо работает с Mysql.

2
Perl / CGI::Session и удаление старых сессий
« : 21 Октября 2007, 00:46:46 »
Всем спасибо, нашёл решение.

Оказываеться существует модуль CGI::Session::ExpireSessions, который как раз и создан для удаления просроченых сессий.
Лежит он тут

Если кому то интересно, то реализация следующая:

Т.к. я не админ сервера, где я тестирую скрипт, то установить этот модуль(а он не стандартный) на сервер я не могу. Поступил общеизвестным способом. А именно файл модуля положил в папку с основным скриптом.

#В теле основного скрипта подключил его:
use expiresessions

#Далее соединяемся с БД:
my $db_user_name = \'имя_пользователя\';
my $db_password = \'пароль\';
my $dsn = \'DBI:mysql:имя_БД:хост\';
my $dbh = DBI->connect($dsn, $db_user_name, $db_password)|| die "Error while conecting to DB: $DBI::errstr()";

#А далее всего одной строкой избавляемся от мёртвых сессий.
CGI::Session::ExpireSessions -> new(dbh => $dbh, verbose => 0) -> expire_db_sessions(delta=>1, table_name=>\'kr_sessions\');

#Где:
#dbh => $dbh дискриптор соединения с БД
#delta=>1 критерий удаления, на сколько просрочена сессия в секундах.
#table_name=>\'kr_sessions\' имя таблицы, если оно отлично от \'sessions\'


Ну вот вроде бы и всё. Если есть вопросы, коментарии пишите.

ПС интересно почему предедущий код не работает?

3
Perl / CGI::Session и удаление старых сессий
« : 20 Октября 2007, 19:58:18 »
Изучая perl столкнулся со следующей проблемой:

На сайте используется метод аутентификации пользователя через сессии, используя модуль CGI::Session и MySQL . Всё бы ничего, всё даже работает, но не получаетьсяя удалять старые(истекшие) сессии.

В мануале к модулю есть довольно простой примерчик для данной операции, но он не работает.
CGI::Session->find(\\&purge);
                  
sub purge {
                  
my ($session) = @_;
                  die 
$session;
                  
next if $session->is_empty;    # <-- already expired?!
                  
if ( ($session->ctime 60) <= time() ) {
                  
$session->delete() or warn "couldn\'t remove " $session->id ": " $session->errstr;
                  }
                  }


Проблема в том, что программа не заходит в подпрограмму &purge.

С чем это может быть связано?

4
Perl / Про блокировку...
« : 22 Февраля 2006, 15:30:36 »
Подскажи как это можно проверить????

5
Perl / NET::FTP и upload
« : 09 Декабря 2005, 16:25:20 »
Как раз фишка в том, что бы преодалеть ограничение в 500 кб!
Блин наверное я всё таки не правильно объясняю...простите:(

Мне нужно что бы пользователь через форму на сайте мог загрузить больше чем 500 кб...для этого я и решил использовать модуль NET::FTP, вот только не получается:(
arto ftp на хостинге разрешён, через него всё и делается...т.е. заливаются скрипты, картинки и т.д.

6
Perl / NET::FTP и upload
« : 09 Декабря 2005, 14:01:22 »
AnnA :)
Ты меня скорее всего не поняла...
Задача стоит следующая:
т.к. сайт мой находится на бесплатном хостинге фатал, там существует ограничение на объём данных передаваемые методом post и составляет он порядка 500 кб.Тот скрипт на который ты мне дала ссылку, как раз и передаёт данные методом post/get, у меня сейчас впринцыпе так и реализован аплод.
Вот я и решил, нельзя ли закачивать файлы на сервер используя протокол FTP и соответственно модуль NET::FTP.
И меня интересует можно ли это сделать?

ЗЫ:Зарание спасибо!

7
Perl / NET::FTP и upload
« : 09 Декабря 2005, 03:11:41 »
Впринцыпе так и сделал!Спасибо.
#!/usr/bin/perl
use CGI qw(:all);
use CGI::Carp qw(fatalsToBrowser);
use Net::FTP;    
my $filename=param(filename);
#$filename=\'E:/WEB/shttps/www/1.doc\';
$ftp = Net::FTP->new("fatal.ru") or die "Can\'t connect: $@\\n";
$ftp->login(\'xxx\', \'xxx\') or die "Couldn\'t login\\n";
#$ftp->cwd(/site/) or die "Couldn\'t change directory\\n";
$ftp->binary();  
$ftp->put($filename) or die "Couldn\'t put $filename\\n";
print header;
print $filename;
exit;

Ситуация следующая, с моего компа я запускаю этот скрипт он заливает файл на фатал без проблем...
Но вот когда запускаю скрипт на фатале и пытаюсь со своего компьютера загрузить файл на фатал через этот скрипт пишет Bad file descriptor.
В чём дело?

8
Perl / NET::FTP и upload
« : 08 Декабря 2005, 02:59:06 »
Хочу организовать upload файлов на сервер через NET::FTP, только не пойму как заставить его заливать файлы...
А делаю собствено вот так:

Код:   
#!/usr/bin/perl
use CGI qw(:all);
use CGI::Carp qw(fatalsToBrowser);
use Net::FTP;
$ftp = Net::FTP->new("fatal.ru") or die "Can\'t connect: $@\\n";
$ftp->login(\'пароль\', \'логин\') or die "Couldn\'t login\\n";
$ftp->cwd(/site) or die "Couldn\'t change directory\\n";
$ftp->put(param(filename) or die "Couldn\'t put $filename\\n";
print header;
print \'good!\';
exit;   


$ftp->put(param(filename) or die "Couldn\'t put $filename\\n"; в этой строчке на протык, выдаёт ошибку Couldn\'t put!!!
Подскажите как правильно..., и какие тут есть подводные камни?

9
А вот так работает!!!:))))
#!/usr/bin/perl
use CGI;
$query = new CGI;
# Код для формы
print $query->header;
print $query->start_multipart_form(-method=>\'post\', -action=>\'upl.pl\');
print $query->filefield(-name=>\'uploaded_file\');
print $query->submit(\'button_name\',\'value\');

if ($query->param(\'uploaded_file\') ne \'\'){&insert_image;}
sub insert_image
{
print "Сработало!!!";
$filename = $query->param(\'uploaded_file\');
@fname = split(/\\\\/,$filename);
$kk = @fname;
$filename = $fname[$kk-1];
chomp($filename);
#$filename=~s/\\w+//;
#$filename=~s/([^\\/\\\\]+)$//;
#$filename=$1;
#$foto = $query->upload($filename);
$foto = $query->upload(\'uploaded_file\');
open (F,">1/$filename") || die "Ошибка при открытии $filename";
 binmode F;                              # включить binmode для Windows
 print F while (<$foto>);                # и скопировать данные в файл
 close F;
 print $filename;
}

10
#!/usr/bin/perl
use CGI;
$query = new CGI;
# Код для формы
print $query->header;
print $query->start_multipart_form(-method=>\'get\', -action=>\'upl.pl\');
print $query->filefield(-name=>\'uploaded_file\');
print $query->submit(\'button_name\',\'value\');

if ($query->param(\'uploaded_file\') ne \'\'){&insert_image;}
sub insert_image
{
print "Сработало!!!";
$filename = $query->param(\'uploaded_file\');
@fname = split(/\\\\/,$filename);
$kk = @fname;
$filename = $fname[$kk-1];
chop($filename);
$fh = $query->upload(\'uploaded_file\');
open (F,">$filename") || die "Ошибка при открытии $filename";
binmode(F);
while (<$fh>)
{
print F $_;
}
close(F);
}

11
alex007
я пользую small http server для проверки на своём компе!!!!
может дело в нём?
а так вроде ssi пашет, покрайней мере этот же фаил из папки где html лежат без проблем выводит в html файл !!!!

12
хочу при помощи SSI() вывести содержимое файла news.db из папки cgi-bin в html файл ,но не получаеться из-за того что сервер интерпритирует файл  как скрипт!!!
Подскажите как выполнить задуманное???Пожалуйста!!!

Страницы: [1]