in reply to Re^2: DBI Problem
in thread DBI Problem

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!

Replies are listed 'Best First'.
Re^4: DBI Problem
by tultalk (Monk) on Sep 29, 2017 at 11:30 UTC

    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!

        Tried that

        warn("Open Connection-JustBefore opening connection "); my $localtimenow = localtime(Now()); $dbh = DBI->connect($dsn,$sql_username,$sql_password ,{ RaiseError => 1, AutoCommit => 0 });

        Checked error logs and nothing