我写了一个脚本,我正在传递(可选,我希望!)命令行参数并将它们发送到MySQL查询。如果省略任何,我希望查询基本上忽略该参数。如果我通过所有3,我的查询正在运行。如果我传递第二个(整数)和第三个(一个字母),脚本也可以工作。但如果我省略了int或字母,我就没有结果。
我尝试通过在我的MySQL查询中使用ISNULL和Coalesce来解决这个问题,因为如果我在命令行参数中没有明确地传递它们,我不确定声明的变量是null还是空。
目前,如果我通过“Perl Script.pl -s Hockey -i 10 -l h,或者 “Perl Script.pl -i 20 -l z”,但在3个参数的任何其他迭代下失败。
我想知道的是 1.我是否按照我的意图使参数可选?我应该使用getopts而不是getopt吗? 2.我需要在MySQL查询中更改哪些内容才能使其按预期工作?为什么ISNULL或Coalesce不工作? 3.我传递或传递数据的方式还有其他不正确之处吗?
#!/usr/bin/perl -w
use warnings;
use DBI;
use Getopt::Std;
use strict;
getopt('s:il');
our ($opt_s);
our ($opt_i);
our ($opt_l);
my $sport_search;
if ($opt_s) ($sport_search=$opt_s);
my $integer_search;
if ($opt_i=~m/\d+/) {$integer_search=$opt_i};
my $letter_search;
if ($opt_l =~m/^[a-zA-Z]$/) {$letter_search=$opt_l};
my $g_hash = function1($sport_search,$integer_search,$letter_search);
my $string = "Just a string!";
if (&function2($g_hash,$string) != 0) {
print "No values found for '$sport_search'","\n";
};
sub function1 {
my ($lsport_search,$linteger_search,$lletter_search) = @_;
our $dbh = DBI->connect{"dbi:mysql:dbname=database", "root", "password")
or die $DBI::errstr;
my $sql = "SELECT * from Players_Sport where Sport like '$lsport_search' AND length(Player)<=ISNULL('$linteger_search',20) AND Player between 'a' and ISNULL('lletter_search",'z')";
my $hash_ref = $dbh->selectall_hashref($sql, 'Player')
or die $DBI::errstr;
$dbh->disconnect
or warn "Disconnection failed: $DBI::errstr\n";
return $hash_ref;
}
sub function2 {
my ($l_hash,$variable_two) = @_;
my $hashvalue=();
if(keys $l_hash == 0) {
$hashvalue = -1;
}
else {$hashvalue = 0;
print "$_\n" for (keys %$l_hash);
};
return $hashvalue;
}
答案 0 :(得分:1)
您的查询中存在一些问题:
my $sql = "SELECT * from Players_Sport where Sport like '$lsport_search'
AND length(Player)<=ISNULL('$linteger_search',20)
AND Player between 'a' and ISNULL('lletter_search",'z')";
即使$ linteger_search和$ lletter_search在Perl中未定义,它们在SQL中永远不会为NULL,因为你已经在它们周围添加了引号。在MySQL中,''
与NULL
不同。
你也有一些拼写错误:'lletter_search"
应该是'$lletter_search'
请注意,你必须使用与之相同的引号来结束引用的字符串,但是你开始使用单引号并结束它双引号(实际上,我很惊讶它没有抛出SQL错误)。
您还忘记了lletter_search之前的$
变量前缀。
更频繁的是动态构建SQL字符串,包括搜索条件非空时的搜索字词。
my $sql = "SELECT * from Players_Sport where true ";
if ($lsport_search) {
$sql .= " AND Sport like '$lsport_search' ";
}
if ($linteger_search) {
$sql .= " AND length(Player) <= $linteger_search";
}
if ($lletter_search) {
$sql .= " AND Player between 'a' and '$lletter_search'";
}