yuweixian4230 发表于 2011-12-21 08:44

处理表单(GET) (5)

<div>代码: <a href=".http://blog.chinaunix.net/attachment/attach/22/66/62/482266624882456d4c7031f3215dd79182e3494477.rar" target="_blank" target="_blank"><img src="/blog/image/attachicons/rar.gif" align="absmiddle" border="0">&nbsp;程序.rar </a>&nbsp; <br><br>对于CGI来说,处理表单是它的重头戏,今天我们来看看CGI如何处理HTML的表单。</div>
<div>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><b style=""><span style="font-size: 16pt; font-family: 宋体;">处理表单(</span></b><b style=""><span style="font-size: 16pt;" lang="EN-US">GET</span></b><b style=""><span style="font-size: 16pt; font-family: 宋体;">)</span></b></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><br><b style=""><span style="font-size: 16pt; font-family: 宋体;"></span></b><span class="-10"><span style="font-size: 10pt; font-family: 'Times New Roman';" lang="EN-US"></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><span class="-10"><span style="font-size: 10pt;">现在大多数的</span></span><span class="-10"><span style="font-size: 10pt; font-family: 'Times New Roman';" lang="EN-US">CGI</span></span><span class="-10"><span style="font-size: 10pt;">脚本用来处理表单输入,处理表单的过程和上面直接在</span></span><span class="-10"><span style="font-size: 10pt; font-family: 'Times New Roman';" lang="EN-US">URL</span></span><span class="-10"><span style="font-size: 10pt;">中调用</span></span><span class="-10"><span style="font-size: 10pt; font-family: 'Times New Roman';" lang="EN-US">CGI</span></span><span class="-10"><span style="font-size: 10pt;">脚本的情况有些不同。一个<font size="4">表单通常分为两个部分</font>:</span></span><font color="#800080" size="4"><span class="-10"><span style="font-size: 10pt; font-family: 'Times New Roman';" lang="EN-US">HTML</span></span></font><span class="-10"><span style="font-size: 10pt;"><font color="#800080" size="4">表单格式</font>和<font color="#800080" size="4">处理数据的脚本</font>,处理程序由</span></span><span class="-10"><span style="font-size: 10pt; font-family: 'Times New Roman';" lang="EN-US">&lt;FORM&gt;</span></span><span class="-10"><span style="font-size: 10pt;">标签的</span></span><span class="-10"><span style="font-size: 10pt; font-family: 'Times New Roman';" lang="EN-US">ACTION</span></span><span class="-10"><span style="font-size: 10pt;">属性指定,每个输入区都有一个</span></span><span class="-10"><span style="font-size: 10pt; font-family: 'Times New Roman';" lang="EN-US">NAME</span></span><span class="-10"><span style="font-size: 10pt;">属性用来称呼表单元素,当表单数据被递交给</span></span><span class="-10"><span style="font-size: 10pt; font-family: 'Times New Roman';" lang="EN-US">ACTION</span></span><span class="-10"><span style="font-size: 10pt;">中定义的处理程序时,</span></span><span class="-10"><span style="font-size: 10pt; font-family: 'Times New Roman';" lang="EN-US">NAME</span></span><span class="-10"><span style="font-size: 10pt;">和其输入内容被以数字或字符的形式保存在环境变量中,脚本程序再通过读取环境变量的方式获得用户输入,根据编程语言的不同获取环境变量的方式也不同,</span></span><span class="-10"><span style="font-size: 10pt; font-family: 'Times New Roman';" lang="EN-US">C</span></span><span class="-10"><span style="font-size: 10pt;">语言中可以通过</span></span><span class="-10"><span style="font-size: 10pt; font-family: 'Times New Roman';" lang="EN-US">stdlib</span></span><span class="-10"><span style="font-size: 10pt;">库函数</span></span><span class="-10"><span style="font-size: 10pt; font-family: 'Times New Roman';" lang="EN-US">getenv</span></span><span class="-10"><span style="font-size: 10pt;">来获得环境变量。</span></span><span class="-10"><span style="font-size: 10pt; font-family: 'Times New Roman';" lang="EN-US"></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><span class="-10"><span style="font-size: 10pt;"><br></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><span class="-10"><span style="font-size: 10pt;">表单从浏览器发给服务器有两种方法(</span></span><span class="-10"><span style="font-size: 10pt; font-family: 'Times New Roman';" lang="EN-US">METHOD</span></span><span class="-10"><span style="font-size: 10pt;">属性):</span></span><font color="#800080" size="4"><span class="-10"><span style="font-size: 10pt; font-family: 'Times New Roman';" lang="EN-US">GET</span></span><span class="-10"><span style="font-size: 10pt;">和</span></span><span class="-10"><span style="font-size: 10pt; font-family: 'Times New Roman';" lang="EN-US">POST</span></span></font><span class="-10"><span style="font-size: 10pt;">。</span></span><span class="-10"><span style="font-size: 10pt; font-family: 'Times New Roman';" lang="EN-US"><br></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><span class="-10"><span style="font-size: 10pt; font-family: 'Times New Roman';" lang="EN-US">GET</span></span><span class="-10"><span style="font-size: 10pt;">方法将数据打包放在环境变量</span></span><span class="-10"><span style="font-size: 10pt; font-family: 'Times New Roman';" lang="EN-US">QUERY_STRING</span></span><span class="-10"><span style="font-size: 10pt;">中作为</span></span><span class="-10"><span style="font-size: 10pt; font-family: 'Times New Roman';" lang="EN-US">URL</span></span><span class="-10"><span style="font-size: 10pt;">整体的一部分传递给服务器。</span></span><span class="-10"><span style="font-size: 10pt; font-family: 'Times New Roman';" lang="EN-US"><br></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><span class="-10"><span style="font-size: 10pt; font-family: 'Times New Roman';" lang="EN-US">POST</span></span><span class="-10"><span style="font-size: 10pt;">做很多类型</span></span><span class="-10"><span style="font-size: 10pt; font-family: 'Times New Roman';" lang="EN-US">GET</span></span><span class="-10"><span style="font-size: 10pt;">的事情,但是它分离地传递数据给脚本的,程序要通过标准输入或得数据,</span></span><span class="-10"><span style="font-size: 10pt; font-family: 'Times New Roman';" lang="EN-US">POST</span></span><span class="-10"><span style="font-size: 10pt;">方式不会改变数据,也就是说同样的数据可以多次提交而不必重新输入。当数据量超过</span></span><span class="-10"><span style="font-size: 10pt; font-family: 'Times New Roman';" lang="EN-US">1024</span></span><span class="-10"><span style="font-size: 10pt;">时只能使用</span></span><span class="-10"><span style="font-size: 10pt; font-family: 'Times New Roman';" lang="EN-US">POST</span></span><span class="-10"><span style="font-size: 10pt;">来传递,由于</span></span><span class="-10"><span style="font-size: 10pt; font-family: 'Times New Roman';" lang="EN-US">GET</span></span><span class="-10"><span style="font-size: 10pt;">将数据直接放到</span></span><span class="-10"><span style="font-size: 10pt; font-family: 'Times New Roman';" lang="EN-US">URL</span></span><span class="-10"><span style="font-size: 10pt;">中,数据的传输也就变得很不安全了。</span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><br><span class="-10"><span style="font-size: 10pt;"></span></span><span class="-10"><span style="font-size: 10pt; font-family: 'Times New Roman';" lang="EN-US"></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><span class="-10"><span style="font-size: 10pt;">表单输入的数据通过</span></span><span class="-10"><span style="font-size: 10pt; font-family: 'Times New Roman';" lang="EN-US">URL</span></span><span class="-10"><span style="font-size: 10pt;">编码后传输到服务器端,我们有必要了解一下</span></span><span class="-10"><span style="font-size: 10pt; font-family: 'Times New Roman';" lang="EN-US">URL</span></span><span class="-10"><span style="font-size: 10pt;">的编码规则:</span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><br><span class="-10"><span style="font-size: 10pt;"></span></span><span class="-10"><span style="font-size: 10pt; font-family: 'Times New Roman';" lang="EN-US"></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 39pt; text-indent: -18pt;"><span class="-10"><span style="font-size: 10pt; font-family: 'Times New Roman';" lang="EN-US"><span style="">1、<span style="font: 7pt 'Times New Roman';">&nbsp; </span></span></span></span><span class="-10"><span style="font-size: 10pt;">每个</span></span><span class="-10"><span style="font-size: 10pt; font-family: 'Times New Roman';" lang="EN-US">name/value</span></span><span class="-10"><span style="font-size: 10pt;">以</span></span><span class="-10"><span style="font-size: 10pt; font-family: 'Times New Roman';" lang="EN-US">name=valu</span></span><span class="-10"><span style="font-size: 10pt;">的形式配对出现,每对</span></span><span class="-10"><span style="font-size: 10pt; font-family: 'Times New Roman';" lang="EN-US">name/valu</span></span><span class="-10"><span style="font-size: 10pt;">之间用</span></span><span class="-10"><span style="font-size: 10pt; font-family: 'Times New Roman';" lang="EN-US">&amp;</span></span><span class="-10"><span style="font-size: 10pt;">分隔</span></span><span class="-10"><span style="font-size: 10pt; font-family: 'Times New Roman';" lang="EN-US"></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 39pt; text-indent: -18pt;"><span class="-10"><span style="font-size: 10pt; font-family: 'Times New Roman';" lang="EN-US"><span style="">2、<span style="font: 7pt 'Times New Roman';">&nbsp; </span></span></span></span><span class="-10"><span style="font-size: 10pt;">若用户没有对某个</span></span><span class="-10"><span style="font-size: 10pt; font-family: 'Times New Roman';" lang="EN-US">name</span></span><span class="-10"><span style="font-size: 10pt;">赋值,则以“</span></span><span class="-10"><span style="font-size: 10pt; font-family: 'Times New Roman';" lang="EN-US">name=</span></span><span class="-10"><span style="font-size: 10pt;">”的形式出现</span></span><span class="-10"><span style="font-size: 10pt; font-family: 'Times New Roman';" lang="EN-US"></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 39pt; text-indent: -18pt;"><span class="-10"><span style="font-size: 10pt; font-family: 'Times New Roman';" lang="EN-US"><span style="">3、<span style="font: 7pt 'Times New Roman';">&nbsp; </span></span></span></span><span class="-10"><span style="font-size: 10pt;">任何特殊字符以百分号</span></span><span class="-10"><span style="font-size: 10pt; font-family: 'Times New Roman';" lang="EN-US">%</span></span><span class="-10"><span style="font-size: 10pt;">用十六进制编码。</span></span><span class="-10"><span style="font-size: 10pt; font-family: 'Times New Roman';" lang="EN-US"></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 39pt; text-indent: -18pt;"><span class="-10"><span style="font-size: 10pt; font-family: 'Times New Roman';" lang="EN-US"><span style="">4、<span style="font: 7pt 'Times New Roman';">&nbsp; </span></span></span></span><span class="-10"><span style="font-size: 10pt;">输入区的空格将以“</span></span><span class="-10"><span style="font-size: 10pt; font-family: 'Times New Roman';" lang="EN-US"> </span></span><span class="-10"><span style="font-size: 10pt;">”显示</span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt 39pt; text-indent: -18pt;"><br><span class="-10"><span style="font-size: 10pt;"></span></span><span class="-10"><span style="font-size: 10pt; font-family: 'Times New Roman';" lang="EN-US"></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt;"><span class="-10"><span style="font-size: 10pt;">要想得到用户输入的数据就必须对传递进来的</span></span><span class="-10"><span style="font-size: 10pt; font-family: 'Times New Roman';" lang="EN-US">URL</span></span><span class="-10"><span style="font-size: 10pt;">编码进行解码,解码有很多工具可用,比如</span></span><span class="-10"><span style="font-size: 10pt; font-family: 'Times New Roman';" lang="EN-US">CGIC</span></span><span class="-10"><span style="font-size: 10pt;">库中就已经对解码进行了包装,常用的工具还有</span></span><font color="#F00000" size="4"><span class="-10"><span style="font-size: 10pt; font-family: 'Times New Roman';" lang="EN-US">uncgi</span></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span class="-10"><span style="font-size: 10pt;"><br></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span class="-10"><span style="font-size: 10pt;">我们以简单的乘法为例说明表单的提交</span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><br><span class="-10"><span style="font-size: 10pt;"></span></span><span class="-10"><span style="font-size: 10pt; font-family: 'Times New Roman';" lang="EN-US"></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span class="-10"><span style="font-size: 10pt; font-family: 'Times New Roman';" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span class="-10"><span style="font-size: 10pt;">先建立一个乘法表单,有<font size="4">两个输入区</font>,分别是乘数和被乘数,一个提交按钮,当<font size="4">点击提交按钮时,显示结果</font></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><br><span class="-10"><span style="font-size: 10pt;"></span></span><span class="-10"><span style="font-size: 10pt; font-family: 'Times New Roman';" lang="EN-US"></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span class="-10"><span style="font-size: 10pt; font-family: 'Times New Roman';" lang="EN-US"><span style="">&nbsp;</span>multiple.html</span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span class="-10"><span style="font-size: 10pt; font-family: 'Times New Roman';" lang="EN-US"><br></span></span></p>
<p class="Consolas11" style="margin: 0cm 0cm 0pt;"><span class="-10"><span style="font-size: 10pt; font-family: Consolas;" lang="EN-US">&lt;from action="http://192.168.44.128/cgi-bin/mult.cgi"&gt;</span></span></p>
<p class="Consolas11" style="margin: 0cm 0cm 0pt;"><span class="-10"><span style="font-size: 10pt; font-family: Consolas;" lang="EN-US"></span></span></p><div>&lt;label&gt;Multiplicand 1: &lt;input name="m" size="5"&gt;&lt;/label&gt;</div><p></p>
<p class="Consolas11" style="margin: 0cm 0cm 0pt;"><span class="-10"><span style="font-size: 10pt; font-family: Consolas;" lang="EN-US"></span></span></p><div>&lt;label&gt;Multiplicand 2: &lt;input name="n" size="5"&gt;&lt;/label&gt;</div><p></p>
<p class="Consolas11" style="margin: 0cm 0cm 0pt;"><span class="-10"><span style="font-size: 10pt; font-family: Consolas;" lang="EN-US"></span></span></p><div>&lt;input type="submit" value="Multiply!"&gt;</div><p></p>
<p class="Consolas11" style="margin: 0cm 0cm 0pt;"><span class="-10"><span style="font-size: 10pt; font-family: Consolas;" lang="EN-US">&lt;/form&gt;</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span class="-10"><span style="font-size: 10pt;">然后在</span></span><span class="-10"><span style="font-size: 10pt; font-family: 'Times New Roman';" lang="EN-US">/var/www/cgi-bin</span></span><span class="-10"><span style="font-size: 10pt;">目录下建立</span></span><span class="-10"><span style="font-size: 10pt; font-family: 'Times New Roman';" lang="EN-US">mult.c</span></span><span class="-10"><span style="font-size: 10pt;">文件并编译成</span></span><span class="-10"><span style="font-size: 10pt; font-family: 'Times New Roman';" lang="EN-US">mult.cgi</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span class="-10"><span style="font-size: 10pt; font-family: 'Times New Roman';" lang="EN-US">mult.c</span></span></p>
<p class="Consolas11" style="margin: 0cm 0cm 0pt;"><span class="-10"><span style="font-size: 10pt; font-family: Consolas;" lang="EN-US">#include &lt;stdio.h&gt;</span></span></p>
<p class="Consolas11" style="margin: 0cm 0cm 0pt;"><span class="-10"><span style="font-size: 10pt; font-family: Consolas;" lang="EN-US">#include &lt;stdlib.h&gt;</span></span></p>
<p class="Consolas11" style="margin: 0cm 0cm 0pt;"><span class="-10"><span style="font-size: 10pt; font-family: Consolas;" lang="EN-US">int main(){</span></span></p>
<p class="Consolas11" style="margin: 0cm 0cm 0pt;"><span class="-10"><span style="font-size: 10pt; font-family: Consolas;" lang="EN-US"><span style="">&nbsp;</span></span></span><span class="-10"><span style="font-size: 10pt; font-family: Consolas;" lang="PT-BR">char *data;</span></span></p>
<p class="Consolas11" style="margin: 0cm 0cm 0pt;"><span class="-10"><span style="font-size: 10pt; font-family: Consolas;" lang="PT-BR"><span style="">&nbsp;</span>long m,n;</span></span></p>
<p class="Consolas11" style="margin: 0cm 0cm 0pt;"><span class="-10"><span style="font-size: 10pt; font-family: Consolas;" lang="PT-BR"><span style="">&nbsp;</span></span></span><span class="-10"><span style="font-size: 10pt; font-family: Consolas;" lang="EN-US">printf("%s%c%c\n","Content-Type:text/html;charset=iso-8859-1",13,10);</span></span></p>
<p class="Consolas11" style="margin: 0cm 0cm 0pt;"><font color="#0000ff"><span class="10"><span style="font-size: 10pt;" lang="EN-US"><font face="Calibri">//</font></span></span><span class="10"><span style="font-size: 10pt; font-family: 宋体;">打印</span></span><span class="10"><span style="font-size: 10pt;" lang="EN-US"><font face="Calibri">HTML</font></span></span><span class="10"><span style="font-size: 10pt; font-family: 宋体;">头</span></span><span class="10"><span style="font-size: 10pt;" lang="EN-US"></span></span></font></p>
<p class="Consolas11" style="margin: 0cm 0cm 0pt;"><span class="-10"><span style="font-size: 10pt; font-family: Consolas;" lang="EN-US"><span style="">&nbsp;</span>printf("&lt;title&gt;Multiplication results&lt;/title&gt;\n");</span></span></p>
<p class="Consolas11" style="margin: 0cm 0cm 0pt;"><span class="-10"><span style="font-size: 10pt; font-family: Consolas;" lang="EN-US"><span style="">&nbsp;</span></span></span><span class="-10"><span style="font-size: 10pt; font-family: Consolas;" lang="PT-BR">printf("&lt;h3&gt;Multiplication results&lt;/h3&gt;\n");</span></span></p>
<p class="Consolas11" style="margin: 0cm 0cm 0pt;"><span class="-10"><span style="font-size: 10pt; font-family: Consolas;" lang="PT-BR"><span style="">&nbsp;</span></span></span><span class="-10"><span style="font-size: 10pt; font-family: Consolas;" lang="EN-US">data=getenv("QUERY_STRING");</span></span></p>
<p class="Consolas11" style="margin: 0cm 0cm 0pt;"><font color="#0000ff"><span class="10"><span style="font-size: 10pt;" lang="EN-US"><font face="Calibri">//</font></span></span><span class="10"><span style="font-size: 10pt; font-family: 宋体;">取得环境变量</span></span><span class="10"><span style="font-size: 10pt;" lang="EN-US"></span></span></font></p>
<p class="Consolas11" style="margin: 0cm 0cm 0pt;"><span class="-10"><span style="font-size: 10pt; font-family: Consolas;" lang="EN-US"><span style="">&nbsp;</span>if(data==NULL)</span></span></p>
<p class="Consolas11" style="margin: 0cm 0cm 0pt;"><span class="-10"><span style="font-size: 10pt; font-family: Consolas;" lang="EN-US"><span style="">&nbsp;&nbsp; </span>printf("<p>Error!Error in passing data to script</span></span></p>");<p></p>
<p class="Consolas11" style="margin: 0cm 0cm 0pt;"><span class="-10"><span style="font-size: 10pt; font-family: Consolas;" lang="EN-US"><span style="">&nbsp;</span>else if(sscanf(data,"m=%ld&amp;n=%ld",&amp;m,&amp;n)!=2)</span></span></p>
<p class="Consolas11" style="margin: 0cm 0cm 0pt;"><span class="-10"><span style="font-size: 10pt; font-family: Consolas;" lang="EN-US"><span style="">&nbsp;&nbsp; </span>printf("&lt;P&gt;Error! Invalid data. Data must be numeric.");</span></span></p>
<p class="Consolas11" style="margin: 0cm 0cm 0pt;"><span class="-10"><span style="font-size: 10pt; font-family: Consolas;" lang="EN-US"><span style="">&nbsp;</span>else</span></span></p>
<p class="Consolas11" style="margin: 0cm 0cm 0pt;"><span class="-10"><span style="font-size: 10pt; font-family: Consolas;" lang="EN-US"><span style="">&nbsp;&nbsp; </span>printf("&lt;P&gt;The product of %ld and %ld is %ld.",m,n,m*n);</span></span></p>
<p class="Consolas11" style="margin: 0cm 0cm 0pt;"><span class="-10"><span style="font-size: 10pt; font-family: Consolas;" lang="EN-US"><span style="">&nbsp;</span>return 0;</span></span></p>
<p class="Consolas11" style="margin: 0cm 0cm 0pt;"><span class="-10"><span style="font-size: 10pt; font-family: Consolas;" lang="EN-US">}</span></span></p><font color="#0000ff"><span class="10"><span style="font-size: 10pt; font-family: 宋体;">可见</span><span style="font-size: 10pt;" lang="EN-US"><font face="Calibri">CGI</font></span></span><span class="10"><span style="font-size: 10pt; font-family: 宋体;">反馈给用户的信息要显示出来是一行一行的将</span><span style="font-size: 10pt;" lang="EN-US"><font face="Calibri">HTML</font></span></span><span class="10"><span style="font-size: 10pt; font-family: 宋体;">的代码打印出来的!天啦这样的话如果返回页面一复杂那还得了啊?而且想返回一个漂亮的界面都几乎是不可能的呢!应该有解决办法的!慢慢深入!<br><a href="link.php?url=http://blog.ednchina.com%2Flonghaihai%2F256845%2Fmessage.aspx" target="_blank" target="_blank"><br>http://blog.ednchina.com/longhaihai/256845/message.aspx</a><br><br></span></span></font><a href="http://blog.chinaunix.net/attachment/201106/29/22666248_1309329002jOJo.jpg" target="_blank"><img src="http://blog.chinaunix.net/attachment/201106/29/22666248_1309329002jOJo.jpg" .load="imgResize(this, 650);" ;="" border="0"></a><br><br><a href="http://blog.chinaunix.net/attachment/201106/29/22666248_1309329014KSWb.jpg" target="_blank"><img src="http://blog.chinaunix.net/attachment/201106/29/22666248_1309329014KSWb.jpg" .load="imgResize(this, 650);" ;="" border="0"></a><br><br></div>
页: [1]
查看完整版本: 处理表单(GET) (5)