LoginUser($dsn,$sql_username,$sql_password,$sql_user_table,$sql_sessio
+n_table,$passhash,$sessionhash,$uvId,$username,$ipaddress);
that i took to be the call to this subroutine.I had counted the args and determined it was even so your "even-sized list expected" message made me wonder, so I searched other posts of yours and found much to my surprise that that the actual calling code seems to be
my ($result, $login_timeout) = LoginUser($query);
A hash, (something starting with a % sign, or used as $something{...}, or $something->{...}) can be thought of a special array with a even number of elements and the odd numbered elements have special magic associated with them. This allows you to assign an list to them like %hash=('a','b'); or often seen as %hash=(a=>'b');. A reference to an @array is seen as a list, and here @_ is an array of the arguments to the call, so %query=@_; qualifies as assigning a list to a hash. but the list needs to have an even number of items in it to properly make the hash work. when use warnings; is in effect you get an warning if a list assignment is made to a hash and the number of items in it is not even, as you now have seen.
Warnings do not stop the program tho.
I still stand by my assertion that you do not understand what is in %query, in a similar call
use CGI;
my $query=new CGI;
test($query);
sub test {
my (%query)=@_;
use Data::Dumper;
print Dumper(\%query);
}
Dumper shows
$VAR1 = {
'CGI=HASH(0x3f7e24)' => undef
};
Which is not what you expected at all is it?
Based on seeing that the actual call is
my ($result, $login_timeout) = LoginUser($query);
and that you never use the %query hash
i suspect that when you said my (%query) = @_; you really wanted my ($query) = @_;
That sets the localized scalar variable $query to the first argument of the call rather than trying to set the hash %query to the entire argument list. It also matches your call better and creates a localized $query variable to use in the LoginUser subroutine based on the arguments to the call rather than using the $query variable set somewhere else.
as i noted warnings do not stop execution and i dont know what you mean by "derails code to determine if already logged in"
as to why "the warn( in my cgi scripts do not print in the error log" i cannot answer, mine do, and a google search has produced no further answers either.
as you see debugging by proxy can be a real pain, even more so for me when you only release code in little pieces, spread across many threads. I understand your frustration, do you understand mine?
I understand debugging old code, both of mine and that from someone else. i stand by my previous statement "You need to step back and look at what is really going on, not what you think is going on." |