源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

不错的一篇学习CGI脚本(脚本)

  • 时间:2021-05-03 03:50 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:不错的一篇学习CGI脚本(脚本)
[b]学习CGI脚本[/b](脚本)CGI 意思为 Common Gateway Interface, 一种基于浏览器的输入、在Web服务器上运行的程序方法. CGI脚本 使你的浏览器与用户能交互,为了在数据库中寻找一个名词, 提供你写入的评论,或者从一个表单中选择几个条目并且能得到一个明确的回答. 如果你曾经遇到过在web上填表或进行搜索, 你就是用的CGI脚本. 你那时也许没有意识到,因为大部分工作是在服务器上运行的,你看到的只是结果. 作为一个网页设计者, 你创建客户端的 CGI脚本, 服务器端的程序用来处理用户输入, 结果返回给用户. 在这里你将学习关于CGI脚本的一切: [list] [*]CGI脚本是什么?它是怎样工作的 [/*][*]一个CGI脚本输出象什么? [/*][*]怎样用参数或无参数创建一个CGI脚本 [/*][*]怎样创建一个返回规定响应的CGI脚本 [/*][*]怎样创建一个输入表单的CGI脚本 [/*][*]有关在使用CGI脚本中的问题 [/*][*]你能在脚本中使用的CGI变量 [/*][/list]
本章节假设在UNIX系统下的。
[center]

[url=http://www.banqiao.org/writing/cgi/19twp01.gif]图1. 从浏览器到服务器到脚本到程序[/url] 记住再回来噢![/b] 这有个简短的示意解释: [list=1] [*]一个URL指向一个CGI脚本. 一个CGI脚本的URL能如普通的URL一样在任何地方出现。 [/*][*]服务器接收请求, 按照那个URL指向的脚本文件(注意文件的位置和扩展名),执行脚本. [/*][*]脚本执行基于输入数据的操作,包括查询数据库、计算数值或调用系统中其他程序. [/*][*]脚本产生某种Web服务器能理解的输出结果. [/*][*]服务器接收来自脚本的输出并且把它传回浏览器,让用户了解结果。 [/*][/list]

[url=http://www.banqiao.org/writing/cgi/19twp02.gif]图2. 带有一个脚本连接的页.[/url][/b] Display Date处是个指向CGI脚本的连接. 它的HTML是这样的:
<A HREF="http://www.popchina.com/cgi-bin/getdate">Display the Date</A>
说明是个CGI脚本是因为这里面有个cgi-bin的路径. 在许多服务器cgi-bin是仅能够放置CGI脚本的目录. 当你选择这个连接时, 你的浏览器将向www.popchina.com服务器提出请求. 服务器接收这个请求计算出URL处的脚本文件名然后执行这个脚本. 这个getdate脚本, 在UNIX系统中执行是这样的:
#!/bin/sh


echo Content-type: text/plain


echo


/bin/date
第一行是个特殊的命令,告诉UNIX系统这是个shell脚本; 真实的情况是从这行开始的下一行,这个脚本做两件事:它输出行Content-type: text/plain, 接着开始一个空行;第二, 它调用UNIX系统时间date程序, 这样输出日期和时间. 脚本执行后输出应该这样:
Content-type: text/plain


Tue Oct 25 16:15:57 EDT 1994
这个Content-type是什么东东?它是个特殊的编码,Web服务器用来告诉浏览器输出这个文本是什么类型的. 这与HTML中Content-type含义是一样的。 这样浏览器的输出就如图3. [b][url=http://www.banqiao.org/writing/cgi/19twp03.gif]图3 date脚本输出结果.[/url][/b] 这是最基本的,实际情况要复杂得多,总之可以用来理解浏览器、服务器和脚本之间是怎样工作的。

[url=http://www.banqiao.org/writing/cgi/19twp04.gif]图4. 脚本的结果[/url][/b] 这是个很简单的例子, 他能这样备调用:
<A HREF="http://www.popchina.com/cgi-bin/pinglaura">Is Laura Logged in?</A>
这是没有输入的脚本,它只运行并且返回数据. 根据前面的阐述,这个脚本内容是这样:: #!/bin/sh   echo Content-type: text/html   echo "<HTML><HEAD>"   echo "<TITLE>Is Laura There?</TITLE>"   echo "</HEAD><BODY>" 为了测试我是否已经登陆系统,用who命令(我的登陆名假设为lemay), 储存结果在变量ison中. 如果我登陆, 变量ison将有些内容,否则则是空的.
ison='who | grep lemay'
试验结果及返回相应提示的脚本是这样:
if [ ! -z "$ison" ]; then


        echo "<P>Laura is logged in."</P>


else


        echo "<P>Laura isn't logged in."</P>


fi
最后关闭HTML:
echo "</BODY></HTML>"
现在你通过从命令行运行他,测试一下,你将得到一个结果说我未登陆你的系统,当然不可能的,他的输出是这样的:
Content-type: text/html


<HTML><HEAD>


<TITLE>Are You There?</TITLE>


</HEAD><BODY>


<P>Laura is not logged in.


</BODY></HTML>
这是输出的一个HTML文本,这样你的浏览器能正常显示他,因为他是个HTML文件。  
现在将他copy到你的服务器的cgi-bin目录下,去执行,如果你不能达到CGI-bin目录,你必须询问你的服务器管理者,你不能理所当然地自己建立个CGI-bin目录,那没用的。
这个例子完整的脚本如下:
#!/bin/sh

echo "Content-type: text/html"


echo

echo "<HTML><HEAD>"

echo "<TITLE>Is Laura There?</TITLE>"

echo "</HEAD><BODY>"

ison='who | grep lemay'

if [ ! -z "$ison" ]; then

        echo "<P>Laura is logged in"

else

        echo "<P>Laura isn't logged in"

fi

echo "</BODY></HTML>"

[url=/cgi-bin/myscript?arg1+arg2+arg3]当服务器接收到这个请求,它传递 arg1, arg2, 和 arg3 参数给脚本. 你然后能在脚本中使用这些参数. 这个方法有时叫查询, 因为早期它用在搜索功能中.
[/url][b]练习2: 检查是否有人登陆.[/b]
[/center]既然你知道怎样使用参数,让我们继续上面的例子pinglaura,通过修改这个例子我们得到下面这个脚本pinggeneric. 我们取个不同题目:
#!/bin/sh


echo "Content-type: text/html"


echo


echo "<HTML><HEAD>"


echo "<TITLE>Are You There?</TITLE>"


echo "</HEAD><BODY>"
在上面的例子中, 下一步应该是测试我是否登陆,在这里我们用参数${1}代替我的名字lemay,  ${1}作为第一个参数, ${2}作为第二个, ${3}作为第三个.
ison='who | grep "${1}"'


剩下的所有修改如下:
if [ ! -z "$ison" ]; then


        echo "<P>$1 is logged in"


else


        echo "<P>$1 isn't logged in"


fi
echo "</BODY></HTML>"
好了,让我们修改HTML页中的连接吧!原来是这样:
<A HREF="http://www.lne.com/cgi-bin/pinglaura">Is Laura Logged in?</A>
修改为通用查询功能后是这样,比如查询名字叫john的人是否登陆:
<A HREF="http://www.lne.com/cgi-bin/pinggeneric?john">Is John Logged in?</A>
在你的服务器上试试,看是否有结果。 [center]

[url=http://www.hyperion.com/~koreth/uncgi.html]http://www.hyperion.com/~koreth/uncgi.html[/url]. 得到原码,安装在你自己的cgi-bin目录下.
[url=http://www.banqiao.org/writing/cgi/19twp05.gif]图5. 告诉我你的名字的表单.[/url][/b] 这个输入被发给脚本, 然后发回显示一个hello的信息(间图.6). 如果你在姓名输入处不输入任何东东,会怎样?见图7. [b][url=http://www.banqiao.org/writing/cgi/19twp07.gif]图6. 姓名表单的结果.[/url][/b] [b][url=http://www.banqiao.org/writing/cgi/19twp06.gif]图7. 另一个结果.[/url][/b]
[b]修改表单的HTML[/b]
[/center]现在我们举一个真实的例子:
<FORM METHOD=POST ACTION="../cgi-bin/form-name">


</FORM>
如果你在用uncgi从input中解码, 情况有点不同. 为了是uncgi正常工作, 你首先必须调用uncgi , 如果uncgi是个目录,加上实际的脚本名, 象这样:
<FORM METHOD=POST ACTION="../cgi-bin/uncgi/form-name">


</FORM>
这样,你不必修改表单中原始的HTML; 原始的HTML可以工作得很好. [center]
[b]脚本[/b]
[/center]处理表单输入的是个CGI脚本, 让我们来仔细地看看。 在脚本中第一步是解码,在这个例子中, 我们已经使用uncgi解码输入数据, 实际这个表单已经为你做好解码. 通过建立一个uncgi的目录,一旦表单递交给服务器,服务器会自动进行解码,这样,所有的name/value已经准备就绪等待你的使用. 现在,一个例子开始部分假设是下面这样:
echo Content-type: text/html


echo


echo "<HTML><HEAD>"


echo "<TITLE>Hello</TITLE>"


echo "</HEAD><BODY>"


echo "<P>"
接下来,有两种情况要处理:一件是处理用户不输入名字的情况,一个是如果输入了向他们说hello. 这个Name元素的值, 是包含在WWW_theName环境变量中. 用一个简单的测试命令(-z), 你能查看环境变量是否是空的还是包括相应的输出值:
if [ ! -z "$WWW_theName" ]; then


    echo "Hello, "


    echo $WWW_theName


else


    echo "You don't have a name?"


fi
最后增加一个连接"go back" . 用来返回:
echo "</P><P><A HREF="../lemay/name1.html">Go Back</A></P>"


echo "</BODY></HTML>"

[url=http://www.hyperion.com/~koreth/uncgi.html]http://www.hyperion.com/~koreth/uncgi.html[/url]获得。

[url=http://www.bio.cam.ac.uk/cgi-lib]http://www.bio.cam.ac.uk/cgi-lib[/url]. 如果你决定用Perl语言处理你的表单输入,cgi-lib是个很好的库. 为了使用cgi-lib.pl,你通常要这样写: #!/usr/lib/perl
require 'cgi-lib.pl';
cgi-lib中尽管有很多子程序, 最重要的是ReadParse子程. ReadParse 读取输入方便地将name/value储存在一个Perl阵列中. 在你的Perl脚本中通常是这样调用的:
&ReadParse(*in);
此例中,阵列名是in, 可以随便取名的. 在表单输入解码后, 你能读取和处理这个name/value,方法是象下面这样:
print $in{'theName'};
这个将显示名字name是theName的值value. 如果你有多个用同样名字的name对, cgi-lib.pl用(\0)分隔多个名字. 这样可以正常处理你的脚本.

[url=http://www.bio.cam.ac.uk/cgi-lib/]http://www.bio.cam.ac.uk/cgi-lib/[/url] 了解更多的情况. 另一个处理用Perl编写的CGI地址是 [url=http://valine.ncsa.uiuc.edu/cgi_docs.html]http://valine.ncsa.uiuc.edu/cgi_docs.html[/url] .

[url=ftp://ds.internic.net/rfc/rfc1867.txt]ftp://ds.internic.net/rfc/rfc1867.txt[/url].

[url=http://www.itm.com/cgicollection/]http://www.itm.com/cgicollection/[/url] 本人汉化了一个古老的通用留言簿,大家可以拿去做自己的留言簿。[url=http://www.banqiao.org/writing/cgi/guestbook.zip]这里下载[/url]

  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部