0

我的问题是:当我在 linux 机器和另一台机器的网络浏览器上运行程序时,输出是不同的。

当我在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";
4

3 回答 3

1

检查您的错误日志。您肯定会发现 SQLite4140.db由于权限错误而无法创建。您对当前目录做出了错误的假设。

于 2013-01-23T12:30:31.403 回答
1

die字符串被发送到STDERR,因此不会出现在发送的 HTTP 消息中。您可以通过多种方式解决此问题,其中最简单的一种是为 DBI 错误编写错误处理程序,将错误消息打印到 STDOUT。

你也应该总是 use strictuse 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;
}
于 2013-01-23T12:33:13.507 回答
1

Yo 应该指定数据库文件的完整路径以避免此类问题。试试这个(如果你的数据库和你的脚本在同一个路径):

use FindBin '$Bin';

my $dbfile = "$Bin/4140.db";
my $dbh = DBI->connect("dbi:SQLite:dbname=$dbfile","","",{RaiseError => 1},) or die $DBI::errstr;

#...
于 2013-01-23T12:54:18.270 回答