用CLIPPER编写CGI程序

Author: 宋永强 Date: 2000年 第33期

  DBASE的历史实在是辉煌,但如今它已失去了许多光彩,也不再拥有往日众多的追随者,只有在邮局、税务、客房管理等特定用途上才能看到它的身影,因为人们很难找到有关资料把它与互联网联系在一起。通过CGI的帮助,我终于把它应用于互联网上。
  CGI(Common Gateway Interface,公共网关接口)的作用是把客户端浏览器发出的请求通过WWW服务器软件的管理把SERVER上的数据反映到客户端的浏览器上。CGI程序也是程序,而且在这里我们讲的是用CLIPPER写的程序。
  首先我们需要把环境建立起来:
  1.在一台WIN9x或NT计算机上安装SAMBAR公司(http://www.sambar.com)的SERVER,它是完全免费的,内建WWW、FTP及各种代理功能。建议你使用 SAMBAR的4.2版本,因为其它版本对CGI的支持有些问题。在安装时一定要注意不要使用其默认的安装路径(c:\program files\sambar),可以把它装在c:\sambar里,因为CLIPPER不支持长文件夹名或文件名。它是一个绿色软件,不向注册表添加任何内容。
  2.启动SAMBAR,打开浏览器就可以进入WEB方式的管理界面了,建议你把它配置一下,把WWW服务的端口从80改成8080,防止与你计算机上的其它WWW服务器相冲突(如PWS或IIS等)。
  3.把CLIPPER5.01安装在你的计算机上,后面我们将用它编程(假设你把它装在了d:\clipper5里面)。
  说明:下面的例子运行的环境是浏览器和SERVER同时在一台计算机上,也可以把SERVER装在一台单独的计算机上,用另一台计算机的浏览器显示,此时必须为计算机分配IP地址,而不是使用localhost。
  如果你的计算机上没安装其它WWW服务器,就不用修改端口。下面的例子都是假设你把端口改成了8080。软件安装好后,你会发现有一个c:\sambar\cgi-win的文件夹,它是系统默认的,你也可以更改默认CGI路径。以后我们开发所有的Windows CGI程序都将放在这个文件夹里。
  下面我们先编一个非常简单的程序:
  在D:\CLIPPER5\BIN里用EDIT编一个叫TEST1的PRG程序,它的功能是在浏览器上显示HELLO WORLD,程序如下:
  TEST1.PRG
  Parameters IN1, IN2, IN3
  SIZE=200
  buffer=space(SIZE)
  Target=in3
  infile=fcreate(Target)
      buffer=″HTTP/1.0 200 OK″+chr(13)
      p=len(buffer)
      fwrite(infile,buffer,p)
      buffer=″<html>″+chr(13)
      p=len(buffer)
      fwrite(infile,buffer,p)
      buffer=″<body><H1><center>HELLO WORLD</center></H1><br>″+chr(13)
      p=len(buffer)
      fwrite(infile,buffer,p)
      buffer=″</body></html>″+chr(13)
      p=len(buffer)
      fwrite(infile,buffer,p)
  fclose(infile)
  接下来用CLIPPER5提供的CL.BAT程序,把它编译并存放在C:\SAMBAR\CGI-WIN下面,然后在浏览器的URL处输入 http://localhost:8080/cgi-win/test1.exe并回车。HELLO WORLD几个大字就会跃然于你的浏览器上。
  限于篇幅所限,我只能讲些简单的例子,更实用的例子留给你自已完成吧,有问题可发E-mail到 rockoil@263.net。
  下面我们进行第二个例子TEST2.PRG。它的功能是打开一个数据库把其中ACNUMBER字段中的内容显示到浏览器上。在进行本例之前,你应准备一个D:\CLIPPER5\BIN\ACC.DBF数据文件,里面有一个ACNUMBER字段(CHAR型的),并且随便在里面添加20条以上记录。
  TEST2.PRG
  Parameters IN1, IN2, IN3
  SIZE=200
  buffer=space(SIZE)
  Target=in3
  infile=fcreate(Target)
      buffer=″HTTP/1.0 200 OK″+chr(13)
      p=len(buffer)
      fwrite(infile,buffer,p)
      buffer=″<html>″+chr(13)
      p=len(buffer)
      fwrite(infile,buffer,p)
      buffer=″<body><H1><center>AC-NO LIST</center></H1><br>″+chr(13)
      p=len(buffer)
      fwrite(infile,buffer,p)
  use d:\clipper5\bin\acc.dbf
    for I=1 to 20
ACCONTENT=ACNUMBER
  buffer=ACCONTENT+″<br>″+chr(13)
      p=len(buffer)
  fwrite(infile,buffer,p)
  skip(1)
  next
  use
      buffer=″</body></html>″+chr(13)
      p=len(buffer)
      fwrite(infile,buffer,p)
  fclose(infile)
  把它编译后拷到c:\sambar\cgi-win文件夹下,在浏览器下执行http://localhost:8080/cgi-win/test2.exe并回车。数据库中的的20条记录就会显示在用户的浏览器上。
  下面我再讲第三个例子TEST3.PRG,将HTML表单与CIPPER5的程序结合起来,完成查询工作。TEST3.PRG的功能是,在HTML表单上输入一个数字(记录号),CGI程序自动把相应的记录显示给用户的浏览器。你把它改一下就能变成一个电话号码或住址查询程序。
  TEST3.PRG
  默认情况下,你的ROOT目录是 C:\SAMBAR\DOCS文件夹,先写一个TEST3.HTM并放在那个文件夹下。
  <html>
  <title>
  THIS IS TEST3
  </title>
  <body>
  请输入记录号:
  <p>
  <form action=″/cgi-win/test3.exe″ method=post>
  <input type=text name=aaaa value=1>
  <input type=submit name=bbbb value=″ 确认 ″>
  </form>
  </body>
  </html>
  为了接收TEST3.HTM的数据,需要写一个TEST3.PRG,内容如下:
  parameters in1, in2, in3
  SIZE=200
  buffer=space(SIZE)
  buffer2=space(SIZE)
  infile=fopen(in2)
  oufile=fcreate(in3)
      num_read=fread(infile,@buffer,200)
      buffer2=″HTTP/1.0 200 OK″+chr(13)
      p=len(buffer2)
      fwrite(oufile,buffer2,p)
      buffer2=″<html>″+chr(13)
      p=len(buffer2)
      fwrite(oufile,buffer2,p)
      ch=″″
      tbf=″″
      mm=1
      epos=0
      do while .t.
         ch=substr(buffer,mm,1)
         if ch!=″&″
            tbf=tbf+ch
            mm=mm+1
            if ch==″=″
               epos=mm
            endif
         else
            exit
         endif
      enddo
      buffer2=substr(tbf,epos,2)
      use d:\clipper5\bin\acc.dbf
          go val(buffer2)
          buffer2=ACNUMBER+″</html>″+chr(13)
          p=len(buffer2)
          fwrite(oufile,buffer2,p)
      use
  fclose(infile)
  把TEST3.PRG编译后存到 C:\SAMBAR\CGI-WIN文件夹下,在浏览器的URL处输入 http://localhost:8080/test3.htm,在文本框内输入记录号后按“确认”,相应记录的ACNUMBER就会显示在浏览器上。上面的HTM也可以直接换成EXE文件,由EXE文件生成HTM文档。
  上面的这些程序都能正常运行,但有些勉强(除错处理、变量分离都需要细化)。写本文的目的仅在于介绍CLIPPER实现CGI的方法而不是具体的编程。