处理表单(GET)
现在大多数的CGI脚本用来处理表单输入,处理表单的过程和上面直接在URL中调用CGI脚本的情况有些不同。一个表单通常分为两个部分:HTML表单格式和处理数据的脚本,处理程序由<FROM>标签的ACTION属性指定,每个输入区都有一个NAME属性用来称呼表单元素,当表单数据被递交给ACTION中定义的处理程序时,NAME和其输入内容被以数字或字符的形式保存在环境变量中,脚本程序再通过读取环境变量的方式获得用户输入,根据编程语言的不同获取环境变量的方式也不同,C语言中可以通过stdlib库函数getenv来获得环境变量。
表单从浏览器发给服务器有两种方法(METHOD属性):GET和POST。GET方法将数据打包放在环境变量QUERY_STRING中作为URL整体的一部分传递给服务器。POST做很多类型GET的事情,但是它分离地传递数据给脚本的,程序要通过标准输入或得数据,POST方式不会改变数据,也就是说同样的数据可以多次提交而不必重新输入。当数据量超过1024时只能使用POST来传递,由于GET将数据直接放到URL中,数据的传输也就变得很不安全了。
表单输入的数据通过URL编码后传输到服务器端,我们有必要了解一下URL的编码规则:
1、 每个name/value以name=valu的形式配对出现,每对name/valu之间用&分隔
2、 若用户没有对某个name赋值,则以“name=”的形式出现
3、 任何特殊字符以百分号%用十六进制编码。
4、 输入区的空格将以“+”显示
要想得到用户输入的数据就必须对传递进来的URL编码进行解码,解码有很多工具可用,比如CGIC库中就已经对解码进行了包装,常用的工具还有uncgi
我们以简单的乘法为例说明表单的提交
先建立一个乘法表单,有两个输入区,分别是乘数和被乘数,一个提交按钮,当点击提交按钮时,显示结果
multiple.html
<from action="http://192.168.44.128/cgi-bin/mult.cgi">
<div><label>Multiplicand 1: <input name="m" size="5"></label></div>
<div><label>Multiplicand 2: <input name="n" size="5"></label></div>
<div><input type="submit" value="Multiply!"></div>
</form>
然后在/var/www/cgi-bin目录下建立mult.c文件并编译成mult.cgi
mult.c
#include <stdio.h>
#include <stdlib.h>
int main(){
char *data;
long m,n;
printf("%s%c%c\n","Content-Type:text/html;charset=iso-8859-1",13,10);
//打印HTML头
printf("<title>Multiplication results</title>\n");
printf("<h3>Multiplication results</h3>\n");
data=getenv("QUERY_STRING");
//取得环境变量
if(data==NULL)
printf("<p>Error!Error in passing data to script</p>");
else if(sscanf(data,"m=%ld&n=%ld",&m,&n)!=2)
printf("<P>Error! Invalid data. Data must be numeric.");
else
printf("<P>The product of %ld and %ld is %ld.",m,n,m*n);
return 0;
}
可见CGI反馈给用户的信息要显示出来是一行一行的将HTML的代码打印出来的!天啦这样的话如果返回页面一复杂那还得了啊?而且想返回一个漂亮的界面都几乎是不可能的呢!应该有解决办法的!慢慢深入!