in reply to Re: DBI Problem
in thread DBI Problem

As I said there are two calls to executequery in the same sub routine. The first returns the correct response while the second fails with the error posted. open connection returns the dbi/dsn correctly

Open Connection-returning database handle: 'DBI::db=HASH(0x1e02880)' d +sn: 'dbi:mysql:database=jalamior_assoc_mgr;host=localhost' at /home/j +alamior/www/httpsdocs/cgi-bin/lib/perl/manageusers.pm line 152.

Makes no sense to me why one should be Ok and the other fail. That is why I am here. Seems like a self contained problem to me.

sub ExecuteQuery { my ($SQL) = @_; my $sth = $dbh->prepare($SQL) || ErrorMessage($SQL); $sth->execute() || ErrorMessage($SQL); return $sth; }

Replies are listed 'Best First'.
Re^3: DBI Problem
by thanos1983 (Parson) on Sep 29, 2017 at 08:04 UTC

    Hello tultalk,

    You need to debug step by step your operations. Insert errstr on prepare and execute and see the output. I do not think so the way that you are using it currently is working correctly. Sample of code untested:

    my $sth = $dbh->prepare($SQL) or die $dbh->errstr; $sth->execute() or die $dbh->errstr; $dbh->commit or die $dbh->errstr;

    See also commit.

    You need also to check your call fetchrow_array since you are jumping from one note to the other. Sample of code untested:

    while (($tsid, $userid) = $sth->fetchrow_array) { print "$tsid: $userid\n"; } # check for problems which may have terminated the fetch early die $sth->errstr if $sth->err;

    Hope this helps, BR.

    Seeking for Perl wisdom...on the process of learning...not there...yet!

      You question pointed me at this

      625 warn("Locating existing user data succeded: SID '$tsid'"); 626 $session = OpenSession($dbh,$tsid); 627 my $userid = $session->param("user_id"); 628 my $username = $session->param("username"); 629 warn("userid: '$userid' username: '$username'");

      Line 629 shows correct parameters recovered. I can't see where substituting your suggested code would do anything different. Returning the correct rsults indicates no error correct?

      Fri Sep 29 05:59:35 2017 manage_users.cgi: userid: '428' username: 'jala428' at /home/jalamior/www/httpsdocs/cgi-bin/lib/perl/manageusers.pm line 629.

      SQL Statement: 'update users set password = 'briddle' where id = '428'' at /home/jalamior/www/httpsdocs/cgi-bin/lib/perl/manageusers.pm line 656.

        Hello tultalk,

        Regarding: I can't see where substituting your suggested code would do anything different. Returning the correct rsults indicates no error correct?.

        Yes and no, Yes because in theory if you get the same output should prove that your script is crashing at another point. No because if you use the die methods it will clearly show the line that the script died and the also the reason (if you print error message).

        If I was you, I would debug each and single step of the function / method that you are adding / updating. Unfortunately there is no easy way out of this. You need to insert a die methods.

        As an alternative you can use something like:

        my $dbh = DBI->connect("dbi:DriverName:db_name", $user, $password, { RaiseError => 1, AutoCommit => 0 });

        By using RaiseError you will avoid needing to check each call it will die by default on each wrong call.

        From the DBI/RaiseError documentation:

        Type: boolean, inherited The RaiseError attribute can be used to force errors to raise exceptio +ns rather than simply return error codes in the normal way. It is "of +f" by default. When set "on", any method which results in an error wi +ll cause the DBI to effectively do a die("$class $method failed: $DBI +::errstr"), where $class is the driver class and $method is the name +of the method that failed. E.g., DBD::Oracle::db prepare failed: ... error text here ...

        Hope this helps, BR.

        Seeking for Perl wisdom...on the process of learning...not there...yet!
Re^3: DBI Problem
by huck (Prior) on Sep 29, 2017 at 02:13 UTC

    Why are you so sure the error is at "note 2" rather than $session = OpenSession($dbh,$tsid);

      I should have said the problem manifests itself at Note 2.

      my $userid = $session->param("user_id"); my $username = $session->param("username");

      Returns the correct information from the session. $session = OpenSession($dbh,$tsid);

Re^3: DBI Problem
by poj (Abbot) on Sep 29, 2017 at 10:30 UTC
    Seems like a self contained problem to me.

    It would be if you didn't use a global $dbh in your subroutine.

    Where does the string "(in cleanup)" appear in your code. Is that the name of another subroutine ?

    poj

      Not in my code. Message in captured error file from system

        What versions of DBI and CGI::Session are you using ?

        print " DBI $DBI::VERSION CGI::Session $CGI::Session::VERSION ";
        poj