Perl Anfänger: DBI an Package übergeben

Hi!

$dbh = DBI->connect($DSN, $USER, $PASS) || die "mist...";

wie kann ich $dbh an einer Klasse übergeben? Oder muss ich in der Klasse connect erneut aufrufen?

bei "my $test1=test->new($dbh);" erhalte ich folgende Fehlermeldung

Can't call method "prepare" on an undefined value at /x/y/z/test.pm line 46.

new sieht wie folgt aus
sub new {
  my $self=shift;
  my $dbh=shift;
  my $ref={};

bless($ref, $self);

$ref->{db}=$dbh;

$ref;
}

Danke!

  1. $dbh = DBI->connect($DSN, $USER, $PASS) || die "mist...";

    wie kann ich $dbh an einer Klasse übergeben? Oder muss ich in der Klasse connect erneut aufrufen?

    nö.

    bei "my $test1=test->new($dbh);" erhalte ich folgende Fehlermeldung

    Can't call method "prepare" on an undefined value at /x/y/z/test.pm line 46.

    Wohl kaum.

    new sieht wie folgt aus
    sub new {
      my $self=shift;
      my $dbh=shift;
      my $ref={};

    bless($ref, $self);

    $ref->{db}=$dbh;

    $ref;
    }

    Wo ist hier ein Aufruf von prepare()?

    Struppi.

    1. Hi

      bei "my $test1=test->new($dbh);" erhalte ich folgende Fehlermeldung

      Can't call method "prepare" on an undefined value at /x/y/z/test.pm line 46.

      Wohl kaum.

      wie meinst du das "wohl kaum?"
      die Meldung habe ich mir nicht aus'n Finger gezogen ;-)

      new sieht wie folgt aus
      sub new {
        my $self=shift;
        my $dbh=shift;
        my $ref={};

      bless($ref, $self);

      $ref->{db}=$dbh;

      $ref;
      }

      Wo ist hier ein Aufruf von prepare()?

      hier ist er
      sub test_1 {
        my $self=shift;
        $sth = $self->{db}->prepare('SELECT * FROM xyz;') || die "hm...";
        $return = $sth->execute() || die "nix geht...";
        $sth->finish();
      }

      Danke!

      1. Wohl kaum.

        wie meinst du das "wohl kaum?"
        die Meldung habe ich mir nicht aus'n Finger gezogen ;-)

        Die Fehlermelduhg kommt aber nicht vom den Code den du hezeigt hast.

        Wo ist hier ein Aufruf von prepare()?

        hier ist er
        sub test_1 {
          my $self=shift;
          $sth = $self->{db}->prepare('SELECT * FROM xyz;') || die "hm...";
          $return = $sth->execute() || die "nix geht...";
          $sth->finish();
        }

        Sollte funktionieren. Es muss was anders falsch sein.

        Struppi.

        1. Hi

          Sollte funktionieren. Es muss was anders falsch sein.

          wenn ich in der Methode test_1 direkt über der prepare ein
          $self->{db} = DBI->connect($dsn, $user, $password) || die "can't connect, errmsg = $DBI::errstr";
          einfüge, kommt die Fehlermeldung nicht mehr.

          sub test_1 {  
            my $self=shift;  
            my $sth;  
            $self->{db} = DBI->connect($DSN, $USER, $PASS)  || die "mist...";  
            $sth = $self->{db}->prepare('SELECT * FROM xyz;') || die "hm...";  
            $return = $sth->execute() || die "nix geht...";  
            $sth->finish();  
          }
          

          Danke!

          1. Sollte funktionieren. Es muss was anders falsch sein.

            wenn ich in der Methode test_1 direkt über der prepare ein
            $self->{db} = DBI->connect($dsn, $user, $password) || die "can't connect, errmsg = $DBI::errstr";
            einfüge, kommt die Fehlermeldung nicht mehr.

            Das ist klar, erklärt aber immer noch nicht warum du die Meldung in deinem ersten Beispiel bekommst, da es so funktionieren muss wie du es ursprünglich geplant hast.

            Struppi.

            1. Sollte funktionieren. Es muss was anders falsch sein.

              wenn ich in der Methode test_1 direkt über der prepare ein
              $self->{db} = DBI->connect($dsn, $user, $password) || die "can't connect, errmsg = $DBI::errstr";
              einfüge, kommt die Fehlermeldung nicht mehr.

              Das ist klar, erklärt aber immer noch nicht warum du die Meldung in deinem ersten Beispiel bekommst, da es so funktionieren muss wie du es ursprünglich geplant hast.

              Can't use string ("abc") as a HASH ref while "strict refs" in use at /x/y/z/abc.pm line 12.

              01 package pdadminSession;
              02
              03 use DBI;
              04 use strict;
              05
              06 sub new {
              07  my $self=shift;
              08  my $dbh=shift;
              09  my $ref={};
              10  $ref->{sessionLength}=48;
              11  bless($ref, $self);
              12  $self->{dbh}=$dbh;
              13  $ref;
              14 }

              Kannst du mir einen Tipp geben?

              Danke!

              1. 11  bless($ref, $self);
                12  $self->{dbh}=$dbh;

                $ref ist dein Objekt, nicht self.

                Struppi.

                1. 11  bless($ref, $self);
                  12  $self->{dbh}=$dbh;

                  $ref ist dein Objekt, nicht self.

                  ok

                  wenn ich es so mache

                  01 package abc;
                  02
                  03 use DBI;
                  04 use strict;
                  05
                  06 sub new {
                  07  my $self=shift;
                  08  my $dbh=shift;
                  09  my $ref={};
                  10  $ref->{sessionLength}=48;
                  11  $ref->{dbh}=$dbh;
                  12  bless($ref, $self);
                  13  $ref;
                  14 }

                  52  $sth = $self->{db}->prepare('SELECT * FROM sessions') || die "cannot prepare query, errmsg = $DBI::errstr";

                  mit use strict;

                  Can't use string ("abc") as a HASH ref while "strict refs" in use at /x/y/z/abc.pm line 52.

                  ohne use strict;

                  Can't call method "prepare" on an undefined value at /x/y/z/abc.pm line 52.

                  Danke

                  1. 06 sub new {
                    07  my $self=shift;
                    08  my $dbh=shift;
                    09  my $ref={};
                    10  $ref->{sessionLength}=48;
                    11  $ref->{dbh}=$dbh;
                    12  bless($ref, $self);
                    13  $ref;
                    14 }

                    Das geht auch einfacher:

                    sub new {  
                     my $proto = shift;  
                     return bless {  
                     dbh => (shift || die "bla"),  
                     sessionLength => 48  
                     }, ref $proto || $proto ;  
                    }  
                    
                    

                    Das ref ist wichtig, falls das Objekt mal weiter vererbt werden sollte

                    mit use strict;

                    Can't use string ("abc") as a HASH ref while "strict refs" in use at /x/y/z/abc.pm line 52.

                    Du machst irgendwas falsch bei dem Aufruf, was steht in Zeile 52?

                    Struppi.

                    1. 06 sub new {
                      07  my $self=shift;
                      08  my $dbh=shift;
                      09  my $ref={};
                      10  $ref->{sessionLength}=48;
                      11  $ref->{dbh}=$dbh;
                      12  bless($ref, $self);
                      13  $ref;
                      14 }

                      Das geht auch einfacher:

                      sub new {

                      my $proto = shift;
                      return bless {
                      dbh => (shift || die "bla"),
                      sessionLength => 48
                      }, ref $proto || $proto ;
                      }

                      
                      >   
                      > Das ref ist wichtig, falls das Objekt mal weiter vererbt werden sollte  
                        
                      damit erhalte ich aber die selbe Fehlermeldung :-\  
                        
                        
                      
                      > > mit use strict;  
                      > > > Can't use string ("abc") as a HASH ref while "strict refs" in use at /x/y/z/abc.pm line 52.  
                      >   
                      > Du machst irgendwas falsch bei dem Aufruf, was steht in Zeile 52?  
                        
                      52  $sth = $self->{db}->prepare('SELECT \* FROM sessions') || die "cannot prepare query, errmsg = $DBI::errstr";  
                        
                      Danke!
                      
                      1. Das ref ist wichtig, falls das Objekt mal weiter vererbt werden sollte

                        damit erhalte ich aber die selbe Fehlermeldung :-\

                        Was meine Aussage unten bestätigt.

                        mit use strict;

                        Can't use string ("abc") as a HASH ref while "strict refs" in use at /x/y/z/abc.pm line 52.

                        Du machst irgendwas falsch bei dem Aufruf, was steht in Zeile 52?

                        52  $sth = $self->{db}->prepare('SELECT * FROM sessions') || die "cannot prepare query, errmsg = $DBI::errstr";

                        $self ist nicht das was du denkst, was ist es ist Wissen wir nicht.

                        Struppi.

                        1. Hi

                          ich hab es in etwa so

                          #abc.pm  
                          sub new {  
                            my $self = shift;  
                            return bless {  
                              dbh => (shift || die "bla"),  
                              sessionLength => 48  
                            }, ref $self || $self;  
                          }  
                            
                          sub update {  
                            my $self=shift;  
                            my $sth;  
                            $sth = $self->{db}->prepare('SELECT * FROM abc') || die "cannot prepare query, errmsg = $DBI::errstr"; # <--- Zeile 52  
                            $sth->execute() || die "cannot execute query, errmsg = $DBI::errstr";  
                            $sth->finish();  
                          }  
                            
                          # folgender Code ist in einer anderen Datei  
                          use CGI::Carp qw(fatalsToBrowser);  
                          use CGI ':standard';  
                          use DBI;  
                          use strict;  
                          use abc;  
                          ...  
                          $dbh = DBI->connect($DSN, $USER, $PASS) || die "can't connect, errmsg = $DBI::errstr";  
                          my $xyz=abc->new($dbh);  
                          $xyz->update()  
                          # in dieser Datei kann ich auf $dbh zugreifen
                          

                          Danke!

                          1. Hi

                            soweit läuft es jetzt! :-)

                            eine Frage hätte ich aber noch

                            rufe ich die Methode update auf, kommt keine Fehlermeldung
                            rufe ich die Methode check auf, kommt es wieder zu dieser prepare Fehlermeldung :-(

                            sub check {
                              my $self=shift;
                              return (&update() == 0) ? 0 : 1;
                            }

                            ich denke mal, dass beim Aufruf von update das Problem liegt

                            Danke!

                            1. sub check {
                                my $self=shift;
                                return (&update() == 0) ? 0 : 1;
                              }

                              Der erste Parameter von update ist das Objekt, wo übergibst du es hier?

                              return ($self->update() == 0) ? 0 : 1;

                              Struppi.

                              1. Hi

                                Der erste Parameter von update ist das Objekt, wo übergibst du es hier?

                                return ($self->update() == 0) ? 0 : 1;

                                danke, daran lagt es :-)