首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > CGI >

用perl些cgi做网页的有关问题,小弟新手,来问个很菜的有关问题

2012-12-14 
用perl些cgi做网页的问题,小弟新手,来问个很菜的问题perl里面的语言中输入所有进入HTML FORM中的文本的语

用perl些cgi做网页的问题,小弟新手,来问个很菜的问题
perl里面的语言中输入所有进入HTML FORM中的文本的语句是什么,我用

#!/bin/perl 

&readparse; 
print "Content-type: text/html\n\n"; 
就提示The specified CGI application misbehaved by not returning a complete set of HTTP headers. The headers it did return are:
Undefined subroutine &main::readparse called at D:\web\test2.cgi line 3.
的错误,不知道要怎么改。
我是从网上教程上弄下来的,应该没什么问题的,除非是教程有误,我想利用cgi获得html文件中所填的所有表单中的信息,要怎么做到啊?类似与留言板的东东,那位大侠赐教下??
[解决办法]
呵呵,我也刚学不久。
问下&readparse;里是html文吧。如果是你这样改下,位置换下。
print "Content-type: text/html\n\n";  


&readparse;  

注意print "Content-type: text/html\n\n";下面必须要换2行,很重要,不换就会出错嘚。

第2种方法就是
print <<END;
Content-type: text/html;

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>
(html文)
</html>
END

注意END下面必须换1行,否则也会出错哎。

应该是这样吧,希望能帮你解决点问题。

[解决办法]
谢谢了,回去试试看先,我觉得空2行没必要呀,已经有2个\n了呀
还有,我用
read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'});
@pairs=split(/&/,$buffer);
foreach $pair(@pairs){ 
($name,$value)=split(/=/,$pair); 
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; 
$input_info{$name}=$value; 
}
来处理但是只能处理其中表单中的其中一个,比如说有2个文本框,好像就只能获得其中一个输入的内容,另外一个就没有效果,也没有什么规律的,比如在html中我定义一个First Name <INPUT NAME="first" TYPE=TEXT SIZE=25><BR> 我用
$first=$value;
print "Your first name is $first<BR>"; 
这样显示是正常的
但是再加上一个Last Name <INPUT NAME="last" TYPE=TEXT SIZE=25><BR> 的话
我用$first=$value[0];
$last=$value[1];
print "Your first name is $first<BR>"; 
print "Your last name is $last<BR>";
就不能显示
如果吧变量赋值为$value的话,好像只能显示最后一个变量,如last,请教高手这个是什么原因,是我那里变量类型没有设置好吗?
[解决办法]
不好意思 没看见print "Content-type: text/html\n\n";后面有\n\n...没注意哎。。
对了,你下面的value数组是提交后取得的吧?
如果是的话,把你提交那部分赋值发来看看。本人提交的一般全用hash数组接受的。
[解决办法]
hash数组你是怎么用的呢?这个我不太清楚。还有你说的第2种方法具体是什么意思啊,貌似不是cgi的字符串处理语言啊,能解释一下吗?
[解决办法]
提交的数值的话是这样的:比如我在html做了2个文本框一个name=first一个name=last用
$first=$value; 
print "Your first name is $first <BR>"; 
处理的话的value是last的值
用数组的话就不显示变量值了,什么原因?
[解决办法]
最近老眼昏花。。光看了下面没看上面?晕了。。
read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'}); 
@pairs=split(/&/,$buffer); 
foreach $pair(@pairs){  
($name,$value)=split(/=/,$pair);  
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;  
$input_info{$name}=$value;  
}
红色的地方你改下$input_info{$name}.=$value; 
而且也不是用$value来取,既然你用$input_info来接受。。。
引用
如果吧变量赋值为$value的话,好像只能显示最后一个变量
原因是你用$value来取的话,不就Last Name把你First Name那个给覆盖了。。。  
所以取值应该用%input_info来取,不过你这方法还有点缺陷,key值没设,不知道指定哪个。。最好分开来。
这是我写的,可以参考下


sub parse_form {
my $buf;
if ($ENV{'REQUEST_METHOD'} eq "POST") {


read(STDIN, $buf, $ENV{'CONTENT_LENGTH'});
} else {
$buf = $ENV{'QUERY_STRING'};
}

undef(%in);
foreach ( split(/&/, $buf) ) {
my ($key, $val) = split(/=/);
$key =~ tr/+/ /;
$key =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("H2", $1)/eg;
$val =~ tr/+/ /;
$val =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("H2", $1)/eg;


# 特殊字符转换
$val =~ s/&/&amp;/g;
$val =~ s/"/&quot;/g;
$val =~ s/</&lt;/g;
$val =~ s/>/&gt;/g;
$val =~ s/\r\n/<br>/g;
$val =~ s/\r/<br>/g;
$val =~ s/\n/<br>/g;

$in{$key} .= "\0" if (defined($in{$key}));
$in{$key} .= $val;
}
}




[解决办法]
如果我用%input_info来取变量值的话,那么要怎么表示html里的文本输入框呢?是$input_info{$文本框名称}这样吗?
还有你说我key值没设的话,要怎么设呢?key值是什么东东啊?

[解决办法]
原理是这样,假如页面上有2个text控件
<input type="text" name="text1">
<input type="text" name="text2">
在文本里输入值(假如text1的value是A,text1的value是B),提交后(用我那sub parse_form方法) 可以得到%in这样的hash数组
在这之前 你可以先看下$buf里面是些什么值。
本例的话$buf里面结构是text1=A&text2=B很像连接地址后面传值吧
然后foreach ( split(/&/, $buf) )将text1=A和text2=B分开,循环里面my ($key, $val) = split(/=/);
把text1和A分开,还有text2和B分开,分别存到$key, $val中。
最后$in{$key} .= $val;把值传到$in这个hash数组中。
$key是控件name名,$val是控件值。
取就$in{控件名};  就可以取到了。
这样明白了吧


[解决办法]
这样的话就很明白了,谢谢你啊
[解决办法]
解决就结贴吧。。呵呵
[解决办法]
好像没那么简单,呵呵.

热点排行