I'm stuck with a for-loop and would appreciate any help I can get. I hope
the code is somewhat intelligible, as it comes out of a larger script.
The code serves to print out individual search results for a flatfile
database query, called in a cgi-script.
All matching records are stored in @hits, the humber of hits is stored in
$numhits.
What I want to achieve is to first print out each search result, culled
from the file db1.db, and then switch to a second database file db2.db and
get all records there for a particular entry in db1.db.
Example: db1.db contains a record where "lastname" is "Muller", and I now
want to get the record from db2.db where "lastname" is also "Muller. Each
database file has its own list of database fields, which are stored in a
database configuration file (db1.cfg, db2.cfg).
# get input from database query
my ($numhits, $maxhits, @hits) = @_;
# this code block changes the database setup from db1 to db2
# $db_file_$name holds the database file name, @db_cols holds the field
names.
$old_file_name = $db_file_name;
$db_file_name = $db_script_path . "/db2.db";
@old_cols = @db_cols;
@cols = &get_db_cols('db2.cfg'); # getting the field names for db2 from the
config-file db2.cfg
## end changing setup
for (0 .. $numhits - 1) { # for all matches
if ($in{'generate'}) { # we do this on the condition that a value of
"generate" exists in the query-string
my ($firstname, $lastname) = &html_record_generate (&array_to_hash($_,
@hits));
# the subroutine html_record_generate prints out the individual search
results for
# the query, matching up elements of @hits with the field names stored in
@db_cols.
# at this point, @db_cols still needs to have the values for db1.
# $firstname and $lastname are the values on which we want to query db2
my @db_cols = @cols; # now we set the field names to those of db2 which we
have read into @cols above
# This is clumsy, but reading in the field names inside the for loop
doesn't work as it should.
$in{'keyword'} = "$firstname $lastname"; # this is what we're going to
search on in db2
$in{'bool'} = "and"; # add a search option for searching in db2
my ($status2, @hits2) = &query('view'); # sub query does the actual search
if ($status2 eq "ok") { # if there is a match
my (%rec2) = &array_to_hash (0, @hits2); # turn the hits into a hash.
print |<br>$rec2{'mail'}, $rec2{'phone'}, and so on.<br>|;
}
}
else { # if there's no value of "generate" in the query-string, we don't
need any of this and go for a different sub.
&html_record (&array_to_hash($_, @hits));
}
Two problems:
First, the values of $firstname and $lastname change in the course of the
for-loop as they should, but the query to db2 keeps returning search
results only for the first match. Example: In the first loop, $firstname =
"Charles" and $lastname = "Miller" are returned from html_record_generate.
There's a match for them in db2.db, and it gets returned in @hits2. In the
second loop, $firstname = "Sandra" and $lastname = "Kwack" are returned.
There's also a match for them in db2.db, but it doesn't get returned as
@hits2 - @hits2 stays with good old Charles Miller.
Second, I get the matching record into @hits2, but not into the hash %rec2.
I reckon this has got something to do with the "0" I'm passing on to sub
array_to_hash, but am not sure what.
I hope this is somewhat intelligible ...
Birgit Kellner
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]