If I understand correctly from this post as well as Re^2: select from mysql table based on two column match, there are two issues:
- How to write the UI code to get the two column values.
I am looking to get input from terminal like, What is the value to match in columnA? cat <enter> What is the value to match in columnB? dog <enter>
- How to write the DBI code to use those values.
To address problem (1), consider some UI code like below. There of course many variants on how to do this. I present one framework that might be useful:
#!/usr/bin/perl
use strict;
use warnings;
my @answers = get_user_answers ("First Name", "Last Name");
print "User Said: @answers\n";
@answers = get_user_answers ("Animal1", "Animal2");
print "User Said: @answers\n";
#
# get array of answers to an array
# of prompts. Any non-blank answer, that
# is also a single space separated token is allowed
#
sub get_user_answers
{
my (@prompts) = @_;
my @answers;
foreach my $prompt (@prompts)
{
my $answer = prompt4answer($prompt);
push (@answers, $answer);
}
return @answers;
}
#
# get a non_blank, single token answer
# for a single prompt
#
sub prompt4answer
{
my $prompt = shift;
my $answer;
while ( (print "$prompt: "), $answer = <STDIN>,
$answer !~ /^\s*\S+\s*$/)
{
if ($answer =~ /^\s*\S+\s+\S+/)
{
print "Error! Only a single word allowed!\n";
}
# note: Simply re-prompts (no Error!) on a blank line
}
# Normal UI convention is to ignore leading and
# trailing white spaces
$answer =~ s/^\s*//; # trim leading spaces
$answer =~ s/\s*$//; # trim trailing spaces
# also deletes line endings (\n)
return $answer;
}
__END__
Example session:
C:\Projects_Perl\testing>perl UI_multi_prompt.pl
First Name:
First Name: clark kent
Error! Only a single word allowed!
First Name: clark
Last Name: kent
User Said: clark kent
Animal1: dog cat
Error! Only a single word allowed!
Animal1:
Animal1: dog
Animal2: cat
User Said: dog cat
I have some issues with problem (2) the DBI code. Let us know if problem (1) is solved.
Addition:
I would recommend in the connect statement that you use
the RaiseError option. If you do this, that eliminates a
lot of "or die" clauses. Connect looks similar to this:
my $dbh = DBI->connect("dbi:SQLite:dbname=$dbfile","","",{RaiseError =
+> 1})
or die "Couldn't connect to database: " . DBI->errstr;
This SQL is fine:
SELECT * FROM charge WHERE colA = 'cat' AND colB = 'dog'
However, in your program, I would use named SQL columns instead of '*' in the
SQL statement.
Your code references columns 1,2,3,5 (skips 0 and 4)
Just delete column 0 and 4 in the SELECT by using SQL named fields instead
of using '*'.
Instead of using $sth->fetchrow_array(), consider using
$sth->fetchall_arrayref() for "small" result sets, 10K or 100K rows.
#code could look like this (untested):
my $aref = $sth->fetchall_arrayref();
foreach my($cptanswer, $insid, $preauth, $updated)(@$aref)
{
print "\t$cptanswer\t$insid\t$preauth\t$updated\n";
}
Instead of:
while (@data = $sth->fetchrow_array()) {
my $cptanswer = $data[1];
my $insid = $data[2];
my $preauth = $data[3];
my $updated = $data[5];
print "\t$cptanswer\t$insid\t$preauth\t$updated\n";
}
|