无法使用Perl CGI程序连接到SQLite数据库文件

时间:2013-01-23 12:12:16

标签: perl sqlite cgi

我的问题是:当我在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";

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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;
}

答案 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;

#...