在perl cgi中显示浏览器中的值

时间:2014-02-11 07:01:33

标签: perl cgi

我能够从db中获取无法在浏览器中显示的数据。 下面是代码 -

my $q = CGI->new;
print $q->header,$q->start_html('testing');
my $title = $q->param('title');
my $perl = "";

#these is displayed properly
print "<font color=blue><b>TITLE:\"$title\"</b><br>";
print "<font color=blue><b>SCRIPT:\"$title\"</b>\n";

my $dbh = DBI->connect("DBI:ODBC:test","username","password") || die "Connection error: $DBI::errstr\n";
my $sql = "select * from tablename where title = '$title'";
my $sth = $dbh->prepare($sql);
$sth->execute;
my @row = $sth->fetchrow_array;
for(my $i=1;$i<=@row;$i++)
{
    if($i == 5)
    {
    $perl = "$row[$i]";
    }
}

#below is not displayed in browser
print $q->strong($title);
print $q->strong($perl);

$sth->finish();
$dbh->disconnect;

print $q->end_html;

我只想在浏览器中打印$ title和$ perl的值。 这个程序运行正常,但无法显示$ title和$ perl的值

2 个答案:

答案 0 :(得分:2)

失败的原因对我来说并不明显,但在执行查询时应使用placeholders

my $sql = "select * from tablename where title = ?";  # placeholder
my $sth = $dbh->prepare($sql);
$sth->execute($sql);                                  # $sql is used here

占位符是问号?。这将确保正确引用您的值,并防止注入攻击。使用CGI对象中的数据而不进行消毒是非常危险的。

此外,您似乎只从数组中获取一个值,因此几乎不需要首先使用循环。你可以这么做:

my $row = $row[5];

要查看值是否在数据库中,您可以使用if (defined $row)if (@row >= 6)。 (注意,数组从0开始,所以索引为5的元素实际上是第6个元素。自从你开始循环为1时就指出这个。)

答案 1 :(得分:0)

尝试直接从命令行运行它,无需浏览器。

请参阅here here

如果您使用Perl调试器,也可以使用它:

perl -d yourprogram