例子应用程序：高级反馈页

在你的站点上包含一个反馈页是个好主意。反馈页使用户能够提出问题，建议，和表示赞扬。你可以利用这些信息来改进你的站点，使它更加符合用户的要求。

建立反馈页的最简单的办法是使用HTML form把反馈信息传送给一个e_mail帐号。例如，下面的HTML页把输入form的信息传送给e_mail帐户

webmaster@yoursite.com：

<HTML>

<HEAD><TITLE>Feedback</TITLE></HEAD>

<BODY>

<H2>please enter any suggestions for improving

this web site in the form below:</H2>

<FORM ACTION=

MAILTO:webmaster@yoursite.com>

<TEXTAREA NAME=

”Feedback” COLS=30 ROWS=10 WRAP=VIRTUAL></TEXTAREA>

<P><INPUT TYPE=

”SUBMIT” VALUE=”Submit Feedbacd”>

</FORM>

</BODY>

</HTML>

对小站点来说，这个反馈form将会工作得很好。所有的反馈信息都被发送到同一个e_mail帐户。但是，如果你站点有多个管理员，你希望所有的管理员都能看到反馈信息。而且，你希望存储反馈信息，以便将来取出这些信息并做分析。在这种情况下，你应该把用户反馈信息存储在数据库的表中。

这一节讲述如何使用ADO来保存和取出用户的反馈信息。你将学习如何建立一个高级反馈form。这个工程中用到了下列表和文件：

- 表Feedback。SQL Sever数据库的一个表，用来存储用户反馈信息。

- 反馈网页。一个HTML网页，用户在这个网页中输入反馈信息。

- 接收网页。一个ASP网页，对用户输入反馈信息表示感谢，把信息存储在数据库中。

- 显示网页。一个ASP网页，从数据库中取出反馈信息并显示。

创建表Feedback

表Feedback有四个字段，分别用来存储e_mail地址，IP地址，反馈输入的时间，和反馈信息的内容。要创建这个表，从Microsoft SQL Sever程序组中启动ISQL/w。接下来，在查询窗口中输入以下的文本并执行它：

CREATE TABLE Feedback (Feed_Email VARCHAR(50),

Feed_IP VARCHAR(20),

Feed_Date DATETIME Default GetDATE()

Feed_Contents TEXT)

创建反馈网页

反馈网页是一个标准的HTML网页（见图24.1）。它有一个文本框和一个多行文本框，用户可以在文本框中输入他们的e_mail地址，在多行文本框中输入反馈信息。它还有一个用来提交反馈的提交按钮。当提交了反馈后，将显示接收网页。表24.1显示了网页Feedback的脚本。

表24.1 feedback.cfm

<HTML><HEAD><TITLE> Feedback </TITLE></HEAD><BODY BGCOLOR=#FFFFFF><H2> Please enter any suggestions for improvingthis web site in the form below: </H2><FORM METHOD="POST" ACTION="acknowledge.asp">Please enter your email address:<BR><INPUT NAME="Email" TYPE="TEXT" SIZE="30" MAXLENGTH="50"><P><TEXTAREA NAME="Contents" COLS=30 ROWS=10 WRAP=VIRTUAL></TEXTAREA><P><INPUT TYPE="SUBMIT" VALUE="Submit Feedback"></FORM></BODY></HTML>

图24.1 FeedBack页

创建接收网页

接收网页有两个作用。首先，它用来对用户提供反馈信息表示感谢（见图24.2）。第二，更重要的是，这个网页用来把反馈信息存储在表Feedback中。反馈信息的添加使用的是SQL INSERT语句，如表24.2所示。

表24.2 acknowledge.asp

<%' Retrieve form fields into variablesEmail=Replace(Request.Form("Email"),"'","''")Contents=Replace(Request.Form("Contents"),"'","''")

' Check for empty contentIF Email="" THEN Email="Unknown"IF Contents="" THEN Contents="None"

' Grab the user's IP addressUserIP=Request.ServerVariables("REMOTE_ADDR")

' Create the SQL command stringMySQL="INSERT Feedback (Feed_Email,Feed_IP,Feed_Contents) VALUES ('"&Email&"','"&UserIP&"','"&Contents&"')"

' Insert the form data into the Feedback tableSet MyConn=Server.CreateObject("ADODB.Connection")MyConn.Open "FILEDSN=d:\Program Files\Common Files\ODBC\Data Sources\MyData.dsn"MyConn.Execute MySQL%><HTML><HEAD><TITLE> Thank You </TITLE></HEAD><BODY><H2> Thank you for your suggestions! </H2></BODY></HTML>

注意

注意这个脚本中如何使用VBScript函数Replace()。函数Replace()把所有的单引号替换为双引号。这对于防止SQL Sever认为已经到了SQL命令字符串的结尾是有必要的。如果没有使用函数Replace()，一个用户输入了包含单引号的反馈信息时，INSEET语句将会导致错误。

图24.2 Acknowledgement页

创建显示网页

显示网页用来显示用户输入的反馈信息（见图24.3）。反馈信息取自表Feedback。因为一个站点也许会收到几千个反馈信息，显示网页不显示表中的所有记录，而是只显示最后25个信息。这通过使用记录集对象的Maxrecords属性来实现。

图24.3 显示用户信息页

为了显示每个反馈信息的内容，使用了一个多行文本框。使用多行文本框的好处是它们有滚动条。如果有用户输入了相当长的反馈信息，它不会占满整个显示网页。表24.3是display.asp的脚本。

表24.3 display.asp

<%' Create ADO objectsSet MyConn=Server.CreateObject("ADODB.Connection")Set RS=Server.CreateObject("ADODB.RecordSet")MyConn.Open "FILEDSN=d:\Program Files\Common Files\ODBC\Data Sources\MyData.dsn"

' Set the maximum number of records to returnRS.MaxRecords=25

' Retrieve the recordsRS.Open "SELECT * FROM Feedback ORDER BY Feed_Date DESC", MyConn%>

<HTML><HEAD><TITLE>Display Feedback</TITLE></HEAD><BODY><FORM><%' Display the recordsWHILE NOT RS.EOF%><BR><B>Date Entered:</B> <%=RS("Feed_Date")%><BR><B>Email:</B> <%=RS("Feed_Email")%><BR><B>IP Address: </B><%=RS("Feed_IP")%><BR><TEXTAREA COLS=30 ROWS=10><%=RS("Feed_Contents")%></TEXTAREA><HR><%RS.MoveNextWEND%>

</FORM></BODY>

</HTML>

<%' Close the Recordset and ConnectionRS.CloseMyConn.Close%>