原创 【原创】嵌入式CGI开发之旅——3

2009-9-1 10:40 3466 3 8 分类: MCU/ 嵌入式
对于CGI来说,处理表单是它的重头戏,今天我们来看看CGI如何处理HTML的表单。


处理表单(GET<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


现在大多数的CGI脚本用来处理表单输入,处理表单的过程和上面直接在URL中调用CGI脚本的情况有些不同。一个表单通常分为两个部分:HTML表单格式和处理数据的脚本,处理程序由<FROM>标签的ACTION属性指定,每个输入区都有一个NAME属性用来称呼表单元素,当表单数据被递交给ACTION中定义的处理程序时,NAME和其输入内容被以数字或字符的形式保存在环境变量中,脚本程序再通过读取环境变量的方式获得用户输入,根据编程语言的不同获取环境变量的方式也不同,C语言中可以通过stdlib库函数getenv来获得环境变量。


表单从浏览器发给服务器有两种方法(METHOD属性):GETPOSTGET方法将数据打包放在环境变量QUERY_STRING中作为URL整体的一部分传递给服务器。POST做很多类型GET的事情,但是它分离地传递数据给脚本的,程序要通过标准输入或得数据,POST方式不会改变数据,也就是说同样的数据可以多次提交而不必重新输入。当数据量超过1024时只能使用POST来传递,由于GET将数据直接放到URL中,数据的传输也就变得很不安全了。


表单输入的数据通过URL编码后传输到服务器端,我们有必要了解一下URL的编码规则:


1、  每个name/valuename=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的代码打印出来的!天啦这样的话如果返回页面一复杂那还得了啊?而且想返回一个漂亮的界面都几乎是不可能的呢!应该有解决办法的!慢慢深入!
PARTNER CONTENT

文章评论5条评论)

登录后参与讨论

huotingtu_505472073 2009-10-23 21:44

呵呵 确实哦,真的是不好意思,估计上当初拷贝的时候搞错了的,谢谢指点

用户226642 2009-10-13 22:36

自习回来,我又找到你的错误了。 from 啊!是form才对 汗,不过gcc也不报错,不细看还看不出来

用户226642 2009-10-13 17:13

我照文中程序运行,结果提交后没反映啊,还是提交时的页面,什么也没返回,能说下可能的原因吗?

huotingtu_505472073 2009-10-12 20:58

确认一下你表单的action提交地址是不是正确,如果没有提交成功应该是取不到值的

用户190932 2009-10-5 09:16

请教一下: 我按照文中给出的程序运行了一下,结果返回了“Error!Error in passing data to script”,QUERY_STRING居然为空,这是怎么回事??
相关推荐阅读
huotingtu_505472073 2014-01-12 22:18
嵌入式程序员面试问题集锦
这个测试适于不同水平的应试者,大多数初级水平的应试者的成绩会很差,经验丰富的程序员应该有很好的成绩。为了让你能自己决定某些问题的偏好,每个问题没有分配分数,如果选择这些考题为你所用,请自行按你的意...
huotingtu_505472073 2011-04-14 23:24
【转】一种实用的步进电机驱动电路
1 引言步进电动机是一种将电脉冲信号转换成角位移或线位移的精密执行元件,由于步进电机具有控制方便、体积小等特点,所以在数控系统、自动生产线、自动化仪表、绘图机和计算机外围设备中得到广泛应用。微电子学的...
huotingtu_505472073 2011-04-14 23:22
【转】几种微型电机驱动电路分析
 以下所述电路用于3V供电的微型直流电机的驱动,这种电机有两根引线,更换两根引线的极性,电机换向。该驱动电路要求能进行正反转和停止控制。 电路一: 如下图所示,这电路是作者最初设计的电路,P1.3、P...
huotingtu_505472073 2011-02-18 19:57
【转】集成运放组成的电压比较器
1. 功能及应用:主要用来判断输入信号电位之间的相对大小,它至少有两个输入端及一个输出端,通常用一个输入端接被比较信号Ui,另一个则接基准电压VR 定门限电压(或称阀值)的UT。输出通常仅且仅有二...
huotingtu_505472073 2011-01-26 08:05
【转】直流无刷电动机工作原理与控制方法12
研究结果表明,在半导体薄片上产生的霍尔电动势E可用下式表示: 式中RH ——霍尔系数(  );IH——控制电流(A);B——磁感应强度(T);d——薄片厚度(m);p——材料电阻率(Ω*s);...
huotingtu_505472073 2011-01-26 07:55
【转】直流无刷电动机工作原理与控制方法1
序言   由于直流无刷电动机既具有交流电动机的结构简单、运行可靠、维护方便等一系列优点,又具备直流电动机的运行效率高、无励磁损耗以及调速性能好等诸多优点,故在当今国民经济各领域应用日益普及。   一个...
我要评论
5
3
关闭 站长推荐上一条 /3 下一条