返回列表 上一主題 發帖

[教學] (實戰專題) 線上討論區 上篇

[教學] (實戰專題) 線上討論區 上篇

線上討論區,也就是所謂的『BBS』,本討論區的程式編寫有一定程度的挑戰性,不僅僅是ASP程式的問題,還包括了ACCESS資料庫『關聯性』的問題!本章範例中小誌將會簡單的說明如何建立資料表間的關聯性(只介紹與本章範例相關的部分操作,至於其他較深入的部份就得請您自行參閱相關書籍了),並且將ASP程式網頁做重點是的拆解與說明。


程式流程
本討論區程式範例共分為五大部分,分別是:

  • 討論區問題討論項目列表程式網頁Index.asp,此程式網頁不單是條列出討論主題而已,有新的問題討論項目要發起,也是在此程式網頁中填寫相關的討論主題資料!

    12-1.png

  • 儲存新問題討論項目內容的addnew.asp程式,本程式負責將在程式網頁Index.asp中所填寫的相關的討論主題資料寫入至資料庫檔案中,並且將網頁瀏覽連結轉向回討論主題的Index.asp程式網頁。

  • 單一主題討論列表程式網頁join.asp,當我們在問題討論項目列表程式網頁Index.asp中,點選了某一個已經存在的討論主題時就會連結進入此一網頁,本程式網頁中所列示出來的內容是針對使用者所選定的討論項目。

    12-2.png

    注意
    單一主題討論列表程式網頁join.asp中也有一個發言的表單,但是,這個表單是用來填寫回應某個特定主題的的討論(也就是用來參予討論目前程式網頁中的主題)!


  • joinnew.asp程式:用來儲存某一主題新加入的討論資料,當我們在單一主題討論列表程式網頁join.asp中的發言表單裏填入討論資料並按下『送出討論』按鈕後,其傳送的討論資料就交由joinnew.asp程式來儲存於資料庫中。

  • 討論主題與討論項目內容資料庫bbs.mdb:此資料庫中含有兩個資料表,『主標題』資料表用來儲存全部的討論主題相關資料,『次標題』資料表用來儲存全部討論項目的一切資訊(單一主題討論列表程式網頁join.asp與joinnew.asp程式共用)。

    12-3.png
心安,平安   
發表任何無意義的感謝或灌水文章一律砍,珍惜帳號,請詳閱版規!!

主從資料表的欄位

主標題資料表
在主標題資料表中,我們必須配合問題討論項目列表程式網頁Index.asp功能表建立四個基礎欄位,分別是:姓名、主題、發言日期與篇數。

12-4.png

篇數欄位存放的是該主題討論發言的總篇數,但是並不包括討論主題本身。

同時,配合單一主題討論列表程式網頁join.asp中,必須顯示原始討論主題的內容與發起討論者的電子信箱,所以還得加上『Email』與『內容』欄位:

12-5.png

除此之外,還有一個非常重要的欄位:『主編號』欄位,這是主標題資料表與次標題資料表產生關聯性的關鍵欄位!因此,我們在主標題資料表中一共必須建立七個欄位,主標題資料的欄位結構如下圖所示:

12-6.png

次標題資料表
在次標題資料表中我們則必須配合單一主題討論列表程式網頁join.asp,建立基本的Email、姓名、主題、內容與發表時間等五個欄位:

12-7.png

當然還有『主編號』欄位,這個欄位的資料內容將會與主標題中的相同!除此之外,還有一個討論內容的『次編號』欄位,所以在次標題資料表中我們同樣必須建立七個欄位,次標題資料的欄位結構如下圖所示:

12-8.png

提示:
由主標題資料表與次標題資料表的欄位結構中,我們不難發現:主編號與次編號乃是一對多的主從關係,我們假設某個討論主題它的主編號是1,如果沒有人對此主題發出討論回應(回應篇數是0),則在次標題資料表中將沒有主編號欄位為1的資料錄存在;相對的,如果有三個人對此主編號是1的討論主題做出回應(主標題資料表中的篇數資料欄位值為3),則在次標題資料表中將有五筆主編號欄位值為1的資料錄存在(但此三筆資料錄的次編號欄位值並不相同)!
這種一對多或多對一的關係關係乃是透過『關聯性』的設定而產生!
心安,平安   
發表任何無意義的感謝或灌水文章一律砍,珍惜帳號,請詳閱版規!!

