Hi, Here is the kind of thing that is driving me nuts. Please see: http://perl.apache.org/docs/general/perl_reference/perl_reference.html#Remed ies_for_Inner_Subroutines
If what this says is true, then either I don't have a closure type problem, or else what is says isn't true. It says that if I have this situation, I will get a warning. I am not getting any warnings, but I am getting this behaviour with my search queries "getting stuck" The only thing I do is again, copied from the perltoot package Searches; use strict; use Carp; use vars qw($dbh); use gentimeid; # generate time id based use Calc_Price; # get totals use warnings; # use DBIx::XHTML_Table; # maybe later use QueryPrint; #use Data::Dumper; # These searches are restricted to user level searches, there will be a admin level search for # managment reports $dbh = db_connect(); # requires a $q query object to be init. sub new { my $self = {}; my $proto = shift; my $class = ref($proto) || $proto; $self->{queryobject} = undef; $self->{isDomestic} = undef; $self->{isInternational} = undef; $self->{isShippingSame} = undef; $self->{CustIsInserted} = undef; $self->{OrderIsInserted} = undef; $self->{CustNum} = undef; $self->{OrderNum} = undef; bless ($self, $class); return $self; } sub queryobject { my $self = shift; if (@_) { $self->{queryobject} = shift } return $self->{queryobject}; } .... Other stuff not used yet sub LookupOrder { my $self = shift; my $q = $self->{queryobject}; my $output = ''; my $hasparameter = 0; ... Build a query from CGI.pm vars passed in though queryobject ... $order_name_qu .= " ORDER BY $orderby "; # the query string is here if ($hasparameter == 1) { # if something was filled in the search form my $sth = $dbh->prepare($order_name_qu) or confess("Main search failed $order_name_qu"); $sth->execute() or confess("Main search failed $order_name_qu"); my $headers = $sth->{'NAME'}; my @rows = $sth->fetchall_arrayref(); my $resulthtml = new QueryPrint(ResultSet => @rows, Action => 'customer', ColumnList => $headers); my $html = $resulthtml->SetAction(); # sets a template type in the QueryPrint module $output = $resulthtml->QueryPrint(); $sth->finish(); #warn "QUERY - $order_name_qu"; undef @rows; undef $resulthtml; undef $order_name_qu; return $output; } else { return "no query to do"; } Then this is all called from my CGI::Application module sub customer_display{ my $self = shift; my $q = $self->query(); my $customersearch = new Searches(); $customersearch->queryobject($q); # set the query my $header = parse_header($self); return $header . $customersearch->LookupCustName(); } So going nuts now, where is the problem? My QueryPrint module is pretty much the same, so if this is ok, it should be as well. Thanks, Eric >Are you using any modules that have subs with sub ref prototypes, like >Error.pm? That can do it. > >>All I have read says that because I am using oop >>modules and use strict along with use vars that should not happen. >> > >It's actually really easy to create closures. Here is a closure: > >my $holdtype = $q->param('holdstate'); >display_holdtype(); > >sub display_holdtype { > print "holdtype: $holdtype in process $$\n"; >} > >This will always print whatever the value was the first time, no matter >what you change it to later. (The first time for that process, that >is.) Watch out for things like that. You should always pass params >explicitly. > >>4. I know the way I have done these db connects is sloppy. But I can't seem >>to find a better way. Could I make one db_connect sub,and inherite it all >>though my modules? >> > >Make one sub that returns a database handle and use it from everywhere. > Doesn't need to be inherited, you can just stick it in a module that >all the other modules call. > >Hope some of that was helpful, >Perrin > (250) 655 - 9513 (PST Time Zone) "Inquiry is fatal to certainty." -- Will Durant