我的问题是:当我在linux机器上运行程序时,以及在另一台机器的Web浏览器上输出不同。
当我在linux机器上运行程序时,输出为:
Content-type: text/plain
11
22
username password
但是当我将程序放在Apache服务器上并使用另一台机器上的浏览器访问它时,输出就是:
11
可能是因为程序无法连接到数据库文件。由于我已将所有文件设置为模式777,因此我没有权限是不可能的。
任何人都知道问题是什么以及如何解决它?
#!/usr/bin/perl -w
use DBI;
print ("Content-type: text/plain\n\n");
print "11\n";
my $dbh = DBI->connect("dbi:SQLite:dbname=4140.db","","",{RaiseError => 1},) or die $DBI::errstr;
print "22\n";
my $sth = $dbh -> prepare("SELECT * FROM Credential");
$sth -> execute();
($usrname, $password) = $sth -> fetchrow();
$sth -> finish();
$dbh->disconnect();
print "$usrname $password\n";
答案 0 :(得分:1)
检查错误日志。您肯定会发现SQLite由于权限错误而无法创建4140.db
。您对当前目录做出了错误的假设。
答案 1 :(得分:1)
die
字符串被发送到STDERR
,因此不会出现在发送的HTTP消息中。您可以通过以下几种方式解决这个问题,其中最简单的方法是为DBI错误编写错误处理程序,将错误消息输出到STDOUT。
您还应始终 use strict
和use warnings
。这样,Perl将突出显示许多您可能容易忽略的简单错误。 use warnings
远远优于命令行上的-w
。
以此代码为例。请注意,如果您启用RaiseError
并提供错误处理程序,那么DBI
仅在您的错误处理程序返回false值时才会引发异常。
#!/usr/bin/perl
use strict;
use warnings;
use DBI;
print ("Content-type: text/plain\n\n");
print "11\n";
my $dbh = DBI->connect('dbi:SQLite:dbname=4140.db','','',
{RaiseError => 1, PrintError => 0, HandleError => \&handle_error});
print "22\n";
my $sth = $dbh->prepare('SELECT * FROM Credential');
$sth->execute;
my ($usrname, $password) = $sth -> fetchrow();
print "$usrname $password\n";
sub handle_error {
my ($msg, $dbh, $rv) = @_;
print "DB Error: $msg\n";
0;
}
答案 2 :(得分:1)
Yo应指定数据库文件的完整路径,以避免此类问题。试试这个(如果您的数据库与脚本的路径相同):
use FindBin '$Bin';
my $dbfile = "$Bin/4140.db";
my $dbh = DBI->connect("dbi:SQLite:dbname=$dbfile","","",{RaiseError => 1},) or die $DBI::errstr;
#...