Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Как передать переменную коннекта к БД в класс?


Автор: Chuck 24.7.2008, 15:20
Добрый день, пожалуйста, подскажите, как правильно передать в класс и пользоваться переменной коннекта?

Есть переменная коннекта
Код

my $dbc = DBI->connect("DBI:mysql:test:localhost:3306", 'root', '');
my $Sections = Sections->new(\$dbc);
$Sections->get_sections(); # добавлено


Есть класс:
Код

package Sections;

sub new {
    my $class = shift;
    my $self = {};
    $self{dbc} = shift;
    bless($self, $class);
    return $self;
}

sub get_sections {
    my $self = shift;
    my $res = $self{dbc}->prepare('SELECT * FROM sections');
    $res->execute();
    while (@section = $res->fetchrow_array()) {
        print $section[0];
    }
}
1;


Но ничего не выводится...

Автор: shamber 24.7.2008, 16:12
Во первых в "коде" вы не вызваете get_sections smile

А во вторых Вы передаете ссылку на объект, а пытаетесь использовать сам объект

перепишите так
Код

 my $res = ${$self{dbc}}->prepare('SELECT * FROM sections');

Автор: Chuck 24.7.2008, 19:28
Ок, действительно, я забыл, что это ссылка. По поводу get_sections, я просто забыл его привести в примере тут.

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

Can't call method "prepare" on unblessed reference at Sections.pm line 13.


По правде сказать, в ООП для perl-а я не силен и не совсем понимаю назначение функции bless, а тем более такого рода сообщения.

И самое главное - правильный ли я пусть избрал для передачи переменных (ссылок) в объект?

Автор: arto 24.7.2008, 20:45
попробуйте добавить use strict; в начало.

Автор: Chuck 25.7.2008, 07:41
Ура, после долгих экспериментов до меня наконец дошло, как нужно работать с ссылками на объекты и с классами.

Выкладываю код:
Код

package Sections;

use strict;
sub new {
    my $class = shift;
    my $self = bless { dbc => ${@_[0]} }, $class;
    return $self;
}

sub get_sections {
    my $self = shift;
    my $res = ${$self}{dbc}->prepare('SELECT * FROM sections');
    $res->execute();
    while (my @section = $res->fetchrow_array()) {
        foreach my $value (@section) {
            print $value . '<br />';
        }
    }
}
1;


Отдельное спасибо shamber и arto.

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

Автор: KSURi 25.7.2008, 12:16
кстати можно было не эксперементировать, а почитать документацию:
http://theoryx5.uwinnipeg.ca/CPAN/perl/pod/perlref.html
http://theoryx5.uwinnipeg.ca/CPAN/perl/pod/perlboot.html

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)