5.2.3 编辑文章
编辑文章包括编辑与删除两种功能。编辑文章与添加文章的不同之处在于:编辑文章要显示所编辑的内容,显示编辑内容则必须先从数据库中提取有关的内容,通过修改再次提交,这一次的提交是对数据库的更新;而删除文章则要传递文章的ID号,这样才能只删除目标文章。另外,当网站的文章较多时,为了便于编辑,必须采用分页形式来显示文章列表。
编辑文章页面的预览效果如图5-5所示。

图5-5
在Dreamweaver中,打开admin.asp页面,代码的第97~117行如下所示。
97.<%
98.elseif jhf="edit" then
99.sql="select * from mody order by t_time desc"
100.rs.open sql,conn,1,1
101.%>
102.<table class="cys" cellpadding="0" cellspacing="10" width="600" align= "center">
103.<%
104.do while not rs.eof
105.%>
106.<tr>
107.<td><%=rs("t_topic")%></td>
108.<td><%=rs("t_writer")%></td>
109.<td><%=rs("t_time")%></td>
110.<td><a href="renew.asp?id=<%=rs("id")%>">编辑</a></td>
111.<td><a href="del1.asp?id=<%=rs("id")%>">删除</a></td>
112.</tr>
113.<%
114.rs.movenext
115.loop
116.%>
117.</table>
代码释义:
第97~117行代码实现的是文章的编辑功能,既然是对文章的编辑,就要先把文章列出来,然后再进行修改或者删除。而列出文章就是从数据库中把文章提取出来,所以必然要用到SQL语句的查询功能,同时查询文章应该按降序排列,也就是越晚发表的文章,排列得越靠前,具体解释如下。
l 第99、100行,查询语句,从mody表中按t_time字段降序排列。
l 第102行,建立一个表格,把文章排列在表格中,便于控制位置。
l 第104~115行,建立一个循环,从表的开始部分查起一直到结尾,其中107~109行分别显示文章的标题、作者及发布时间;110和111行分别显示编辑及删除的链接,而且这两个链接分别进行了文章ID号的传递,这样就会有针对性地对文章进行编辑和处理。
在设计分析中已经提到过,当网站有多篇文章时,应该做成分页的形式,便于浏览,这时需要对上面的代码进行修改,修改后的代码如下。
1.elseif jhf="edit" then
2.dim pages
3.pages=request.QueryString("page")
4.if pages="" then
5.pages=1
6.end if
7.sql="select * from mody order by t_time desc"
8.rs.open sql,conn,1,1
9.rs.pagesize=8
10.if int(pages)>rs.pagecount then
11.pages=rs.pagecount
12.end if
13.if not rs.eof then
14.rs.absolutepage=int(pages)
15.end if
16.%>
17.<table class="cys" cellpadding="0" cellspacing="10" width="600" align= "center">
18.<%
19.for i=1 to rs.pagesize
20.%>
21.<tr>
22.<td><%=rs("t_topic")%></td>
23.<td><%=rs("t_writer")%></td>
24.<td><%=rs("t_time")%></td>
25.<td><a href="renew.asp?id=<%=rs("id")%>">编辑</a></td>
26.<td><a href="del1.asp?id=<%=rs("id")%>">删除</a></td>
27.</tr>
28.<%
29.rs.movenext
30.if rs.eof then
31.exit for
32.end if
33.next
34.%>
35.<tr><td colspan="5" align="center" >
36.<%if int(pages)>1 then%>
37.<a href="edit.asp?page=1&jhf=edit"> 第一页</a>
38.<a href="edit.asp?page=<%=pages-1%>&jhf=edit"> 上一页</a>
39.<% end if%>
40.<% if int(pages)<rs.pagecount then%>
41.<a href="edit.asp?page=<%=pages+1%>&jhf=edit">下一页</a>
42.<a href="edit.asp?page=<%=rs.pagecount%>&jhf=edit">最后一页</a>
43.<% end if%>
44.</td></tr>
代码释义:
制作分页网页时,要了解分页的3个属性,即pagesize、pagecount、absolutepage,它们分别代表每页显示的数量、总的页数、当前页。因为分页效果是在查询语句里显示的,所以都应以rs.pagesize、rs.pagecount、rs.absolutepage形式来表示。其实分页就是对一个变量的判断,根据变量值的不同,分别显示第几页,而这个变量是从网页本身所传递的变量值获得的,每页显示的文章数则由pagesize来决定。
第2行,先定义一个变量,这个变量就是用来判断显示第几页的。
第3行,为变量赋值,这里的request.QueryString("page")是获取链接第几页时传递的变量值,比如第一页,则page=1。
第4、5行,当变量为空时,即刚进入页面时,还没有进行翻页,这时的页面定义为第一页。
第9行,定义每页显示的文章数,这里定义为8,即列出8行。
第10、11行,当页数大于总的页数时,让它等于总的页数。当页数大于1时,就会出现分页的效果,但如果单击下一页时,可以一直单击下去,当达到总页数时还可继续单击,很显然这是不对的,为此加上这一句进行判断处理,使页面更加准确。在书写程序代码时,要切记注意语句的严密性,否则就会出现意想不到的错误。
第13、14行,如果循环还没有到达尾部,则当前页即是现在获取的页。
第30~32行,如果遍历到末尾,则直接退出for循环。这条语句是很重要的,如果不加,就会出现错误。
第37~42行,显示分页页码,在什么情况下显示第一页、下一页、上一页及最后一页等。在此要特别注意的是,一定要加上jhf=edit变量,因为这是当jhf=edit的情况下显示的页面,所以必须传递这个变量,否则一经分页,这个变量就会失效,也就不能显示编辑页面了。
从上面的页面中可见,第25和26行又链接了两个页面,要对文章进行下一步的编辑处理,必须单击链接文字所链接的页面才能完成。编辑文章所链接的网页名称是renew.asp。在这个链接页面传递了一个变量id=<%=rs("id")%,这个变量很重要,只有确定了具体的文章ID号,才能对所选择的文章进行编辑,因为每个文章的ID是唯一的,所以获得了变量的值,也就获得了所编辑的文章。
当单击“编辑文章”超链接时出现的界面如图5-6所示。

