Hey Athanasius, thank you, I was expecting such a problem. I tried to disable the connect and the disconnect in the sub before I looked for help here but that didnt do the job. I should be able to write to the db from withinn the while loop. I know I did this before...
Could you give a hint please?
Kind regards,
Ton
| [reply] |
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,
| [reply] [d/l] [select] |
even better would be using different (so called "self documenting") names for the different statement handles, e.g. in UpdateDb
my $update = $dbh->prepare($upd_query);
$update->execute ...
and in the main routinemy $select = $Dbh->prepare("SELECT " ...);
$select->execute ...
| [reply] [d/l] [select] |
Athanasius, thank you,
just making the Dbh and Sth local made the difference. it works;-)
Kind regards,
Ton
| [reply] |