Добрый день.
есть самописный скрипт фотогаллереи работающий с 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.