我承认自从我使用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`;
答案 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;
在你的脚本中。