Apache perl CGI参数并非全部显示
我正在将大约七个字段从HTML表单传递到Perl CGI脚本 使用各种方法(POST、GET、Apache perl CGI参数并非全部显示,apache,perl,Apache,Perl,我正在将大约七个字段从HTML表单传递到Perl CGI脚本 使用各种方法(POST、GET、CGI.pm或原始代码)无法恢复某些值 就是这个代码 my $variable = $q->param('varname'); 导致大约一半的变量为空或未定义,尽管后者可能是使用JavaScript的HTML页面的巧合 我在同一个平台上编写了一个测试页面,将一个简单的表单转换为一个简单的CGI,并在其中得到了onpy一半参数的结果。赋值后剩余值为空 我试过了POST和GET。在尝试写出变量之后,
CGI.pm
或原始代码)无法恢复某些值
就是这个代码
my $variable = $q->param('varname');
导致大约一半的变量为空或未定义,尽管后者可能是使用JavaScript的HTML页面的巧合
我在同一个平台上编写了一个测试页面,将一个简单的表单转换为一个简单的CGI,并在其中得到了onpy一半参数的结果。赋值后剩余值为空
我试过了POST和GET。在尝试写出变量之后,我还尝试获取并打印查询字符串;一切都在查询字符串中。我正在为此使用CGI.pm
我试图通过创建一个只显示变量值的测试CGI代码版本来查看变量值是否已被CGI.pm
成功解析
HTML页面上的参数。结果是一组奇怪的字符串,如
CGI=HASH(0x02033)->param('qSetName')
建议这些值的赋值会导致某种类型的转换,因此我无法判断它们是否真正“包含”了正确的值
我的真实表单使用POST,所以我只是注释掉了CGI.pm
代码,并在STDIN上迭代,它拥有它应该拥有的所有名称-值对
我所做的一切都指向CGI.pm
,因此我将尝试重新安装它
以下是遗漏了一半变量的测试代码:
#!/usr/bin/perl;
use CGI;
my $q = new CGI;
my $subject = $q->param('qSetSubject');
my $topic = $q->param('qTopicName');
my $userName = $q->param('uName');
my $accessLevel = $q->param('accessLevel');
my $category = $q->param('qSetCat');
my $type = $q->param('qSetType');
print "Content-Type: text/html\n\n";
print "<html>\n<head><title>Test CGI<\/title><\/head>\n<body>\n\n<h2>Here Are The Variables:<\/h2>\n";
print "<list>\n";
print "<li>\$q->param(\'qSetSubject\') = $subject\n";
print "<li>\$q->param(\'qTopicName\') = $topic\n";
print "<li>\$q->param(\'uName\') = $userName\n";
print "<li>\$q->param(\'qSetCat\') = $accessLevel\n";
print "<li>\$q->param(\'qSetType\') = $category\n";
print "<li>\$q->param(\'accessLevel\') = $type\n";
print "<\/list>\n";
我尝试合并池上的代码
%NAMES = (
seqNum => 'seqNum',
uName => 'userName',
qSetName => 'setName',
accessLevel => 'accessLevel',
qSetCat => 'category',
qTopicName => 'topic',
qSetType => 'type',
qSetSubject => 'subject',
);
use CGI;
my $cgi = CGI->new();
print "Content-Type:text/html\n\n";
#print($cgi->header('text/plain'));
for my $name ($cgi->param) {
for ($cgi->param($name)) {
#print("$name: ".( defined($_) ? $_ : '[undef]' )."\n");
print "$NAMES{$name} = $_\n";
${$NAMES{$name}} = $_;
}
}
print "<html>\n<head><title>Test CGI<\/title><\/head>\n<body>\n\n<h2>Here Are The Variables:<\/h2>\n";
print "Hello World!\n";
print "<list>\n";
print "<li>\$q->param(\'qSetSubject\') = $subject\n";
print "<li>\$q->param(\'qTopicName\') = $topic\n";
print "<li>\$q->param(\'uName\') = $userName\n";
print "<li>\$q->param(\'qSetCat\') = $accessLevel\n";
print "<li>\$q->param(\'qSetType\') = $category\n";
print "<li>\$q->param(\'accessLevel\') = $type\n";
print "<\/list>\n";
%name=(
seqNum=>“seqNum”,
uName=>“用户名”,
qSetName=>“setName”,
accessLevel=>“accessLevel”,
qSetCat=>“类别”,
qTopicName=>“主题”,
qSetType=>type',
qSetSubject=>subject,
);
使用CGI;
my$cgi=cgi->new();
打印“内容类型:text/html\n\n”;
#打印($cgi->标题('text/plain'));
对于我的$name($cgi->param){
对于($cgi->param($name)){
#打印(“$name:”(已定义($\u)?$\u:“[undef]”)。“\n”);
打印“$NAMES{$name}=$\n”;
${$NAMES{$name}}=$\;
}
}
打印“\n测试CGI\n\n\n以下是变量:\n”;
打印“Hello World!\n”;
打印“\n”;
打印“\$q->param(\'qSetSubject\')=$subject\n”;
打印“ \$q->param(\'qTopicName\')=$topic\n”;
打印“ \$q->param(\'uName\')=$userName\n”;
打印“ \$q->param(\'qSetCat\')=$accessLevel\n”;
打印“ \$q->param(\'qSetType\')=$category\n”;
打印“ \$q->param(\'accessLevel\')=$type\n”;
打印“\n”;
您正在接收
qSetSubject: precalculus
qTopicName: polar coordinates
uName: kjtruitt
accessLevel: private
category: mathematics
type: grid-in
所以
应替换为
my $category = $q->param('category');
my $type = $q->param('type');
你太不精确了。请添加到脚本的顶部,提供输出,并提供所需的输出您应该在何时执行
打印$q->param('variable')代码>。(不要把Perl代码放在引号里!)很抱歉,我没有意识到我在这篇文章的错误部分。Anway,perl不应该用双引号插入变量吗?Ikegami,我用了你的代码,所有变量都显示出来了。但我不知道为什么。你也应该避免使用符号引用${$NAMES{$name}
取消对符号引用的引用,因为$NAMES{$name}
是一个简单的字符串--变量的名称。这是非常糟糕的做法,通常的解决方案是使用散列。阅读中的符号引用。您还应该确保在您编写的每个Perl程序的顶部放置use strict
和use warnings'all'
。你还需要声明所有变量,尽可能接近它们的第一个使用点。你说我收到的是我从你的代码中收到的,不是我的。我还使用$q->param('qSetCat')等等。也许你正在看我用来帮助我合并代码的哈希。我用它为我的变量名构造符号引用,这是一个较短的路由,然后检查$q->param()中的每个值。还在啄食这个。。。。当我得到它时,我肯定会发布一个明确的答案。Re“是我从你的代码中得到的”,我知道是我写的。我不知道你为什么提到这件事。谁写的不重要。重要的是,它显示了你收到的信息关于“我正在使用$q->param('qSetCat')
等等”,我知道。就像我说的,你不应该这样。这就是你所犯错误的原因。您应该改用$q->param('qSetCat')
,因为该参数名为category
,而不是qSetCat
。对此线程表示歉意…几年后,我回到一个编码项目,数千行代码和30个左右不同的文件中出现了一些名称/变量不匹配,这是造成我问题的主要原因。这不是一个问题,而是几个问题。还有,a=应该存在的地方==。我终于找到了他们。我感谢你的帮助
my $category = $q->param('qSetCat');
my $type = $q->param('qSetType');
my $category = $q->param('category');
my $type = $q->param('type');