I tried to disable the connect and the disconnect in the sub before I looked for help here but that didnt do the job.
Looking again at sub UpdateDb, I see you have the same problem with the $Sth variable: you call prepare and finish on it, so, when the subroutine returns, the call to $Sth->fetchrow_array in the while loop is no longer valid. Here’s a suggested rewrite of the subroutine (untested):
# Update the selected Database record
sub UpdateDb
{
my ($dbh, $upd_query) = @_; # $dbh is already connecte
+d
my $sth = $dbh->prepare($upd_query); # create $sth as a local,
+lexically-scoped variable unrelated to the global $Sth
$sth->execute() or $ErrNum = '3007';
$ErrMess = $DBI::errstr;
$sth->finish();
print "HIER $ErrMess<br>"
}
You would call it like this: UpdateDb($Dbh, $UpdQuery);
This is still far from ideal, as $ErrNum and $ErrMess are still being used as (effectively) global variables1. But localising $sth, by declaring it within the scope of the UpdateDb subroutine, will allow the call to $Sth->fetchrow_array in the while loop condition to work correctly.
1Strictly speaking, the only true global variables in Perl are the built-ins, such as $| and $/. Variables either declared with our or used without being declared (in the absence of use strict 'vars';) are package globals. Variables declared with my are lexicals, meaning they have lexical scope. But when I talk of “(effectively) global variables” I’m referring to the “action at a distance” problem which arises when a variable is used across so wide a scope that it becomes difficult to manage.
Hope that helps,
|