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

In PERL I have connet the database using DBI concept. The database connection & select table query everything working fine in .pl file. But i have run the DBI database connection code in .pm file. It's not working.

Please review code.

Sample.pl (It's working fine)

use DBI; my $driver = "mysql"; my $database = "marketplace_perl"; my $dsn = "DBI:$driver:database=$database"; my $userid = "root"; my $password = "root"; my $dbh = DBI->connect($dsn, $userid, $password ); my $dbh=connect_db(); my $sth = $dbh->prepare("SELECT UserEmail,UserPassword FROM pj +_user where UserEmail=? and UserPassword=?"); $sth->execute($UserEmail,$UserPassword);

Marketplace.pm (It's not working)

package Marketplace; use DBI; sub connect_db { my $driver = "mysql"; my $database = "marketplace_perl"; my $dsn = "DBI:$driver:database=$database"; my $userid = "root"; my $password = "root"; my $dbh = DBI->connect($dsn, $userid, $password ); return $dbh; } sub login_marketplace { my $dbh=connect_db(); my $sth = $dbh->prepare("SELECT UserEmail,UserPassword FRO +M pj_user where UserEmail=? and UserPassword=?"); $sth->execute($UserEmail,$UserPassword); my $User_count=$sth->rows; return $User_count }

It's rertun the error message of "Failed to access class (Marketplace): Can\'t locate DBI.pm in @INC (you may need to install the DBI module)"

Please let me know how to fix the DB issue.

Replies are listed 'Best First'.
Re: Perl Database connect not working in .pm file
by Corion (Patriarch) on Aug 31, 2018 at 06:07 UTC

    Perl says that it can't find DBI.pm. Are you maybe running your script with a different version of Perl or a different environment than when you use your Perl module Marketplace.pm? The difference could be a webserver or a cron job?

    Otherwise, maybe try to locate where DBI.pm is, and then find out why Perl doesn't find it in one situation:

    find / -name 'DBI.pm'
    perl -MDBI -wle 'print $INC{"DBI.pm"}'

      I have use the perl -MDBI -wle 'print $INC{"DBI.pm"}' comment. It's return the DBI.pm file location

      /home/kane/perl5/lib/perl5/x86_64-linux-gnu-thread-multi/DBI.pm

        Your stackoverflow post says DBI is also located in /usr/local/lib/x86_64-linux-gnu/perl/5.26.1

        Can you show the code for the script that uses the module and is not working.

        poj
Re: Perl Database connect not working in .pm file
by Marshall (Canon) on Sep 01, 2018 at 07:57 UTC
    WHOA!! WHOA!!

    I don't believe that your .pl script is working fine?
    put these lines...

    use strict; use warnings;
    at the beginning of your script!
    use DBI; my $driver = "mysql"; my $database = "marketplace_perl"; my $dsn = "DBI:$driver:database=$database"; my $userid = "root"; my $password = "root"; my $dbh = DBI->connect($dsn, $userid, $password ) or die $DBI::errstr;###### my $dbh=connect_db(); ######### WHAT???#### !!!! ####### ## my $dbh is defined twice!!! my $sth = $dbh->prepare("SELECT UserEmail,UserPassword FROM pj_user wh +ere UserEmail=? and UserPassword=?"); $sth->execute($UserEmail,$UserPassword);
    You redefine "my $dbh". That is a bad thing.

    Your package is malformed.
    See https://www.perlmonks.org/index.pl/Tutorials#Modules-How-to-Create-Install-and-Use
    Show the code that calls the functions in the .pm module.
    There aren't any executable statements in your .pm module and the subroutine names are not exported.