我承认自从我使用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;
Run Code Online (Sandbox Code Playgroud)
什么都不返回,但是当使用相同的查询使用sqlite3登录时,我得到了一个结果集.当我更改查询时,我也得到一个结果集
my $sql = qq`SELECT ss_OrderID FROM ss_ORDER WHERE ss_Email=?`;
Run Code Online (Sandbox Code Playgroud)
至
my $sql = qq`SELECT ss_OrderID FROM ss_ORDER`;
Run Code Online (Sandbox Code Playgroud)
小智 13
显而易见的问题是双引号内的@:
my $login = "admin@xxxxx.com";
Run Code Online (Sandbox Code Playgroud)
可能会出现
$login = "admin.com"
Run Code Online (Sandbox Code Playgroud)
并且,如果您打开了警告,则会在日志文件中打印一条警告,因为Perl将@xxxx视为一个数组并尝试对其进行插值,然后发出警告,因为它是空的.也就是说,假设您没有名为@xxxx的数组.如果你这样做,那么你将获得它在字符串中的所有值.
如果您有电子邮件地址,请在其周围使用单引号以防止@xxxx作为数组进行插值:
my $login = 'admin@xxxxx.com';
Run Code Online (Sandbox Code Playgroud)
或者你可以使用
my $login = "admin\@xxxxx.com";
Run Code Online (Sandbox Code Playgroud)
防止@开始插值.您的脚本可能还有其他问题,但这是最明显的问题.
奇怪的是,我只是在阅读Perl中插值的缺点.
还有一件事:你已经有了fatalsToBrowser,但是
use warnings;
use strict;
use CGI::Carp qw(fatalsToBrowser warningsToBrowser);
Run Code Online (Sandbox Code Playgroud)
可能会在你的浏览器上给你一个关于未初始化值的警告,因此可能值得继续warningsToBrowser
,直到你的脚本看起来正常工作(或者如果它再次停止工作)(这里的文档),并且其他两个总是在.
归档时间: |
|
查看次数: |
1099 次 |
最近记录: |