Perl-SQLite3:基本问题

时间:2009-11-18 00:33:07

标签: perl sqlite

我承认自从我使用Perl已经有一段时间了,但这让我很难过。

问题在于:

#!/usr/bin/perl
use CGI::Carp qw(fatalsToBrowser);
use DBI;

print "Content-type: text/html\n\n";
print "<html><head><title></title></head></body>";

my $login = "admin@xxxxx.com";
my $dbfile = "/var/www/shopsite-data/shopsite_db";
my $sql = qq`SELECT ss_OrderID FROM ss_ORDER WHERE ss_Email=?`;

my $dbh = DBI->connect("dbi:SQLite:dbname=$dbfile", "", "") || die "Cannot connect: $DBI::errstr";

my $sth = $dbh->prepare($sql);
$sth->execute($login) or die $sth->errstr();
while (my @result = $sth->fetchrow_array()) {
  print "OrderID: $result[0]<br />";
}
$sth->finish;

print "</body>";
print "</html>";
$dbh->disconnect;

什么都不返回,但是当使用相同的查询使用sqlite3登录时,我得到了一个结果集。当我从

更改查询时,我也得到了一个结果集
my $sql = qq`SELECT ss_OrderID FROM ss_ORDER WHERE ss_Email=?`;

my $sql = qq`SELECT ss_OrderID FROM ss_ORDER`;

2 个答案:

答案 0 :(得分:13)

明显的问题是双引号内的@:

my $login = "admin@xxxxx.com";

可能会出现

 $login = "admin.com"

并且,如果您打开了警告,则会在日志文件中打印警告,因为Perl将@xxxx视为数组并尝试对其进行插值,然后发出警告,因为它是空的。也就是说,假设您没有名为@xxxx的数组。如果你这样做,那么你将获得它在字符串中的所有值。

如果您有电子邮件地址,请在其周围使用单引号以防止将@xxxx插入为数组:

my $login = 'admin@xxxxx.com';

或者你可以使用

my $login = "admin\@xxxxx.com";

防止@开始插值。 您的脚本可能还有其他问题,但这是最明显的问题。

奇怪的是I was just reading about drawbacks of interpolation in Perl

还有一件事......

还有一件事:你已经有了fatalsToBrowser,但是

use warnings;
use strict;
use CGI::Carp qw(fatalsToBrowser warningsToBrowser);

可能会在您的浏览器上向您发出有关未初始化值的警告,因此可能值得warningsToBrowser启用,直到您的脚本正常工作(或者它再次停止工作)(documentation here ),其他两个一直在。

答案 1 :(得分:4)

我相信Kinopiko已经明确了这个问题。

我将补充一点,如果您打算使用CGI.pm,则不应手动生成标题。相反,请使用CGI::header

此外:

print "<html><head><title></title></head></body>";

当您打算使用开头标记时,请注意body的结束标记。

最后,但绝对不是最不重要的,你应该

use strict;
use warnings;
在你的脚本中