perl没有在页面退出时清除数据

时间:2011-11-14 11:54:09

标签: perl

对不起,如果标题没有多大意义,我会解释。

我正在学习Perl,我必须在工作中使用它,所以我正在运行测试程序。我正在将数据输入到Web表单(名称,年龄,位置)和搜索MySQL数据库以查找匹配项。当我搜索它时,返回打印在屏幕上的任何匹配结果。但是,如果我回到表单并再次搜索,知道结果将无法找到,它只显示最后找到的记录,我无法弄清楚原因。

有人能帮助我吗?

提前致谢。

# Read the standard input (sent by the form):
read(STDIN, $FormData, $ENV{'CONTENT_LENGTH'});
# Get the name and value for each form input:
@pairs = split(/&/, $FormData);
# Then for each name/value pair....
$db = DBI->connect($conn->DataSource(), $conn->Username(), $conn->Password()) or die "Unable to connect: $DBI::errstr\n";
foreach $pair (@pairs) 
{
    # Separate the name and value:
($name, $value) = split(/=/, $pair);
#replace + with space as + means space when data is collected
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
# Store values in a hash called %FORM:
$FORM{$name} = $value;
}
$query = $db->prepare("SELECT * FROM person WHERE Name = '".$FORM{'PName'}."' AND Age = '".$FORM{'Age'}."' AND Location = '".$FORM{'Location'}."'");
$query->execute();
# BIND TABLE COLUMNS TO VARIABLES
$query->bind_columns(undef, \$name, \$age, \$location);
# LOOP THROUGH RESULTS
$row = 0;
while($query->fetch())
{
push @Peeps, Person->New();
$Peeps[$row]->Name($name);
$Peeps[$row]->Age($age);
$Peeps[$row]->Location($location);
$row++;
}
$db->disconnect(); #disconnect from the db

print '<table>';
for($i = 0; $i <= $#Peeps; $i++)
{
    print "<tr><td>$Peeps[$i]{'NAME'}</td><td>$Peeps[$i]{'AGE'}</td><td>$Peeps[$i]{'LOCATION'}</td></tr>";
}
print '</table>';
$db->disconnect(); #disconnect from the db

2 个答案:

答案 0 :(得分:0)

我担心这个问题太过泛泛,对于任何有用的答案,一些代码/伪代码将是必不可少的。但是,完全基于您的要求,它看起来像浏览器缓存问题,或者可能是会话数据缓存问题。就像我说的,披露一些代码/伪代码将有助于更好地理解你的问题

答案 1 :(得分:0)

如果您正在使用mod_perl或fastcgi,其中服务器进程在多个请求上是持久的,那么全局变量(您在示例中使用的)可能不会在请求之间重置,而是保留其旧值。

在您的示例中,这意味着如果请求恰好来自同一服务器进程,则下一个请求可能会看到先前请求设置的%FORM值。

如果通过在脚本顶部添加%FORM = ();来解决问题,那么这就是您的问题。您可以通过说明例如print $test++;并查看它是否递增。

请注意,这不是真正的解决方案,我建议将您的实际代码放在一个函数或模块中,并在那里使用局部变量和参数,它也更易于维护。并使用一些可用的Web应用程序框架(最低限度为CGI.pm)。

您还需要修复SQL注入安全问题,经验法则:永远不要将变量放在SQL语句字符串中,但要执行以下操作:

$dbh->prepare("SELECT ... WHERE This = ? AND That = ?")
$dbh->execute($this, $that);