图5-6
图5-6是没加分页前的预览效果,加了分页后就会在文章显示列表下出现页码,如图5-7所示。

图5-7
当单击“编辑”超链接时,则出现编辑文章页面,如图5-5所示。
在图5-5中显示了文章的标题、作者、类别及文章内容,对其修改后单击【提交】按钮,可以更新数据表中的信息,这样就可更新文章。其renew.asp页面的代码如下。
1.<style>
2.Body{
3.SCROLLBAR-FACE-COLOR:red;
4.SCROLLBAR-HIGHLIGHT-COLOR:blue;
5.SCROLLBAR-SHADOW-COLOR: green;
6.SCROLLBAR-ARROW-COLOR:yellow;
7.SCROLLBAR-BASE-COLOR:black;
8.SCROLLBAR-DARK-SHADOW-COLOR: white;
9.margin-left: 0px;
10.margin-top: 0px;
11. background-color: #003300;
12.}
13.textarea {
14.background-color: #006633;
15.}
16..jt2 {
17.background-color: #9999FF;
18.color: #006633;
19.font-weight: bold;
20.}
21.option {
22.background-color: #9999FF;
23.border:#006699;
24.border-style:double;
25.}
26.td {
27.font-size: 12px;
28.font-weight: bold;
29.color: #FF3300;
30.}
31.a:link {
32.color: #0033FF;
33.text-decoration: none;
34.}
35.a:visited {
36.text-decoration: none;
37. color: #66FFFF;
38.}
39.a:hover {
40.text-decoration: none;
41.}
42.a:active {
43.text-decoration: none;
44.}
45.-->
46.</style>
47.<!--#include file="include/conn.asp"-->
48.<%
49.dim id
50.id=request.QueryString("id")
51.sql="select * from mody where id="&id
52.s.open sql,conn,1,1
53.%>
54.table align="center" cellpadding="0" bgcolor="#003300" cellspacing="0"
55.height="300" width="500">
56.<form action="gengxin.asp?id=<%=id%>" method="post" name="aticle">
57.<tr>
58.<td >文章标题:</td>
59.<td><input type="text" class="jt2" name="t_topic" value="<%=rs("t_topic")%>"
60.size=20 /></td>
61.</tr>
62.<tr>
63.<td>文章作者:</td>
64.<td><input type="text" class="jt2" name="t_writer" value="<%=rs
("t_writer")%>"
65.size=20/></td>
66.</tr>
67.<tr>
68.<td>文章类别:</td>
69.<td><select name="t_leibie">
70.<option value="青春诗行" <%if rs("t_leibie")="青春诗行" then
71.response.write "selected" end if%>>青春诗行</option>
72.<option value="星光灿烂" <%if rs("t_leibie")="星光灿烂" then
73.response.write "selected" end if%>>星光灿烂</option>
74.<option value="事事关心" <%if rs("t_leibie")="事事关心" then
75.response.write "selected" end if%>>事事关心</option>
76.</select></td>
77.</tr>
78.<tr>
79.<td >文章内容:</td>
80.<td><textarea name="t_content" class="jt2" rows="10"
81.cols="35"><%=rs("t_content")%></textarea></td>
82.</tr>
83.<tr>
84.<td colspan=2 align="center" ><input type="submit" class="jt2" value ="提交">
85.
86.<input type="reset" class="jt2" value="重置"></td>
87.</tr>
88.</form>
89.</table>
代码释义:
第1~46行,定义样式,主要是表格、文本框及链接的内容,与前面的一样。不过这里的滚动条是多行文本框的滚动条。
第50行,获得文章的ID号。
第51、52行,建立SQL语句并打开该查询。
第54~89行,是用一个表格制作的表单。在这个表单中分别写入了文章的标题、作者、类别及文章内容。
第59行,显示文章的标题<%=rs("t_topic")%>。
第64行,显示文章的作者<%=rs("t_writer")%>。
第69~76行,显示文章的类别,对文章类别进行判断,即当选择某一类别时,就使这个类别处于当前选择状态。即response.write "selected",因为这里的选项较少,所以用了if语句来判断,如果选项较多,用这种方法就稍显复杂些。这时,可以对原代码进行改动,使用另外一种方法实现这种功能,即数组的方法,其代码构成如下。
1.<%
2.Dim jhf
3.jhf=array("A1","A2","A3","A4","An")
4.for i=0 to int(ubound(jhf))
5.response.Write "<option value="&jhf(i)
6.if rs("t_leibie")=jhfr(i) then
7.response.write " selected"
8.end if
9.response.write ">"&jhf(i)&"</option>"
10.next%>
代码释义:
第2、3行,定义一个数组,并把各类别写入数组中。
第3~10行,用一个for语句,形成一个循环,定义数组的索引,ubound(jhf)函数返回一个数组的最大上限。如果查询的类别与数组中的值相等,就把这个类别作为当前类别加以选择,并显示出来。这种写法,对于类别较多时相对要简单些,而第一种使用if语句,则较容易理解。
第81行,显示文章的内容。
文章修改完成后,就要进行提交处理,提交的表单是action="gengxin.asp?id=<%=id%"。这个提交中参数的目的是保证修改的文章对号入座。
接下来分析gengxin.asp页面。在解读这个网页代码前,提醒读者注意,在制作网页、编写网页代码时,其关键在于自己的思路要清晰。如果思维不集中,则很难完成制作过程。这是因为网页之间的链接一环套一环。如果制作时,不能保证思路一致,或者认识模糊,那么在几个网页之间游走时,稍不注意就会混乱。一旦代码有误,再检查起来就颇费周折。因此,建议大家在写代码时要养成写制作手记的习惯,这样即使停下来,也会在下次制作中很快找到接入点。同时也希望大家每写一段代码就在浏览器中预览一次,否则一旦代码过多,再一起预览时,出错点就不易确定。随时检测,每当实现预期效果时,会有一种成就感,使制作网页成为一种乐趣。






