in reply to Re^2: DBD problem
in thread DBD 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.

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,

Athanasius <°(((><contra mundum Iustus alius egestas vitae, eros Piratica,

Replies are listed 'Best First'.
Re^4: DBD problem
by soonix (Chancellor) on Jan 17, 2017 at 16:28 UTC
    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 routine
    my $select = $Dbh->prepare("SELECT " ...); $select->execute ...
Re^4: DBD problem
by Anonymous Monk on Jan 19, 2017 at 08:49 UTC
    Athanasius, thank you, just making the Dbh and Sth local made the difference. it works;-) Kind regards, Ton