TOP

建立資料表關聯性
了解了主標題資料表與次標題資料表中『主編號』、『次編號』的對應關係後,我們就來進行主標題資料表與次標題資料表的『關聯性』設定!因為本程式範例的資料庫為ACCESS資料庫,因此小誌就為您簡介一下如何為ACCESS資料庫中的資料表建立關聯性:

打開我們已經建立好主標題資料表與次標題資料表的bbs.mdb資料庫。


  • 在工具列『資料庫關聯圖』工具按鈕上單擊滑鼠左鍵(將會開啟『資料庫關聯圖』對話視窗):


  • 在『資料庫關聯圖』對話視窗開啟後,在工具列『顯示資料表』工具按鈕上單擊滑鼠左鍵(將會開啟『顯示資料表』對話視窗):



  • 在『顯示資料表』對話視窗的『資料表』選項頁中,選取我們的主標題資料表與次標題資料表兩個項目(先用滑鼠點選任意一個資料表,然後按住Shift鍵不放再點選另一個資料表),接著然後按下『新增』按鈕:

    12-10.png

  • 在『顯示資料表』對話視窗中按下『新增』按鈕後,在『資料庫關聯圖』視窗中,就可看見主標題資料表與次標題資料表加入至視窗中了(按下新增按鈕後『顯示資料表』對話視窗並不會自動關閉,此時可按下『關閉』按鈕將其關閉):

    12-11.png

  • 在主標題資料表的主編號欄位上按住滑鼠左鍵不放,拖曳至次標題資料表的主編號欄位上再放開滑鼠左鍵,此時將會出現下圖之『編輯關聯』對話視窗:

    12-12.png

  • 如上圖所示:將強迫參考完整性、串接更新相關欄位(註1)、串接刪除相關紀錄(註2)等三個項目都核取起來,然後按下『建立』按鈕。

    12-13.png

  • 回到『資料庫關聯圖』視窗中就可發現主標題資料表的主編號欄位與次標題資料表的主編號欄位中間被線段連接起來,這就表示我們完成了關聯性的設定:

    12-14.png



  • 串接更新相關欄位:當主標題資料表中的主編號欄位資料值改變時,次標題資料表中相對應的主編號欄位值也會跟著一起變更。
  • 串接刪除相關紀錄:當主標題資料表中的某一筆資料錄被刪除時,假設其主編號欄位值為1,則次標題資料表中相對應主編號欄位值為1的資料錄也會全部被自動刪除。
心安,平安   
發表任何無意義的感謝或灌水文章一律砍,珍惜帳號,請詳閱版規!!

TOP

討論區項目列表程式

討論項目列表程式網頁index.asp是進入『討論區』的大門網頁,這個網頁包含兩大部分,一是全部討論項目的列表部分(下圖A部分),進入此一程式網頁後,如果點選了某一個已存在的討論項目『主題』超連結,就可以連結進入該討論主題的對應討論網頁(join.asp),如果想要發表新的討論項目,就可直接在程式網頁下方的發言表單(下圖B部分)中輸入資料來建立新的討論主題:

12-15.png

 因此,我們程式的設計就分為兩個部分,在全部討論項目的列表部分,我們只要開啟資料庫,然後將『主標題』資料表中的相關欄位資料取出來,並且加上相關的HTML表格標籤組合就可完成任務:

12-16.png

 利用While Wend 迴圈敘述將所有資料表中資料錄欄位的資料全部取出列表,迴圈敘述停止執行的條件為 not rs.eof,意思就是說動作中資料錄的位置若超過資料錄最後一筆資料時就停止迴圈敘述,當然,在迴圈中敘述執行讀取一筆資料錄資料後,我們還必須利用資料錄的MoveNext方法將作用中資料錄的位置移至下一筆資料上!


提示:

  • 為了點選某一個已存在的討論項目『主題』超連結,就可以連結進入該討論主題的對應討論網頁(join.asp),所以我們必須利用主標題資料表中『主編號』的欄位資料來建立超連結:

    12-17.png

    當程式網頁執行後,我們檢視網頁的原始碼將獲得下圖結果:

    12-18.png

  • 為了讓較晚發表的討論主題在列表時能排在網頁的上方,因此我們在開啟資料表的SQL敘述中除了指定開啟的資料表為『主標題』外,還加上了『 Order By 發言日期 Desc』的排序語法敘述,也就是依照『發言日期』欄位的資料內容做遞減排序。

    12-19.png


