我的Perl脚本失败了什么? MySQL的/ getopt的

时间:2013-05-16 03:54:45

标签: mysql perl

我写了一个脚本,我正在传递(可选,我希望!)命令行参数并将它们发送到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;
}

1 个答案:

答案 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'";
}