Hey Eric --

> I wanted the DBH to be global since just about every sub in Holds does a
> query of some sort. I guess it doesn't matter either way if I do
> the connect
> in the new() vs  up top outside of a sub.

CGI::Application has a facility which is intended to solve exactly this type
of problem -- the param() method.  The param() method allows you to stash a
property (such as a $dbh) in your CGI::Application-based object which can be
retrieved anywhere.  I typically connect to the database in my setup()
method and stash my $dbh for use later:

  package My::WebApp;
  use strict;
  use base qw/CGI::Application/;

  sub setup {
    my $self = shift;

    $self->start_mode('start');
    $self->run_modes(
      'start' => 'run_mode_method'
    );

    my $dbh = $self->connect_to_database();
    $self->param('DBH', $dbh);
  }

  sub run_mode_method {
    my $self = shift;

    # Get database handle
    my $dbh = $self->param('DBH');

    my $output = '';

    # ...etc....

    return $output;
  }


Furthermore, in order to disconnect, the teardown() method may be used:

  sub teardown {
    my $self = shift;

    # Get database handle
    my $dbh = $self->param('DBH');

    $dbh->disconnect();
  }


Refer to the CGI::Application POD for details on teardown() and param().


Regarding connecting to the database, I also urge you to encapsulate your
connection code.  On my projects I always get things started by creating a
Perl module which I use whenever I need a database connection:

  package My::DatabaseCreds;
  use DBI;
  sub new_dbh {
    my $dbh = DBI->connect(....)
    die ("Can't connect: ".$DBI::errstr) unless ($dbh);
    return $dbh;
  }

(This isn't exactly the code I use -- I actually have a module which I
sub-class, but you get the idea.)

The benefit of creating a module is that (1) all your Perl code can use this
module so that (2) should it ever have to change you can change it in one
place.


> What is the problem with the my $holdcheck = new Holds() type of syntax?
> I never read anything about that either way.

My guess is that Perrin was referring to your use of the "indirect"
notation, as opposed to the "arrow" notation:

Indirect:

  my $holdcheck = new Holds()

Arrow:

  my $holdcheck = Holds->new()


Many people (myself included) prefer the arrow notation.  In general, the
arrow notation tends to be less ambiguous, particularly when it comes to
combining method calls with arguments.


HTH,

-Jesse-


--

  Jesse Erlbaum
  The Erlbaum Group
  [EMAIL PROTECTED]
  Phone: 212-684-6161
  Fax: 212-684-6226


Reply via email to