htmanning has asked for the wisdom of the Perl Monks concerning the following question:

I'm trying to connect to two separate databases in a single perl script and it's not working. Is it possible? I connect to one to check a username/pass combo. If they're in there, proceed with the script. I'm using a sub file to handle connecting to the database. Here are the routines in there.
#################################### ## Create database connection sub Conn_to_DB_Forums{ use DBI; $DSN = "DBI:mysql:me_forums:db.site.com"; $sqluser = "me1"; $sqlpass = "12345"; $dbh = DBI->connect($DSN,$sqluser,$sqlpass) || die "Cannot connect: $DBI::errstr\n" unless $dbh; return; } ## end of connect to DB subroutine #################################### #################################### ## Create database connection sub Conn_to_DB{ use DBI; $DSN = "DBI:mysql:me_content:db1.site.com"; $sqluser = "me2"; $sqlpass = "67890"; $dbh = DBI->connect($DSN,$sqluser,$sqlpass) || die "Cannot connect: $DBI::errstr\n" unless $dbh; return; } ## end of connect to DB subroutine #################################### #################################### ## Exec SQL command sub Do_SQL{ eval { $sth = $dbh->prepare($SQL); }; # end of eval # check for errors if($@){ $dbh->disconnect; print "Content-type: text/html\n\n"; print "An ERROR occurred! $@\n"; exit; } else { $sth->execute; } # end of if/else return ($sth); } ## End of Do_SQL subroutine ##################################### #################################### ## Exec SQL2 command sub Do_SQL2{ eval { $sth2 = $dbh->prepare($SQL2); }; # end of eval # check for errors if($@){ $dbh->disconnect; print "Content-type: text/html\n\n"; print "An ERROR occurred! $@\n"; exit; } else { $sth2->execute; } # end of if/else return ($sth2); } ## End of Do_SQL2 subroutine #####################################


SO... This script allows people to post opinions. In the script I do this:


if ($submit || $preview) { &Conn_to_DB_Forums; $SQL = "SELECT * from $forum_table WHERE (username='$username' AND + user_password!='$user_password' AND user_active='1')"; &Do_SQL; &error(not_registered) unless ($pointer = $sth->fetchrow_hashref); I do some other stuff here...then disconnect. $sth->finish(); $dbh->disconnect; } if ($submit) { &Conn_to_DB; $SQL = "SELECT * from $op_tbl WHERE (prodID='$prodID' AND dateadde +d='$dateadded' AND prodtype='$prodtype' AND (username='$username' OR +title='$titlefix'))"; # run SQL against the DB &Do_SQL; &error(no_spam) if ($pointer = $sth->fetchrow_hashref); $SQL = "INSERT INTO $op_tbl (username,name,email,location,features +,usability,title,body,dateadded,prodID,prodtype) VALUES ('$username','$namefix','$emailfix','$locationfix','$fe +atures','$usability','$titlefix','$bodyfix','$dateadded','$prodID','$ +prodtype')"; # run SQL against the DB &Do_SQL; $pointer = $sth->fetchrow_hashref; $filename = $pointer->{'filename'}; }

The $filename field doesn't get set which means I'm not connecting successfully to the 2nd databsae. I think the deal is that I'm not disconnecting from the first database because if I leave that call out (&Conn_to_DB_Forums;), everything else works.

I can also leave these two disconnect lines out, and it makes no difference: $sth->finish();
$dbh->disconnect;
I hope my question makes sense. Is there a way to get out of the first database and then read from a 2nd? Thanks!

Replies are listed 'Best First'.
Re: Connecting to 2 mysql database in one script
by jfroebe (Parson) on Nov 21, 2008 at 22:31 UTC

    You need a separate database handle (dbh) for each connection that is going to a different server. Some DBD drivers require a separate database handle for each connection.

    $dbh1 = DBI->connect($DSN,$sqluser,$sqlpass) || die "Cannot connect: $DBI::errstr\n" unless $dbh1; $dbh2 = DBI->connect($DSN2,$sqluser2,$sqlpass2) || die "Cannot connect: $DBI::errstr\n" unless $dbh2;

    You would then pass the appropriate db handle to any subroutines:

    sub my_query { my $my_dbh = shift; my $query = shift; .... } my_query($dbh1, "select * from potatoes");

    Jason L. Froebe

    Blog, Tech Blog

      Thanks so much. I got it.