index.asp
  1. <%
  2. '建立資料庫連結物件
  3.         Set conobject = Server.CreateObject("ADODB.Connection")
  4.         DBPath = Server.MapPath("bbs.mdb")
  5. '連結資料庫       
  6.         conobject.Open "Driver={Microsoft Access Driver (*.mdb)};DBQ="&DBPath
  7. '建立資料庫存取物件       
  8.         Set RS=Server.CreateObject("ADODB.Recordset")
  9. '打開資料表       
  10. SQL = "Select * From 主標題 Order By 發言日期 Desc"
  11.         RS.Open SQL,conobject,1,3
  12. %>

  13. <HTML>
  14. <BODY>
  15. <h2 Align="Center"><img border="0" src="bbs.gif"></h2>
  16. <TABLE Border=0 Cellspacing=5 width="100%">     
  17. <TR BgColor=#00FFFF>     
  18. <TD align="center" bgcolor="#0066FF" width="20%"><font size="2" color="#FFFFFF">日期/時間</font></TD>   
  19. <TD NoWrapP align="center" bgcolor="#0066FF" width="20%"><font size="2" color="#FFFFFF">討論發起人</font></TD>   
  20. <TD align="center" bgcolor="#0066FF" width="50%"><font size="2" color="#FFFFFF">主題</font></TD>   
  21. <TD align="center" bgcolor="#0066FF" width="10%"><font size="2" color="#FFFFFF">回應篇數</font></TD></TR>   
  22.    
  23. <% While not rs.eof%>   
  24.    <TR Valign=TOP>   
  25.    <TD NoWrap width="20%">   
  26.     <p align="center"><font size="2"><%=rs("發言日期")%></font></TD>   
  27.    <TD width="20%">   
  28.     <p align="center"><font size="2"><%=rs("姓名")%></font></TD>   
  29.    <TD width="50%"><A HREF=join.asp?ID=<%=rs("主編號")%>>   
  30.    <font size="2">   
  31.    <%=rs("主題")%></font></A></TD>   
  32.    <TD width="10%">   
  33.     <p align="center"><font size="2"><%=rs("篇數")%></font></TD>   
  34.    </TR>   
  35. <%   
  36.    rs.MoveNext   
  37. Wend      
  38. %>   
  39. </TABLE>   
  40.    
  41. <TABLE Width="100%"><TR><TD Align=Center bgcolor=#000080>   
  42. <B><font color="#FFFFFF" size="2">我有新問題要討論</font></B>   
  43. </TD></TR></TABLE>   
  44. <CENTER>   
  45. <FORM Action=addnew.asp Method=POST>   
  46. <TABLE Border="1" bgcolor="#FFCC66" bordercolor="#FF9933" cellspacing="0">   
  47.    
  48. <TR><TD><font size="2">姓名:</font></TD>   
  49. <TD><font size="2"><INPUT Type="text" Size="30" Name="姓名"></font></TD></TR>   
  50.    
  51. <TR><TD><font size="2">Email:</font></TD>   
  52. <TD><font size="2"><INPUT Type="text" Size="30" Name="Email">   
  53.   </font>   
  54. </TD></TR>   
  55.    
  56. <TR><TD><font size="2">主題:</font></TD>   
  57. <TD><font size="2"><INPUT Type="text" Size="60" Name="主題">   
  58.   </font>   
  59. </TD></TR>   
  60.    
  61. <TR><TD><font size="2">內容:</font></TD>   
  62. <TD><font size="2"><TEXTAREA Name="內容" Rows="8" Cols="60">
  63. </TEXTAREA></font></TD></TR>   
  64. </TABLE>   
  65. <INPUT Type="submit" Value="送出討論主題">   
  66. </FORM>   
  67. </CENTER>   
  68. </BODY>   
  69. </HTML>
複製代碼
心安,平安   
發表任何無意義的感謝或灌水文章一律砍,珍惜帳號,請詳閱版規!!

TOP

        靜思自在 : 多做多得。少做多失。
返回列表 上一主題