Tải bản đầy đủ (.doc) (25 trang)

hướng dẫn tạo lập forum đơn giản trên website

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (90.06 KB, 25 trang )

Hướng dẫn tạo lập forum đơn giản trên website
Yêu cầu: Cần phải biết một chút về các vấn đề sau:
- HTML
- JavaScript
- VbScript
- ASP
- Cơ sở dữ liệu Access
- IIS (Internet Infromation Service)
Nội dung tổng quát:
- Tạo folder làm việc
- Tạo cơ sở dữ liệu
- Kết nối cơ sở dữ liệu Access với ASP
- Viết các chương trình
- Chia sẻ / share thư mục thành web
- Chạy và kiểm duyệt, chỉnh sửa form nếu cần
I. Tạo cơ sở dữ liệu bằng Access
- Có thể dùng Access 2000, 2002, hoặc 97 đều được
- Tạo 1 foleder riêng cho ứng dụng Forum, ví dụ ForumDiscussion chẳng hạn
- Tạo 1 cơ sở dữ liệu Access, chẳng hạn lấy tên CSDL là Forum.MDB, chú ý cần đặt chính xác
vào thư mục tạo ở trên. Vì sau này đường dẫn sẽ dùng cho lập trình.
- Trong CSDL này tạo một bảng (chẳng hạn lấy tên là: Forum_Message), bảng này có cấu trúc
như sau:
Fielde Name Data Type Data Length, Format Description
(không bắt buộc) Các yêu cầu khác
(nếu có)
ParentMessage Number Long Integer Số thứ tự tin nhắn chính
ThreadParent Number Long Integer Số thứ tự tin nhắn phụ
AuthorName Text 100 Tác giả đưa tin
AuthorEmail Text 100 Hòm thư tác giả đưa tin
Comments Memo Nội dung tin nhắn
Topic Text 200 Chủ đề tin nhắn


