我正在运行一个脚本来检索用户的密码,但我得到一个空白页面。当我检查Apache错误日志时,它说它找不到Informix Perl模块。但我安装了Informix Perl模块,我可以通过命令行脚本连接到我们的Informix数据库。
在Apache日志中发现错误:
cgi:error] [pid 30132] [client 10.199] AH01215: install_driver(Informix) failed: Can't locate DBD/Informix.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at (eval 7) line 3.,
referer: server.com/cgi-bin/ts_password_retrieval.cgi [Thu Sep 03 17:58:24.8 2015] [cgi:error] [pid 30132] [client 10.199]
AH01215: Perhaps the DBD::Informix perl module hasn't been fully installed,, referer: server.com/cgi-bin/ts_password_retrieval.cgi –
Perl版本和Informix库的位置:
(v5.16.3)
export INFORMIXDIR=/opt/informix
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$INFORMIXDIR/lib:$INFORMIXDIR/lib/cli:$INFORMIXDIR/lib/esql:$INFORMIXDIR/lib/tools
代码生成错误:
#!/usr/bin/perl -w
use CGI::Pretty qw(:standard *table);
use strict;
use warnings;
use DBI;
#use Config::Std;
use vars qw($FICE_CODE $SCHL_NAME $FIRST_NAME $LAST_NAME $TO_ORDER_ID $CH_FLAG $ORDER_STATUS $TO_RECIP_ID $ORDER_STATUS $RECPT_ORDER_STATUS $EMAIL $TO_DELIV_TRANS_ID $PASSWORD $FILE_NAME);
use Data::Dumper;
#&ReadParse(*input);
#Output display
print "Content-type: text/html\n\n";
main();
sub main
{
print "<html><head>\n";
print "<title>Transcript Password Retrieval</title></head>\n";
print "<body>\n";
print "<center>Transcript Password Retrieval</center>\n";
print "</body></html>\n";
if (param('to_id'))
{
my $to_id = param('to_id');#local to_id
my $pwd_select = ("select s.fice_code, s.schl_name, o.first_name, o.last_name, o.to_order_id, o.ch_flag, o.order_status,r.to_recipient_id, r.order_status, r.email, dt.to_deliv_trans_id, dt.password, dt.file_name from to_scprofil s, to_order o, to_recipient r, to_deliv_trans dt where s.to_scprofil_id = o.to_scprofil_id and o.to_order_id = r.to_order_id and r.to_recipient_id = dt.to_recipient_id and o.to_order_id in ($to_id) order by o.to_order_id desc");
my $driver = "Informix";
my $database = "Web1";
my $dsn = "DBI:$driver:dbname=$database";
my $userid = "todd";
my $password = "shumer12";
my $dbh = DBI->connect($dsn, $userid, $password, {RaiseError => 1}) or die $DBI::errstr;
#print "Opened db successfully\n";
my $sth = $dbh->prepare($pwd_select);
$sth ->execute; #make this a global variable might have to revert this back to a locak variable
my $rv = $sth->rows;
while(my $row = $sth->fetchrow_hashref)
{
print hr
print start_table;
foreach my $key (keys %$row)
{
print Tr
(
td(b($key)),
td($row->{$key}),
);
}
print end_table;
#print Dumper $row;
}
exit;
my $output = (our @to_pwd);#send output to the array @to_pwd so it can then be spliced into each row
$to_id = format_to_orderid($to_id);
foreach my $output(@to_pwd)
{
($FICE_CODE, $SCHL_NAME, $FIRST_NAME, $LAST_NAME, $TO_ORDER_ID, $CH_FLAG, $ORDER_STATUS, $TO_RECIP_ID, $ORDER_STATUS, $RECPT_ORDER_STATUS, $EMAIL, $TO_DELIV_TRANS_ID, $PASSWORD, $FILE_NAME)=split(",",$output);#split output with a coma from each row.
if($FICE_CODE eq "fice_code")#header rows
{
print"<tr>/n";
print"<th>$FICE_CODE</th>";
print"<th>$SCHL_NAME</th>";
print"<th>$FIRST_NAME</th>";
print"<th>$LAST_NAME</th>";
print"<th>$TO_ORDER_ID</th>";
print"<th>$CH_FLAG</th>";
print"<th>$ORDER_STATUS</th>";
print"<th>$TO_RECIP_ID</th>";
print"<th>$ORDER_STATUS</th>";
print"<th>$RECPT_ORDER_STATUS</th>";
print"<th>$EMAIL</th>";
print"<th>$TO_DELIV_TRANS_ID</th>";
print"<th>$PASSWORD</th>";
print"<th>$FILE_NAME</th>";
print"<tr/>/n";
print "</table>/n";
next;
}
print"<tr>/n"; #data information from sql
print"<td>$FICE_CODE</td>";
print"<td align 'right'> $SCHL_NAME</td>/n";
print"<td align 'right'> $FIRST_NAME</td>/n";
print"<td align 'right'> $LAST_NAME</td>/n";
print"<td align 'right'> $TO_ORDER_ID</td>/n";
print"<td align 'right'> $CH_FLAG</td>/n";
print"<td align 'right'> $ORDER_STATUS</td>/n";
print"<td align 'right'> $TO_RECIP_ID</td>/n";
print"<td align 'right'> $ORDER_STATUS</td>/n";
print"<td align 'right'> $RECPT_ORDER_STATUS</td>/n";
print"<td align 'right'> $EMAIL</td>/n";
print"<td align 'right'> $TO_DELIV_TRANS_ID</td>/n";
print"<td align 'right'> $PASSWORD</td>/n";
print"<td align 'right'> $FILE_NAME</td>/n";
#finish table data html
print"<tr/>/n";
}
}
else
{
show_form();
}
print"</body></html>\n"
}
sub show_form
{
my $url = url;
print qq{<form name="input" action="ts_password_retrieval.cgi" method="get">\n};
print qq{<table align="center" border="1" bordercolor="black" cellpadding="2" cellspacing="0">\n};
print qq{<tr>};
print qq{<td align="right">Please enter the Transcript Order ID #</td};
print qq{</tr>\n};
print qq{<td align="left"><input type"text" width="7" name="to_id" value="">};
print qq{<BR>Place each Transcript Order ID separated by a space</td>};
print qq{</table><center><input type="submit" value="Submitted"></center></form>\n};
}
sub format_to_orderid
{
my $in= shift;
my $out = join ',', split /\s/, $in;
return $out;
}
尝试通过执行dump_results()进行故障排除,我仍然得到一个空白页
#!/usr/bin/perl -w
use CGI::Pretty qw(:standard *table);
use strict;
use warnings;
use DBI;
#use Config::Std;
use vars qw($FICE_CODE $SCHL_NAME $FIRST_NAME $LAST_NAME $TO_ORDER_ID $CH_FLAG $ORDER_STATUS $TO_RECIP_ID $ORDER_STATUS $RECPT_ORDER_STATUS $EMAIL $TO_DELIV_TRANS_ID $PASSWORD $FILE_NAME);
use Data::Dumper;
#&ReadParse(*input);
#Output display
print "Content-type: text/html\n\n";
main();
sub main
{
print "<html><head>\n";
print "<title>Transcript Password Retrieval</title></head>\n";
print "<body>\n";
print "<center>Transcript Password Retrieval</center>\n";
print "</body></html>\n";
if (param('to_id'))
{
my $to_id = param('to_id');#local to_id
$to_id = format_spn_string($to_id);
my $pwd_select = ("select s.fice_code, s.schl_name, o.first_name, o.last_name, o.to_order_id, o.ch_flag, o.order_status, r.to_recipient_id, r.order_status,r.email, dt.to_deliv_trans_id, dt.password, dt.file_name from to_scprofil s, to_order o, to_recipient r, to_deliv_trans dt where s.to_scprofil_id = o.to_scprofil_id and o.to_order_id = r.to_order_id and r.to_recipient_id = dt.to_recipient_id and o.to_order_id in ($to_id) order by o.to_order_id desc");
my $driver = "Informix";
my $database = "Web1";
my $dsn = "DBI:$driver:dbname=$database";
my $userid = "user";
my $password = "password";
my $dbh = DBI->connect($dsn, $userid, $password, {RaiseError => 1}) or die $DBI::errstr;
#print "Opened db successfully\n";
my $sth = $dbh->prepare($pwd_select);
$sth ->execute; #make this a global variable might have to revert this back to a local variable
$sth -> dump_results();
$sth->finish();
$dbh->disconnect();
}
else
{
show_form();
}
print"</body></html>\n"
}
sub show_form
{
my $url = url;
print qq{<form name="input" action="ts_password_retrieval.cgi" method="get">\n};
print qq{<table align="center" border="1" bordercolor="black" cellpadding="2" cellspacing="0">\n};
print qq{<tr>};
print qq{<td align="right">Please enter the ID #</td};
print qq{</tr>\n};
print qq{<td align="left"><input type"text" width="7" name="to_id" value="">};
print qq{<BR>Place each ID # separated by a space</td>};
print qq{</table><center><input type="submit" value="Submit"></center></form>\n};
}
sub format_to_orderid
{
my $in= shift;
my $out = join ',', split /\s/, $in;
return $out;
}
答案 0 :(得分:1)
我是DBD :: Informix的守护者 - 又名开发者和维护者。
除非你以我不知道的方式修改了DBD :: Informix中的代码,否则表示法:
my $dsn = "DBI:$driver:dbname=$database";
不起作用。 Informix不接受连接字符串中的dbname=
(或者更准确地说,不会解释它,因此它会尝试连接到名为dbname=whatever@wherever
的数据库并因为=
无效而失败在数据库名称中。)
因此,请从DSN中删除dbname=
部分。
perldoc DBI
:“连接”
$dbh = DBI->connect($data_source, $username, $password) or die $DBI::errstr; $dbh = DBI->connect($data_source, $username, $password, \%attr) or die $DBI::errstr;
建立与请求的数据库连接或会话 $ DATA_SOURCE。如果连接成功,则返回数据库句柄对象。 使用“$ dbh-&gt; disconnect”终止连接。
如果连接失败(见下文),则返回“undef”并设置两者 $ DBI :: err和$ DBI :: errstr。 (它没有明确设置$!。)你应该 通常测试“connect”和“print $ DBI :: errstr”的返回状态if 它失败了。
...
$ data_source值必须以“”dbi开头:“driver_name”:“”。该 driver_name指定将用于建立连接的驱动程序。 (信件案件很重要。)
...
$ data_source值的示例是:
dbi:DriverName:database_name dbi:DriverName:database_name@hostname:port dbi:DriverName:database=database_name;host=hostname;port=port
驱动程序名称后面的文本没有标准。每个驱动程序 可以自由使用它想要的任何语法。 DBI的唯一要求 make是所有信息都以单个字符串提供。你必须 请参阅您用于描述的驱动程序的文档 他们需要的语法。
(强调补充。)
perldoc DBD::Informix
连接数据库
要连接到数据库,请使用connect函数,它会产生一个 如果成功,则为有效的数据库句柄。 ...
...
$dbh = DBI->connect("dbi:Informix:$database"); $dbh = DBI->connect("dbi:Informix:$database", $user, $pass); $dbh = DBI->connect("dbi:Informix:$database", $user, $pass, %attr);
DBI connect方法从第一个参数中删除'dbi:'前缀 并加载由下一个字符串标识的DBD模块(Informix在此处 案件)。第二个冒号后面的字符串是传递给它的所有字符串 DBD :: Informix代码。使用此格式,您不必指定 用户名或密码。请注意,如果您指定用户名但不指定 密码,DBD :: Informix将默默忽略用户名。 ...