0

我编写了一个脚本,我在其中传递(可选,我希望!)命令行参数并将它们发送到 MySQL 查询。如果有任何省略,我希望查询基本上忽略该参数。如果我通过所有 3,我的查询正在工作。如果我通过第二个(整数)和第三个(字母),脚本也可以工作。但是,如果我省略了 int 或 letter 我没有得到任何结果。

我试图通过在我的 MySQL 查询中使用 ISNULL 和 Coalesce 来解决这个问题,因为如果我没有在命令行参数中明确传递它们,我不确定声明的变量是 null 还是空。

目前,如果我通过“Perl Script.pl -s Hockey -i 10 -lh”或“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;
}
4

1 回答 1

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'";
}
于 2013-05-16T04:03:40.153 回答