ReplyCount Number Long Integer Số lần tin nhắn được thảo luận
LastThreadPost Date/Time Default: now() Lần xem gần đây nhất
DatePosted Date/Time Default: now() Ngày đưa tin nhắn lên
ID AutoNumber Long Integer Chỉ số tin nhắn Không trùng nhau
Tên các trường sẽ được dùng trong lập trình. Tốt nhất người lập trình cần phải ghi chú những
tên trường này ra giấy để sử dụng cho lập trình thuận tiện.
Tạo xong, nhập thử vào một vài bản ghi.
II. Tiến hành lập trình
Trước tiên cần chú ý rằng toàn bộ code phải đặt trong thư mục DiscussionForum tạo ở trên.
1. Thiết kế file Database.inc
- Nhiệm vụ của file này là mở cơ sở dữ liệu Access ra và khai báo biến dữ liệu dùng cho chương
trình. Cần quan tâm đến biến bản ghi rs và cmd. Trong đó rs là biến bản ghi, biến cmd biến
thực hiện 1 câu lệnh trong CSDL.
- Có thể dùng trình NodePad để soạn thảo nội dung file này. Nội dung file này không phải là file
WEB mà chỉ là 1 đoạn ASP dùng cho việc chạy kèm 1 file web khác mà thôi.
<%
sFile = request.ServerVariables("PATH_TRANSLATED")
sSplit = split(sFile, "\")
for iCtr = 0 to uBound(sSplit) - 1
sDir = sDir & sSplit(ictr) & "\"
next
sConnString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & sDir & "forum.mdb"
set conn = Server.CreateObject("ADODB.Connection")
set cmd = Server.CreateObject("ADODB.Command")
set rs = Server.CreateObject("ADODB.Recordset")
conn.open sConnString
set cmd.activeconnection = conn
%>
2. Thiết kế file foot.inc
- Mỗi file web trong Forum thường có ở dưới đáy một lời nhắc HyperLink mà bấm vào đó để

quay về diễn đàn chính. Do vậy để có thể dùng kèm các lệnh này ở các file khác nhau thì phải
thiết kế 1 file riêng. Làm cho Web sáng sủa hơn, ngắn gọn và dễ đọc hơn.
- Nội dung của file này chỉ 1 dòng duy nhất như sau:
<P><B><A HREF = 'default.asp'>Quay lai Dien Dan chinh</A>
3. Thiết kế file database_cleanup.inc
- Nhiệm vụ của file này là đóng dữ liệu đã mở lại. Tức là làm sạch các biến dữ liệu đã mở ra
trước đó như biến rs, cmd.
- Nội dung của file này bao gồm các lệnh như sau:
<%
if rs.state <> 0 then rs.close
set rs = nothing
set cmd = nothing
conn.close
set conn = nothing
%>
4. Thiết kế file default.asp
- Đây là file mặc định sẽ sử dụng khi forum bắt đầu làm việc. Đầu file sẽ kích hoạt việc mở dữ
liệu, cuối cùng sẽ đóng dữ liệu.
- Trong chương trình sẽ có việc phân trang hiện thông tin, mỗi trang chỉ có 20 dòng. Nếu số
lượng tin giao dịch trong toàn bộ sẽ được phân thành các trang.
- Việc lọc ra thông tin của một loại chủ đề nào đó chỉ cần đưa tên loại chủ đề ở đầu form và bấn
Enter.
<! #include file = "database.inc" >
<%
Function isBlank(Value)
if isNull(Value) then
bAns = true
else
bAns = trim(Value) = ""
end if

isBlank = bAns
end function
Function FixNull(Value)
if isNull(Value) then
sAns = ""
else
sAns = trim(Value)
end if
FixNull = sAns
end function
%>
<HTML>
<HEAD>
<TITLE>Dien Dan Tin hoc DONGDO</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=ISO-8859-1">
</HEAD>
<body bgcolor="#FFFFFF">
<CENTER><FORM ACTION = 'forum_search.asp'><b>Chon Forum:</b>
<input type="text" name="search" size="25">
<input type="submit" value="Chon" name="searchbutton">
</Form></CENTER>
<HR><center><b><font size="+1">Dien Dan Tin hoc DONGDO</font></b></center><p>
<P>
<%
cmd.CommandText = "MESSAGETHREADS"
cmd.CommandType = 4
iPageSize = 20
iPage = cint(Request.QueryString("Page"))
if iPage = 0 then iPage = 1
rs.open cmd, , 1, 3

if not rs.Eof and not rs.bof then
rs.MoveLast
lTotalRecords = rs.RecordCount
iTotalPages = int(lTotalRecords / iPageSize)
if lTotalRecords MOD iPageSize <> 0 then iTotalPages = iTotalPages + 1
if lTotalRecords <= iPageSize then
rs.MoveFirst
bOnePage = true
lPageEnd = lTotalRecords
lPageStart = 1
iTotalPages = 1
else
lPageStart = ((iPage - 1) * iPageSize) + 1
lPageEnd = lPageStart + (iPageSize - 1)
if lPageEnd >= lTotalRecords Then
lPageEnd = lTotalRecords
bLastPage = true
end if
if iPage > 1 then
rs.AbsolutePosition = ((iPage - 1) * iPageSize) + 1
else
rs.MoveFirst
end if
end if
else
bNoRecords = true
end if
%>
</SELECT></TD></FORM>
<FORM ACTION = "new_post.asp" METHOD = "POST">

<TD>
<INPUT TYPE = "SUBMIT" VALUE = "Gui tin len Dien Dan"></TD></FORM>
</tr>
</TABLE><P>
<%
if not bNoRecords then
response.write "<P><B>Trang " & iPage & " / " & iTotalPages & "</B><P>"
end if
%>
<TABLE WIDTH = 100%>
<TR>
<TD><B><FONT COLOR = "RED">Chu de</FONT></B></TD>
<TD><B><FONT COLOR = "RED">Nguoi Gui/Hoi </FONT></B></TD>
<TD ALIGN = CENTER><B><FONT COLOR = "RED">Dap tra lai</FONT></B></TD>
<TD><B><FONT COLOR = "RED">Thoi gian</FONT></B></TD></TR>
<%
if bNoRecords then
response.write "<TD COLSPAN = 4><B>There are no messages available at the present
time</B></TD>"
else
for lCtr = lPageStart to lPageEnd
response.write "<TD><A HREF='ShowMessage.asp?ID=" & rs("ID") & "'>" & rs("Topic") &
"</A></FONT></TD>"
response.write " <TD>"
response.write "<A HREF = 'mailto:" & rs("AuthorEmail") & "'>" & rs("AuthorName") & "</A>"
response.write "</FONT></TD>"
response.write "</TD><TD ALIGN = CENTER>" & rs("ReplyCount") & "</FONT></TD>"
response.write "</TD><TD>" & rs("LastThreadPost") & "</FONT></TD></TR>"
rs.movenext
Next

end if
response.write "</TABLE>"
if bOnePage = false and bNoRecords = false then
response.write "<TABLE WIDTH = '100%'><TR><TD>&nbsp;</TD></TR><TR><TD WIDTH
= '10%'>&nbsp;</TD><TD WIDTH = '60%'>"
if iPage > 1 then
sPrevQuery = "Page=" & iPage - 1
response.write "<A HREF = 'default.asp?" & sPrevQuery & "'><B><< Trang truoc</B></A>"
else
response.write "&nbsp;"
end if
response.write "</TD><TD VALIGN = TOP NOWRAP>"
if bLastPage = false then
sNextQuery = "Page=" & iPage + 1
response.write "<A HREF = 'default.asp?" & sNextQuery & "'><B>Trang tiep >></B></A>"
else
response.write "&nbsp;"
end if
response.write "<TD WIDTH = '10%'>&nbsp;</TD>"
response.write "</TD></TR></TABLE>"
response.write "<P><CENTER><FONT SIZE =-1>"
for iCtr = 1 to iTotalPages
sPageQuery = "Page=" & iCtr & sQuery
if iCtr <> iPage then
response.write "<A HREF = 'default.asp?" & sPageQuery & "'>"
else
response.write "<B>"
end if
response.write iCtr
if iCtr <> iPage then

response.write "</A>"
else
response.write "</B>"
end if
if iCtr < iTotalPages then response.write "&nbsp;&nbsp;|&nbsp;&nbsp;"
Next
response.write "</FONT></CENTER>"
end if
%>
</body>
<! #include file = "database_cleanup.inc" >
</HTML>

5. Thiết kế file new_post.asp
- Nhiệm vụ của file này là sẽ tạo ra 1 form giao diện người dùng, để người dùng đưa tin lên diễn
đàn.
- Code của file này được đề xuất viết như sau:
<%
Function prepStringForSQL(sValue)
Dim sAns
sAns = Replace(sValue, Chr(39), "''")
sAns = "'" & sAns & "'"
prepStringForSQL = sAns
End Function
sName = Session("Name")
Function isBlank(Value)
if isNull(Value) then
bAns = true
else
bAns = trim(Value) = ""

end if
isBlank = bAns
end function
Function FixNull(Value)
if isNull(Value) then
sAns = ""
else
sAns = trim(Value)
end if
FixNull = sAns
end function
%>
<HTML>
<HEAD>
<! #include file = "Validate.inc" >
<TITLE>FORUM THAO LUAN DONGDO: GUI TIN MOI LEN DIEN DAN</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=ISO-8859-1">
</HEAD>
<P>
<center><b><font color="Blue" size="+1">FORUM TIN HOC DONGDO: Gui tin moi len Dien
Dan</font></b></center><p>
<FORM Name = "InputForm" ACTION = "PreviewMessage.asp" onSubmit = 'return Validate()'
METHOD = "POST">
<TABLE>
<INPUT TYPE = "Hidden" NAME = "MessageType" VALUE = "NEW">
<TR><TD><B>Ten :</B></TD><TD><INPUT TYPE = "TEXT" NAME="Name" SIZE="50
MAXLENGTH = "100"></TD></TR>
<TR><TD><B>Email:</B></TD><TD><INPUT TYPE = "TEXT" NAME="Email" SIZE="50
MAXLENGTH = "100"></TD></TR>
<TR><TD><B>Chu de:</B></TD>

<TD><INPUT TYPE = TEXT SIZE=50 MAXLENGTH="100" NAME =
"Topic"></INPUT></TD></TR>
<TR><TD VALIGN = TOP><B>Noi dung:</B></TD>
<TD VALIGN = TOP><TEXTAREA ROWS = 8 COLS = 50 NAME =
"MESSAGE"></TEXTAREA></TD></TR>
</TABLE>
<P>
<CENTER>
<INPUT TYPE = "SUBMIT" NAME = "SubmitMessage" VALUE = "Gui Tin len Dien
dan"></FORM>
</CENTER>
<! #include file = "footer.inc" >
</body>
</HTML>
- Khi nhập dữ liệu vào Forum, để đảm bảo cho việc quản lý thông tin chính xác, nhất quán
chương trình sẽ kiểm tra một số thông số để cho forum hoạt động. Đoạn code kiểm tra dữ liệu
nhập vào được viết trong file validate.asp có nội dung như sau:
<script LANGUAGE="JAVASCRIPT">
<!
//
function Validate()
{
sAuthor = document.InputForm.Name.value
sEmail = document.InputForm.Email.value
iEmailLen = sEmail.length
iAuthorLen = sAuthor.length
sTopic = document.InputForm.Topic.value
iTopicLen = sTopic.length
if(iAuthorLen == 0) {
alert("Name is a required field")

document.InputForm.Name.focus()
return false
}
if(iEmailLen == 0) {
alert("Email Address is a required field")
document.InputForm.Email.focus()
return false
}
//check to see that at least one char in author is non-blank
var bOK = false
for(var i = 0;i<iAuthorLen;i++)
{
if(sAuthor.charAt(i) != " ")
{
bOK = true
break
}
} //end for
if(bOK == false) {
alert("Name is a required field")
document.InputForm.Name.focus()
return false
}
//check to see that at least one char in email is non-blank, @, and .
bOK = false
var bAmp = false
var bPeriod = false
for(var i = 0;i<iEmailLen;i++)
{
if(bOK==false){

if(sEmail.charAt(i) != " " && sEmail.charAt(i) != "." && sEmail.charAt(i) != "@")
{
bOK = true
if(bAmp== true && bPeriod== true) break
}
}//end if bok==false
if(sEmail.charAt(i)=="@")
{
bAmp = true
if(bPeriod==true && bOK==true) break
}
if(sEmail.charAt(i)==".")
{
bPeriod = true
if(bAmp==true && bOK==true) break
}
} //end for
if(bOK == false || bAmp == false || bPeriod == false) {
alert("The e-mail address you entered is not valid")
document.InputForm.Email.focus()
return false
}//end if
if(iTopicLen == 0) {
alert("Topic is a required field")
document.InputForm.Topic.focus()
return false
} //end if
for(var i = 0;i<iTopicLen;i++)
{
if(sTopic.charAt(i) != " ")

{
return true
}
} //end for
alert("Topic is a required field")
document.InputForm.Topic.focus()
return false
}//end function
>
</script>
- Khi đưa thông tin lên diễn đàn, người dùng có thể xem lại toàn bộ thông tin trước khi gửi lên 1
lần trước khi submit. Form và Code của đoạn trình này được đề nghị như sau:
<! #include file = "database.inc" >
<%
Function isBlank(Value)
if isNull(Value) then
bAns = true
else
bAns = trim(Value) = ""
end if
isBlank = bAns
end function
Function FixNull(Value)
if isNull(Value) then
sAns = ""
else
sAns = trim(Value)
end if
FixNull = sAns
end function

Function prepStringForSQL(sValue)
Dim sAns
sAns = Replace(sValue, Chr(39), "''")
sAns = "'" & sAns & "'"
prepStringForSQL = sAns
End Function
function ReplaceComments(sInput)
dim sAns
sAns = replace(sInput, " ", "&nbsp; ")
sAns = replace(sAns, chr(34), "&quot;")
sAns = replace(sAns, "<! ", "&lt;! ")
sAns = replace(sAns, " >", " &gt;")
ReplaceComments = sAns
end function
function HTMLFormat(sInput)
dim sAns
sAns = replace(sInput, " ", "&nbsp; ")
sAns = replace(sAns, chr(34), "&quot;")
sIllStart = "<" & chr(37)
sIllEnd = chr(37) & ">"
if instr(sAns, sIllStart) > 0 or instr(sAns, sIllEnd) > 0 then
sAns = replace(sAns, "<" & chr(37), "")
sAns = replace(sAns, chr(37) & ">", "")
bIllegal = true
end if
sAns = replace(sAns, ">", "&gt;")
sAns = replace(sAns, "<", "&lt;")
sAns = replace(sAns, vbcrlf, "<BR>")
HTMLFormat = sAns
end function

if Request("SubmitMessage") <> "" then bNew = true
if request("SubmitReply") <> "" or request("Reply") <> "" then bReply = true
if request("ApplyMessage") <> "" then bApply = true
bValid = bNew or bReply or bApply
if bApply then
sName = request("AuthorName")
sEmail = request("AuthorEmail")
bAddNew = request("MessageType") = "New"
if bAddNew then
sTopic = prepStringForSQL(Request("Topic")) & ","
sName = prepStringForSQL(sName) & ","
sEmail= prepStringForSQL(sEmail) & ","
sComments = ReplaceComments(Request("Message"))
sComments = prepStringForSQL(sComments)
sSQL = "INSERT INTO FORUM_MESSAGES (AUTHORNAME,AUTHOREMAIL,TOPIC,COMMENTS)
VALUES (" & sName & sEmail & sTopic & sComments & ")"
conn.execute sSQL
sSQL = "UPDATE FORUM_MESSAGES SET THREADPARENT = ID WHERE THREADPARENT = 0"
conn.execute sSQL
else
sOrigAuthor = Request("OrigAuthor")
if sOrigAuthor = "" then sOrigAuthor = Request.QueryString("OrigAuthor")
iThread = Request("ThreadID")
iParent = Request("ParentID")
sName = prepStringForSQL(sName) & ","
sEmail= prepStringForSQL(sEmail) & ","
sTopic = prepStringForSQL(Request("Topic")) & ","
sComments = prepStringForSQL(Request("Message"))
if iThread = 0 then iThread = iParent
sSQL = "INSERT INTO FORUM_MESSAGES

(PARENTMESSAGE,THREADPARENT,AUTHORNAME,AUTHOREMAIL,TOPIC,COMMENTS) VALUES
(" & iParent & "," & iThread & "," & sName & sEmail & sTopic & sComments & ")"
conn.execute sSQL
cmd.CommandText = "LASTMESSAGE"
cmd.CommandType = 4
set rs = cmd.Execute
sID = rs("ID")
rs.close
sSQL = "UPDATE FORUM_MESSAGES SET REPLYCOUNT = REPLYCOUNT + 1, LASTTHREADPOST
= NOW() WHERE ID = " & iThread
conn.execute sSQL
end if 'bAddNew
%>
<! #include file = "database_cleanup.inc" >
<%
response.redirect "default.asp"
end if 'bApply
%>
<HTML>
<HEAD>
<TITLE>DISCUSSON FORUM: PREVIEW MESSAGE</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=ISO-8859-1">
</HEAD>
<BODY BGCOLOR = "#FFFFFF">
<%
if not bValid then
response.write "You cannot navigate to this page without entering a forum message. Please "
response.write "return to the <A HREF = 'default.asp'>forum index</A> and try again."
response.end
end if

'Write to db and redirect home.
response.write "<HR>"
if bReply then
ParentID = Request("ParentID")
ThreadID = request("ThreadID")
sOrigAuthor = request("OrigAuthor")
end if
sTopic = request("Topic")
if sOrigAuthor = "" then sOrigAuthor = request.QueryString("OrigAuthor")
sOrigMessage = HTMLFormat(Request("Message"))
%>
<CENTER><FONT SIZE = +2 COLOR=RED><B>Xem cau truc tin
nhan</B></FONT></CENTER><P>
Please review your post. If everything is OK, click Submit below. Otherwise,
click the Back button on your browser to make corrections.<P>
<FORM ACTION = "PreviewMessage.asp" METHOD = "POST">
<% if bReply Then %>
<INPUT TYPE="HIDDEN" NAME="ParentID" VALUE="<%= ParentID %>">
<INPUT TYPE="HIDDEN" NAME="ThreadID" VALUE="<%= ThreadID %>">
<INPUT TYPE="HIDDEN" NAME="OrigAuthor" VALUE="<%= sOrigAuthor %>">
<% end if %>
<INPUT TYPE="HIDDEN" NAME="Topic" VALUE="<%= sTopic %>">
<INPUT TYPE="HIDDEN" NAME="Message" VALUE="<%= sOrigMessage %>">
<INPUT TYPE="HIDDEN" NAME="AuthorName" VALUE="<%= Request("Name") %>">
<INPUT TYPE="HIDDEN" NAME="AuthorEmail" VALUE="<%= Request("Email") %>">
<INPUT TYPE = "HIDDEN" NAME = "MessageType"
<% if bReply then
Response.Write "VALUE = 'REPLY'"
else
Response.Write "VALUE = 'New'"

end if
%>
>
<TABLE>
<TR><TD><B>Chu de:</FONT></B></TD>
<TD><%= sTopic %></TD></TR>
<TR><TD>&nbsp;</TD></TR>
<TR><TD COLSPAN = 2><B>Noi dung:</B></TD></TR>
</TABLE>
<TABLE WIDTH = 95%><TR>
<TR>
<TD WIDTH = 100%>
<%= sOrigMessage %>
</TD></TR></TABLE><P>
<CENTER><INPUT TYPE="Submit" NAME = "ApplyMessage" VALUE = "Submit"></CENTER>
<! #include file = "footer.inc" >
</FORM>
<%
if bIllegal then %>
<FONT COLOR = "RED" SIZE = = -1>Your message was altered to delete the ASP delimiters
&lt;<%= chr(37) %> and <%= chr(37) %>&gt;
</FONT><P>
<% end if %>
<! #include file = "database_cleanup.inc" >
</HTML>
6. Xem tin nhắn trong diễn đàn. File ShowMessage.asp
File này sẽ được gọi thực hiện khi đang ở mục danh mục diễn đàn, người dùng bấm vào tên chủ
để. Thì nội dung của chủ đề sẽ được thực hiện và hiện lên như trên. Tại đây người dùng sẽ có
hai lựa chọn. Nếu nhấn nút DapLai tức là người dùng bấm vào khu vực trả lời và thảo luận vấn
đề trên. Nếu nhấn nút Quay lai Dien Dan chinh thì người dùng đã quay lại diễn đàn trước đó.

Code của file này được đề nghị như sau:
<! #include file = "database.inc" >
<%
sCaption = request.QueryString("Caption")
function HTMLFormat(sInput)
dim sAns
sAns = replace(sInput, " ", "&nbsp; ")
sAns = replace(sAns, chr(34), "&quot;")
sAns = replace(sAns, "<! ", "&lt;! ")
sAns = replace(sAns, " >", " &gt;")
HTMLFormat = sAns
end function
Function MessageChildren(ID, IndentLevel, iCurrentMessage)
dim oRs, oCmd, sSQL, sAns
'FIRST GET MESSAGE, TEXT, CLOSE
dim oParam
set oCmd = Server.CreateObject("ADODB.Command")
set oCmd.ActiveConnection = conn
oCmd.CommandText = "FORUM_MESSAGE"
oCmd.CommandType = 4
set oParam = cmd.CreateParameter("MESSAGEID", 3, 1)
oCmd.parameters.append oParam
oParam.value = cint(ID)
set oRs = oCmd.execute
set oParam = nothing
iIndent = IndentLevel
set oRs = oCmd.execute
if oRs.eof then
oRs.close
set oRs = Nothing

set oCmd = nothing
MessageChildren = ""
exit function
end if
sAns = "<TR><TD>"
for i = 0 to iIndent - 1
sAns = sAns & "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"
Next
if oRs("ID") <> cLng(iCurrentMessage) then
sAns = sAns & "<A HREF='ShowMessage.asp?ID=" & oRs("ID") & "'>"
'response.write "CurMsg=" & iCurrentMessage & " ID = " & oRs("ID")
sAns = sAns & oRs("Topic") & "</A>"
else
sans = sans & "<B>" & oRS("Topic") & "</B>"
end if
sAns = sAns & "</TD><TD>" & oRs("DATEPOSTED") & "</TD>"
sAns = sAns & "<TD>" _
& oRs("AuthorName") & "</TD></TR>"
oRs.close
sSQL = "SELECT ID FROM FORUM_MESSAGES WHERE PARENTMESSAGE = " & ID
oCmd.CommandText = sSQL
oCmd.CommandType = 1
set oRs = oCmd.execute
if ors.eof and iIndent = 0 then
sAns = ""
else
do while not oRs.eof
sAns = sAns & MessageChildren(oRs("ID"), iIndent + 1, iCurrentMessage)
oRs.MoveNext
Loop

end if
oRs.Close
set oRs = nothing
set oCmd = nothing
MessageChildren = sAns
End Function
Function isBlank(Value)
if isNull(Value) then
bAns = true
else
bAns = trim(Value) = ""
end if
isBlank = bAns
end function
Function FixNull(Value)
if isNull(Value) then
sAns = ""
else
sAns = trim(Value)
end if
FixNull = sAns
end function
iMessageId = request.QueryString("ID")
bValid = isNumeric(iMessageId) and iMessageId <> ""
if bValid then
cmd.CommandText = "Forum_Message"
cmd.CommandType = 4
set Param = cmd.CreateParameter("MESSAGEID", 3, 1)
cmd.parameters.append Param
Param.value = iMessageId

set rs = cmd.Execute
iThreadParent = rs("ThreadParent")
sMsg = HTMLFormat(rs("Comments"))
sMsg = replace(sMsg, " ", "&nbsp; ")
sMsg = replace(sMsg, vbcrlf, "<BR>")
end if
%>
<HTML>
<HEAD>
<TITLE>FORUM THAO LUAN DONG DO></TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=ISO-8859-1">
</HEAD>
<BODY BGCOLOR = "#FFFFFF">
<CENTER><H2>Dien dan DONGDO </H2></CENTER>
<%
if not bValid then
response.write "You cannot navigate to this page without selecting a forum message. Please "
response.write "return to the <A HREF = 'default.asp'>forum index</A> and try again."
response.end
end if
sTopic = rs("Topic")
%>
<% if sCaption <> "" then
response.write "<B><FONT COLOR = RED>" & sCaption & "</B></FONT><P>"
end if
%>
<TABLE>
<TR><TD>Chu de:</TD>
<TD><B><%= rs("Topic") %></B></TD></TR>
<TR><TD>Viet boi:</TD>

<TD><B>
<% Response.write "<A HREF = 'mailto:" & rs("AuthorEmail") & "'>" & rs("AuthorName") &
"</A>" %></B></TD></TR>
<TR><TD>Ngay Thang:</TD>
<TD><B><%= rs("DatePosted")%></B>
</TD></TR>
</TABLE><P>
<TABLE WIDTH = 95%><TR><TD WIDTH = 100%>
<% = sMsg %>
</TD></TR></TABLE>
<FORM ACTION = "reply.asp" METHOD = "POST">
<INPUT TYPE="HIDDEN" NAME="MessageID" VALUE="<%= iMessageID %>">
<INPUT TYPE="HIDDEN" NAME="ThreadID" VALUE="<%= iThreadParent %>">
<INPUT TYPE="HIDDEN" NAME="Topic" VALUE="<%= rs("Topic") %>">
<INPUT TYPE="HIDDEN" NAME="OrigAuthor" VALUE="<%= rs("AuthorName") %>">
<P>
<CENTER><INPUT TYPE="Submit" NAME = "RequestReply" VALUE = "DapLai"></CENTER>
</FORM>
<%
rs.close
cmd.parameters.delete(0)
sThread = MessageChildren(iThreadParent, 0, iMessageID)
if sThread <> "" then
response.write "<HR HEIGHT = 1 NOSHADE><CENTER><B>Entire Thread</B><P>"
response.write "<TABLE WIDTH = '100%'>"
response.write "<TR><TD><B><FONT COLOR = 'RED'>Chu de</FONT></TD>"
response.write "<TD><B><FONT COLOR = 'RED'>Ngay gui len</FONT></B></TD>"
response.write "<TD><B><FONT COLOR = 'RED'>Viet boi</FONT></B></TD></TR>"
response.write sThread
end if

%>
</TABLE>
<! #include file = "footer.inc" >
<! #include file = "database_cleanup.inc" >
</body>
</HTML>
7. Gửi tin nhắn thảo luận một chủ đề đã có trong diễn đàn. File reply.asp
- File này sẽ được kích hoạt khi người dùng xem 1 tin nhắn, một loại chủ đề nào đó trong diễn
đàn và nhấn vào nút reply. người dùng cũng cần phải điền đủ các thông tin như tên đăng nhập,
hòm thư đầy đủ, riêng phần chủ đề là có sẵn: RE:……
Trong xử lý CSDL. Giả sử một trang màn hình cho hiện 20 kết quả. Khi số lượng bản ghi tìm
được nhiều hơn 20 kết quả thì việc phân trang được đặt ra.
Kỹ thuật này được minh hoạ trong file default.asp, mình muốn mọi người vọc file này
thành một thuật toán (giả lệnh), sau đó post lên để các thành viên chúng ta tìm hiểu
nhé?!
Ví dụ bắt đầu như sau:
Một số các biến:
- iPageSize: Kích thước số dòng trên một trang màn hình diễn đàn
- iPage: Biến số thứ tự trang hiện tại hiện trên màn hình
- iTotalPage: Biến tổng số trang màn hình của diễn đàn
- lPageStart: Bản ghi đầu tiên của trang màn hình
- lPageEnd: Bản ghi cuối của trang màn hình
Giới thiệu chung
Trong xử lý CSDL. Giả sử một trang màn hình cho hiện 20 kết quả. Khi số lượng bản ghi tìm
được nhiều hơn 20 kết quả thì việc phân trang được đặt ra.
Kỹ thuật này được minh hoạ trong file default.asp, mình muốn mọi người vọc file này thành một
thuật toán (giả lệnh), sau đó post lên để các thành viên chúng ta tìm hiểu nhé?!
- Đây là file mặc định sẽ sử dụng khi forum bắt đầu làm việc. Đầu file sẽ kích hoạt việc mở dữ
liệu, cuối cùng sẽ đóng dữ liệu.
- Trong chương trình sẽ có việc phân trang hiện thông tin, mỗi trang chỉ có 20 dòng. Nếu số

lượng tin giao dịch trong toàn bộ sẽ được phân thành các trang.
- Ban đầu, người dùng chưa chọn diễn đàn thì Forum sẽ hiện toàn bộ thảo luận trong diễn đàn.
Việc lọc ra thông tin của một loại chủ đề nào đó chỉ cần đưa tên loại chủ đề ở đầu form và bấn
Enter.
Một số biến sử dụng trong chương trình Default.asp
- iPageSize: Kích thước số dòng trên một trang màn hình diễn đàn
- iPage: Biến số thứ tự trang hiện tại hiện trên màn hình
- iTotalPage: Biến tổng số trang màn hình của diễn đàn
- lPageStart: Bản ghi đầu tiên của trang màn hình
- lPageEnd: Bản ghi cuối của trang màn hình
Cách hoạt động của chương trình Default.asp
1. Mở dữ liệu forum theo yêu cầu. Chạy kèm file Database.inc
2. Kiểm tra xem trong Forum có dữ liệu không
a. Nếu không có dữ liệu, đặt biến bnoRecord=True. Quay sang bước 3
b. Nếu có dữ liệu thì xử lý các thông số của trang: như số thứ tự trang, bản ghi đầu, cuối…Và
đặt bnoRecord=False. Quay sang bước 3.
3. Kiểm tra xem bnoRecord nhận giá trị False hay là True
a. Nếu bnoRecord nhận giá trị TRUE thì dừng việc duyệt forum. Quay sang bước 6
b. Nếu bnoRecord nhận giá trị FALSE thì chuyển sang bước 4
4. In dữ liệu trong diễn đàn ra màn hình với các bản ghi có số thứ tự bản ghi đầu và cuối đã
tính toán ở bước 2b.
5. Xử lý các tuỳ chọn cho người dùng ở dưới đáy màn hình là để người dùng chọn xem tiếp
các màn hình: phía trước, phía sau, một màn hình có số thứ tự tuỳ ý… Khi có hành động của
người dùng chọn thì quay trở lại bước 4 với những giá trị mới. Lặp lại cho đến khi người dùng
thoát khỏi mục này của diễn đàn.
a. Nếu là trang màn hình đầu tiên và phía sau còn thì hiện chữ “Trang tiếp”
b. Nếu là trang màn hình cuối cùng thì hiện chữ “Trang trước”
c. Nếu phía trước trang hiện tại có trang, phía sau trang hiện tại có trang thì hiện “Trang
trước” và “Trang tiếp” đồng thời
d. Xử lý các số thứ tự trang 1|2|3…. và đường Link ngẫu nhiên cho người dùng tuỳ chọn.

6. Chạy kèm file Database_cleanup.inc để đóng việc mở dữ liệu
Chi tiết mục 2.a. Xử lý các thông số của trang khi có dữ liệu lọc được
- iPageSize=20 Mỗi trang thể hiện 20 kết quả
- lTotalRecords = rs.RecordCount: Tổng sổ bán ghi trong diễn đàn bằng số bản ghi của Rs
- iTotalPage Tổng số trang tìm được bằng tổng số bản ghi/kích thước trang.
Nếu phép chia có số dư khác 0 thì tổng số trang + 1
- Nếu số bản ghi < kích thước trang, thiết lập các thông số : bOnePage, lPageStart,
iTotalPages…
- Nếu số bản ghi > kích thước trang, thiết lập các thông số: lPageStart, lPageEnd
- Thiết lập lại Rs trỏ đúng số bản ghi thuộc trang
Dưới đây là một kỹ thuật đơn giản để lấy dữ liệu từ một bảng để đưa vào combo box,
để từ đó người dùng chọn dữ liệu liên quan dễ hơn. Ví dụ minh hoạ là cải tiến việc
chọn Topic của diễn đàn mini đã nêu ở trên, người dùng không phải tự gõ topic cần
xem nữa mà sẽ tự chọn từ hộp combox:
<%
Set Conn = Server.CreateObject("ADODB.Connection")
DSNStatement = "DRIVER=Microsoft Access Driver (*.mdb);DBQ="
DSNStatement = DSNStatement & Server.MapPath("Forum.mdb")
Conn.Open DSNStatement
Set Rs1 = Server.CreateObject("ADODB.Recordset")
sql="SELECT DISTINCT topic FROM Forum_messages"
rs1.open sql,conn, 3,3
rs1.movefirst
%>
<CENTER><FORM ACTION = 'forum_search.asp'><b>Chon Forum:</b>
<select name="search">
<%
stt=0
Do while not Rs1.eof
stt=stt+1

%>
<font face="Times New Roman">
<Option value="<%=Rs1("Topic")%>"> <%=Rs1("Topic") %> </Option>
</font>
<%Rs1.MoveNext
Loop
%>
</select>
<input type="submit" value="Chon" name="searchbutton">
</Form></CENTER>
=======================
- Như vậy, định nghĩa ra 1 biến bản ghi Rs1, lấy các nội dung Topic khác nhau.
- Duyệt Dùng kỹ thuật duyệt Rs1 từ đầu đến hết, khi duyệt sẽ sử dụng tag <select >
</select> để lấy dữ liệu các bản ghi vào
- Chúng ta sẽ chú ý việc đặt tên trong <select>, value trong <option>
Việc tạo CSDL âm nhạc đơn giản có thể thực hiện bằng ACCESS + ASP + HTML có thể
được thực hiện dạng đơn giản như sau:
- Xây dựng bảng BaiHatViet trong CSDL Access với cấu trúc : Baihatviet(Baihat, Casy, Nhacsy,
Theloai, solan)
- Xây dựng file Amnhac.asp là file giao diện chính của âm nhạc, có chức năng hiện ra combo để
lựa chọn tên ca sĩ cần nghe. Đồng thời hiện ra danh sách tất cả các bài hát nếu là lần cập nhật
đầu tiên.
- Từ combo box của file Amnhac.asp sẽ gọi file Baihatviet.asp để lọc ra các bài hát của ca sĩ cần
nghe.
=== Code viết ngắn gọn =====
1. File amnhac.asp (kỹ thuật đưa dữ liệu ra bảng, kết hợp đường Link + lay du lieu
khác nhau vào Combo box)
<%@Language=VBScript%>
<! #Include file="modulieu.asp" >
<HTML>

<HEAD>
<META name="GENERATOR" content="WYSIWYG Web Builder from
">
<meta name="GENERATOR" content="Microsoft FrontPage 5.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<META content=en http-equiv=Content-Language>
<meta http-equiv="Content-Type" content="text/html; charset=Unicode">
<TITLE></TITLE>
</HEAD>
<BODY>
<center>
<font size=5>
<%
Select case weekday(date())
case 1
thu = "Chủ Nhật"
case 2
thu="Thứ Hai"
case 3
thu="Thứ Ba"
case 4
thu="Thứ Tư"
case 5
thu="Thứ Năm"
case 6
thu="Thứ Sáu"
case 7
thu="Thứ Bảy"
end Select
ngay=day(date())

thang=month(date())
nam=year(date())
Response.Write Thu & ", Ngày: " & cstr(ngay) & " Tháng " & cstr(thang) & " Nam " & cstr(Nam)
& "<br>" & "<br>"
Response.Write "<Font color=red>" & "Danh mục sách trong thư viện" & "</font>"
%>
</font>
</center>
<%
Set RS = Server.CreateObject("ADODB.Recordset")
sql="SELECT DISTINCT CaSy FROM BaiHatViet"
rs.open sql,conn, 3,3
rs.movefirst
%>
<Center> <p> Lựa chọn loại sách </p>
<form action="BaiHatViet1.asp" method="post">
<select name="ChonCaSy">
<%
stt=0
Do while not rs.eof
stt=stt+1
%>
<font face="Times New Roman">
<Option value="<%=Rs("CaSy")%>"> <%=Cstr(stt) & ". " & Rs("CaSy") %> </Option>
</font>
<%Rs.MoveNext
Loop
%>
</select>
<input type="submit" value="Chon">

</form>
</center>
<font face="Times New Roman">
<%
Set RS = Server.CreateObject("ADODB.Recordset")
sql="Select * from BaiHatViet Order by BaiHat"
rs.open sql,conn, 3,3
rs.movefirst
Response.Write "<Center> <Table border='1'>"
Response.Write "<TR>"
Response.Write "<TH> STT </TH>"
Response.Write "<TH> Ten Bai Hat </TH>"
Response.Write "<TH> Ca Sy </TH>"
Response.Write "<TH> Nhac Sy </TH>"
Response.Write "<TH> The Loai </TH>"
Response.Write "<TH> So Lan </TH>"
stt=1
Do while not rs.eof
bh=rs("BaiHat") & "." & rs("TheLoai")
Response.write "<TR>"
Response.write "<TD align=center>" & cstr(stt) & "</TD>"
Response.write "<TD>" & "<a href=" & bh & ">" & rs("BaiHat") & "</a> </TD>"
Response.write "<TD>" & rs("CaSy") & "</TD>"
Response.write "<TD>" & rs("NhacSy") & "</TD>"
Response.write "<TD>" & rs("TheLoai") & "</TD>"
Response.write "<TD Align=Center>" & Cstr(rs("SoLan")) & "</TD>"
Response.write "</TR>"
rs.moveNext
stt=stt+1
Loop

Response.write "</Table> </Center>"
%>
</Font>
<P>&nbsp;</P>
</BODY>
</HTML>
2. File baihatviet1.asp dùng để lọc ra tên bài hát tương ứng với casy cần nghe
<%@Language=VBScript%>
<! #Include file="modulieu.asp" >
<HTML>
<HEAD>
<meta name="GENERATOR" content="Microsoft FrontPage 5.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<META content=en http-equiv=Content-Language>
<meta http-equiv="Content-Type" content="text/html; charset=Unicode">
<TITLE></TITLE>
</HEAD>
<BODY>
<center>
<font size=5>
<%
Select case weekday(date())
case 1
thu = "Chủ Nhật"
case 2
thu="Thứ Hai"
case 3
thu="Thứ Ba"
case 4
thu="Thứ Tư"

case 5
thu="Thứ Năm"
case 6
thu="Thứ Sáu"
case 7
thu="Thứ Bảy"
end Select
ngay=day(date())
thang=month(date())
nam=year(date())
Response.Write Thu & ", Ngày: " & cstr(ngay) & " Tháng " & cstr(thang) & " Nam " & cstr(Nam)
& "<br>" & "<br>"
Response.Write "<Font color=red>" & "Danh muc bai hat theo Casy " & "</font>"
%>
</font>
</center>
<font face="Times New Roman">
<%
dk=request("ChonCaSy")
Set RS = Server.CreateObject("ADODB.Recordset")
sql="Select * from BaiHatViet Where CaSy='"& dk &"' Order by BaiHat "
rs.open sql,conn, 3,3
rs.movefirst
Response.Write "<Center> <Table border='1'>"
Response.Write "<TR>"
Response.Write "<TH> STT </TH>"
Response.Write "<TH> Ten Bai Hat </TH>"
Response.Write "<TH> Ca Sy </TH>"
Response.Write "<TH> Nhac Sy </TH>"
Response.Write "<TH> The Loai </TH>"

Response.Write "<TH> So Lan </TH>"
stt=1
Do while not rs.eof
bh=rs("BaiHat") & "." & rs("TheLoai")
Response.write "<TR>"
Response.write "<TD align=center>" & cstr(stt) & "</TD>"
Response.write "<TD>" & "<a href=" & bh & ">" & rs("BaiHat") & "</a> </TD>"
Response.write "<TD>" & rs("CaSy") & "</TD>"
Response.write "<TD>" & rs("NhacSy") & "</TD>"
Response.write "<TD>" & rs("TheLoai") & "</TD>"
Response.write "<TD Align=Center>" & Cstr(rs("SoLan")) & "</TD>"
Response.write "</TR>"
rs.moveNext
stt=stt+1
Loop
Response.write "</Table> </Center>"
%>
</Font>
<P>&nbsp;</P>
</BODY>
</HTML>

×