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

Поиск:

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


Шустрый
*


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

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



я пишу небольшой портал по работе с нашей базой.

Написал два простых скрипта, которые из базы данные высасывают по запросу и выводят на страницу.

работает отлично, но плодить скрипты с идентичным кодом неправильно. Поэтому решил сделать классы:


Обновил. Это рабочий код:

файл dbOra.pm отвечает за подключение к базе.
Код

#!/usr/bin/perl -w

package dbOra;

use lib qw(.);

use strict;
use DBI;
use DBD::Oracle;

use dbRs;
use oraDBData;

sub new {
  my $proto = shift;                 #       
  my $class = ref($proto) || $proto; #  ,      
  my $self  = {
    dbh=>undef
  };
  
  bless($self, $class);              #    bless
  return $self;
}

sub query{
    
    my $self = shift;
    my $sql=shift;
    
    if ($self->{dbh}){
    my $sth=dbRs->new($self->{dbh});    
    return $sth->askQuery($sql);
    }    
}


sub DESTROY {
  my $self = shift;
  $self->{dbh}->disconnect;
}

sub conn{
  my $self = shift;
    my $servName=shift;
    my $srv=$oraDBData::oradata->{$servName};

    if ($srv){
     $self->{dbh} = DBI->connect("dbi:Oracle:host=$srv->{oracle_server};port=$srv->{oracle_port};sid=$srv->{oracle_sid}",
                                                $srv->{oracle_user}, $srv->{oracle_password},{ora_charset => $srv->{oracle_charset}}
                                )or die "Error connecting to database : " . DBI->errstr;
    }
}

1;




файл dbRs.pm отвечает за выполнение запроса. 
Код

#!/usr/bin/perl -w

package dbRs;

use lib qw(.);
use strict;
use DBI;
use DBD::Oracle;



sub new {
  my $proto = shift;                 
  my $class = ref($proto) || $proto; 
  my $self  = {
    NAME    => undef,
    VERSION => undef,
    OPTIONS => [],
    sth=>undef,
    dbh=> shift,
    }; 
  bless($self, $class);              
  return $self;
}

sub execQuery{
    my $self = shift;    
    
    my ($query,@params)=shift;
    
    $self->{sth} = $self->{dbh}->prepare($query)      or die ": " . $self->{dbh}->errstr;
      my $i=1;
    foreach(@params){
        $self->{sth}->bind_param($i, $_);
        $i++;
    }

    $self->{sth}->execute()
      or die "Impossible d'ex&?cuter la requette: " . $self->{sth}->errstr;
    
    
}

sub askQuery{
    my $self = shift;    
    $self->execQuery(@_);

    my @retTable;
    while(my @data = $self->{sth}->fetchrow_array())
    {
        push @retTable,\@data;# 
    }
    
    if ($self->{sth}->rows == 0)
    {
        print "Empty";        
    }

    return \@retTable;
    
}

sub DESTROY {
   my $self = shift;
  $self->{sth}->finish;

}

1;


oraDBData.pm
Код

#!/usr/bin/perl -w

package oraDBData;

$oradata={
        dbprofile =>{
                oracle_server=>"srvOra",
                oracle_sid=>"ora",
                oracle_port=>"1521",
                oracle_user=>"user",
                oracle_password=>"pass",
                oracle_charset => 'CL8MSWIN1251'#'UTF8';
        }
};

1;



и скрипт, который будет всё это пользовать - test.pl 
Код

#!/usr/bin/perl -w

use CGI::WebOut;
use JSON;
use lib qw(.); 

use dbora;

my $sql=dbOra->new();

$sql->conn('dbprofile');

print to_json($sql->query('select * from table '));


Первая ошибка выдаётся что не может dbora найти. хотя они все в одной директории. и тестовые проекты лежащие там же работали...

Ну и вообще, может какие явные косяки?

Это сообщение отредактировал(а) dmitryk1 - 25.9.2008, 12:49
PM MAIL GTalk Jabber   Вверх
Bulat
Дата 24.9.2008, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

Репутация: 5
Всего: 57



Цитата(dmitryk1 @  24.9.2008,  12:02 Найти цитируемый пост)
Первая ошибка выдаётся что не может dbora найти. 


Внимательно проверь имя файла, как самого файла, так и в коде, возможно у тебя где-то очепятка, не тот символ smile



--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
ginnie
Дата 24.9.2008, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



Уважаемый dmitryk1, основная проблема в Вашем коде в том, что

Код

$self->sth


и

Код

$srv->oracle_user


это не обращения к ключам хэша, а вызов функций (методов, применительно к классу) sth() и oracle_user()

обращение к хешу будет 

Код

$self->{sth}


Кроме этого мне не нравится:

Код

use lib qw(.); /etc/perl /usr/local/lib/perl/5.8.8 /usr/local/share/perl/5.8.8 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.8 /usr/share/perl/5.8 /usr/local/lib/site_perl);


тут явная синтаксическая ошибка, кроме того путь к библиотеке нужно задавать не в описании классов, лучше всего это делать в конфигурационном файле web-сервера.

Код

my $self  = {};
$self->{NAME}    = undef;
$self->{VERSION} = undef;
$self->{OPTIONS} = [];
$self->{sth}=undef;
self->{DBH}= shift;


обычно записывают как
Код

my $self  = {
    NAME => undef,
    VERSION => undef,
    OPTIONS => [],
    sth => undef,
    DBH => shift,
};


Код

execQuery($self,@_);


обычно записывают как

Код

$self->execQuery(@_);



Код

while(@params){
    $self->sth->bind_param($i, $params[$i]);
    $i++;
}


это бесконечный цикл

Это сообщение отредактировал(а) ginnie - 24.9.2008, 13:47


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
dmitryk1
Дата 25.9.2008, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Спасибо огромное за ответы!

С ошибкой dbora разобрался, оказывается если в подключаемом файле явная синтаксическая ошибка, то интерпретатор ругается именно на то, что не может найти файл.


Ну а всё остальное исправил и почистил. 

Возникают ещё ошибки. но пока справлялся с гуглем и тестами. Так что надеюсь скоро завести эту конструкцию в опытную эксплуатацию.

Ещё раз спасибо!
PM MAIL GTalk Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


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

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


 




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


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

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