Forum Webscript.Ru
Программирование => Perl => Тема начата: pirojok от 15 Ноября 2007, 22:29:01
-
Добрый день.
есть самописный скрипт фотогаллереи работающий с 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 $sql: $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.
-
все проще, ты один раз подключаешся
$dbh = DBI->connect("DBI:mysql:urp_baza;localhost",
а дальше просто без лишних движений выбираешь то что нужно
$ary_ref = $dbh->selectall_arrayref("SELECT data, time.
после чего (ли до того) можно подключать твои подпрограмы (модули) и тожен не парясь делать что угодно, например так:
$dbh->do("insert, update и delete....
еще что то делаем скриптом и опять что то
$count = $dbh->selectrow_array("SELECT COUNT(*)...
и так до бесконечности
самое главное незаюбывать о
$sth->finish;
и о очистке масивов
@row=();