Perl CGI反对分配给生成的HTML中不存在的数组的输出。可能的评估订单问题

时间:2014-02-12 05:52:44

标签: perl cgi

我创建了这个CGI perl脚本,它调用shell脚本(lookup.sh)来查询Oracle数据库,使用传递给shell脚本的第一个arg作为用户名来交叉引用组成员资格。

shell脚本返回由新行分隔的所有组。我有这个Perl脚本作为CGI动作到一个非常简单的html表单,它将USER参数传递给perl脚本,然后perl脚本运行shell脚本并将原始html表单中的用户名作为第一个arg传递,然后应该存储在名为@outp的数组中返回的值。

我的测试显示了所有工作,但是当我从浏览器运行时,@outp数组每次都显示为空白。所有其他测试都包含包含正确数据的数组,我唯一可以做的假设是在使用反引号命令填充数组之前生成HTML。有人可以加入吗?

HTML:

<FORM action="/cgi-bin/test.cgi" method="POST">
USER: <input type="text" name="USER">  <br>
<input type="submit" value="Submit">
</FORM>

外壳:

      #!/bin/bash

sqlplus -s DB_USER/DB_PASS@//DB_HOST:1521/JIRA_RW <<< "SELECT GROUP_NAME from    jira_db.membershipbase where USER_NAME='$1';"

的Perl:

#!/usr/bin/perl
use CGI qw(:standard);


$data = param('USER') || '<i>(No input)</i>';

@outp = `/bin/lookup.sh $data`;
print <<END;
Content-Type: text/html; charset=iso-8859-1

 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<title>Jira User Query</title>
<h1>Group Membership for $data @outp</h1>
<p>print @outp</p>
END

是的,我知道这是一项全面的黑客工作。

1 个答案:

答案 0 :(得分:1)

首先从Perl查询数据库会好得多。

好读数:How can I troubleshoot my Perl CGI script?http://www.cs.cf.ac.uk/Dave/PERL/node1.html

在此之前你可以这样做:

#!/usr/bin/perl
use CGI qw(:standard);

print "Content-Type: text/html; charset=iso-8859-1\n\n";

use strict;
use warnings;
use CGI::Carp 'fatalsToBrowser';

my $data = param('USER') || '<i>(No input)</i>';

my $outp = `/bin/lookup.sh '$data' 2>&1`;chomp($outp);
if ($?){
  $outp = "Execution error! error coode: $?";
}

print <<END;
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html><header></header><body>
<title>Jira User Query</title>
<h1>Group Membership for $data $outp</h1>
END

print "\n<p>print $outp</p>\n</body></html>\n";

使用DBI(它仍然是XX。centrury样式,对于新开发,你可以尝试Dancer,Mojo或其他新东西):

#!/usr/bin/perl
use CGI qw(:standard);

print "Content-Type: text/html; charset=iso-8859-1\n\n";

use strict;
use warnings;
use CGI::Carp 'fatalsToBrowser';
use DBI;

my $q = new CGI;
print $q->header;
print $q->start_html;
print $q->h1("Hello, it is working!!!");


my $sql = "SELECT GROUP_NAME from jira_db.membershipbase where USER_NAME=?";
if (defined param('USER')){
  print $q->p("param user: ".param('USER'));
  my $dbh = DBI->connect('dbi:mysql:perltest','root','password') or die "Connection Error: $DBI::errstr\n";
  my $sth = $dbh->prepare($sql);
  $sth->execute(param('USER'));
  while ( my @row = $sth->fetchrow_array() ){
    print $q->p($row[0]);
  }
}

print $q->end_html;