我创建了这个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
是的,我知道这是一项全面的黑客工作。
答案 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;