Perl-SQLite3:基本问题

Perl-SQLite3:基本问题,perl,sqlite,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"

我承认我已经有一段时间没有使用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;


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

my $login = "admin@xxxxx.com";
很可能会以

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

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

my $login = 'admin@xxxxx.com';
或者你可以用

my $login = "admin\@xxxxx.com";
防止@开始插值。 您的脚本可能还有其他问题,但这是最明显的问题

奇怪的是

还有一件事。。。 还有一件事:你已经有父亲了,但是

use warnings;
use strict;
use CGI::Carp qw(fatalsToBrowser warningsToBrowser);
可能会在浏览器上给您一个关于未初始化值的警告,因此可能值得打开
warningsToBrowser
,直到您的脚本似乎正在工作(或者如果它再次停止工作)(),并且其他两个始终打开。

我相信已经找到了问题所在

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

此外:


在你的脚本中。

不会发出警告,因为他没有启用警告。我已经按照你的建议更改了帖子。同意;他缺少
使用严格;使用警告Kinopiko&Sinan,非常感谢你们两位。我确实对perl生疏了。
my $login = "admin\@xxxxx.com";
use warnings;
use strict;
use CGI::Carp qw(fatalsToBrowser warningsToBrowser);
print "<html><head><title></title></head></body>";
use strict;
use warnings;