我能够从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的值
答案 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)