利用ASP打造網站論壇DIY(一)

來源:互聯網
上載者:User
   前言:現在網上的論壇到處都有,但不知您是否遇到過這樣的情況:在雜亂無章的討論資訊中來尋找自己想要的內容,是一件很費費時費力的事情,到後來,您就都不想去看什麼論壇了。那麼我們能不能對自己網站論壇的內容增加審核功能呢?即所有網友發到論壇的文章,並不立即被顯示出來,必須經過站長或者版主審閱之後,認為有價值,有必要推薦給其它網友的,就發表出來。否則就刪掉了,免得浪費空間,搞得有點像精華區的意味,這樣你的論壇比起一般的論壇來,能夠提供給為明確有益的內容。放到你的網站上,應該能夠吸引更多的網友來訪問。這個設想當然可以實現,下面我就簡單介紹如何製作。

         註:由於本文適用於對ACCESS資料庫、HTML、ASP有一定瞭解的讀者。

  一、論壇結構分析

  通過上面的功能需求分析,我們可以將論壇的製作分為四大部分:

  (1) 網友註冊和管理模組:因為引入了站長或者版主,在論壇中就必須能夠對其進行身分識別驗證。這個模組的功能,就是管理註冊的網友,並能夠提供相關的查詢。比如,查詢指定作者的所有發表的文章,查詢當前發表文章最多的十個網友,等等。如果你的論壇不是很大,這個模組可以省略為只帶有版主身分識別驗證的功能,而去掉那些關於註冊,查詢的部分。

  (2) 文章顯示模組:顯示所有版主審核過的,覺得值得推薦的文章。

  (3) 發表文章模組:為註冊網友提供發表見地的地方,發表後等待版主審閱。

  (4) 文章審閱模組:版主對所有網又發表但未經審閱的文章進行處理,已決定是發表還是刪除。

  瞭解了具體的功能需求後,就可以按模組的開始論壇的設計了。當然,這些模組的只是在功能上對論壇結構的劃分,實際上並不能夠完全的把他們獨立出來進行設計。對於這種較小的應用,也沒有必要進行完全的模組化設計,在良好的規划下直接寫程式碼或許來的更為簡單一些。

  對於論壇實現起來有一般兩種方法:用檔案或者資料庫。相對而言,用資料庫要簡單高效一些,能夠對論壇進行更好的控制,也能夠對資料提供一些驗證和保護。這兒我使用的是ACCESS資料庫,對於一般的中小型的應用,ACCESS應該是能夠勝任的。

  從上面的分析可以知道應該有四個表,下面我給出每個表的結構。

  (1)作者表(用來存放作者訊息):

    ID:  文本類型,必填。是網友代號。
    密碼: 文本類型,必填。
    暱稱: 文本類型,必填。
    EMAIL: 文本類型,必填。
    職務: 數字類型,必填。-1代表普通網友,0代表站長。大於0的數字代表版主。
    文章數:數字類型,必填。網友發表的文章總數。
    姓名: 文本類型,可選。
    性別: 文本類型,可選。
    電話: 文本類型,可選。

  (2)內容表(用來存放具體文章內容和相關訊息):

      ID:自動編號,並為其設定索引,以加快搜尋的速度。
    看板ID:數字類型,來自看板列表,表示文章所屬看板。
    主題ID:數字類型,來自主題表,表示文章所屬主題。
    作者ID:文本類型,來自作者表,表示文章的作者。
     日期:日期/時間類型,預置初值為函數NOW(),自動取系統目前時間為其值。
     標題:文本類型。文章的標題。
     發表:是/否類型,為"真"時表示文章已經通過審閱,可以發表;為"否"表示文章尚待審閱。
    推薦度:數字類型,文章的推薦程度。
     內容:備忘類型,文章的具體內容。
   點擊次數:數字類型,文章的點擊次數。

  (3)看板列表(用來存放有關看板的訊息):

      ID:自動編號,同樣的,也為其設定了索引。
     名稱:文本類型,看板的名稱。
     板主:文本類型,看板版主的ID。
    主題數:數字類型,看板中包含的主題數。

  (4)主題表(用來存放有關主題的訊息):

      ID:自動編號,並為其設定索引。
     標題:文本類型,表示主題名。
     看板:數字類型,來自看板列表,表示主題所屬的看板。
    文章數:數字類型,主題中包含的文章數。

  所有的表是設計完了,但是資料庫的設計並沒有完,所以我們還需要建立表間關係,這樣就能夠讓資料庫執行一些相關性檢查,避免資料出錯。建立表間關係的另外的一個好處,就是通過它能夠很容易的建立出複雜的JOIN查詢。

  通常我們在ASP中操作資料庫的時候,都是使用的執行時產生的查詢,然後由傳遞給資料庫解釋執行。而在這兒我們要用的是存貯查詢。與執行時查詢比較而言,預存程式具有更多的優點。

  它儲存在資料庫中,獨立於ASP程式碼,使得他更容易建立和修改,並且查詢的效率更高,速度更快,可以調試好了以後再放在ASP頁面中使用,能避免很多問題。而且使用存貯查詢的ASP程式碼更加容易閱讀和修改。可能大家都對在ASP中使用SQL查詢感到很煩,特別是那些逗號啊,分號啊什麼的,一不小心就會出錯。使用存貯查詢後,就可以不用顧慮這些問題了。當然,預存程式再使用上也有一些要注意的地方,在後面我會詳細的講解它的使用方法。在ACCESS中建立預存程式是一件很容易的事,這兒我就不再多說了。在這兒我只給出各個查詢的SQL語句程式碼。

  我把所有要使用到的查詢都作為預存程式儲存在了資料庫中,主要的有以下的一些:

  (1)按ID查詢文章:

SELECT 主題表.標題 AS 主題名, 看板列表.名稱 AS 看板名, 內容表.*
FROM 主題表 INNER JOIN (內容表 INNER JOIN 看板列表 ON 內容表.看板ID = 看板列表.ID) ON 主題表.ID = 內容表.主題ID
WHERE (((內容表.ID)=[articleid]));

  (2)版主密碼查詢:

SELECT 看板列表.板主, 作者表.密碼
FROM 作者表 INNER JOIN 看板列表 ON 作者表.ID = 看板列表.板主
WHERE (((看板列表.ID)=[id];

  (3)查詢作者:

SELECT 作者表.*
FROM 作者表
WHERE (((作者表.ID)=[id]));

  (4)發表文章列表:

SELECT [內容表].[ID], [內容表].[標題], [內容表].[作者ID] AS 作者, [內容表].[日期], [內容表].[推薦度], [內容表].[點擊次數] AS 點擊數。
FROM 內容表
WHERE ((([內容表].[主題ID])=[TopicIndex]) And (([內容表].[發表])=True));

  未發表文章列表:

SELECT 內容表.ID AS 文章id, 主題表.ID AS 主題id, 主題表.標題 AS 主題, 內容表.標題 AS 標題, 內容表.作者ID AS 作者, 內容表.日期 AS 日期
FROM 主題表 INNER JOIN 內容表 ON 主題表.ID = 內容表.主題ID
WHERE (((內容表.發表)=False) AND ((內容表.看板ID)=[boardid]));

  (5)主題列表:

SELECT 主題表.*, 看板列表.名稱 AS 看板名
FROM 看板列表 INNER JOIN 主題表 ON 看板列表.ID = 主題表.看板
WHERE (((主題表.看板)=[boardIndex]));

  還有一些查詢,因為大多類同,我就不一一列出了。

  在上面的查詢語句中,可以看到一些由"["和"]"包圍起來的東西,那就是查詢參數了。需要在執行時給出參數值,然後把參數值帶入到查詢語句中才能夠執行。還有一點要注意的是:在建立那些INNER JOIN查詢時,是需要把表間關係添加到設計檢視中的,否則是不能夠自動產生INNER JOIN查詢語句的。

    到這兒,資料庫的設計就算完了,以後的工作就是ASP的事了。

  二、構建

  1、構建主表單

  先要給出一個表單,能夠讓網友輸入註冊訊息,這些是HTML的內容,且放在一邊,我們來仔細看看具體實現註冊的ASP指令碼。

  (1)將資料中的單引號改成兩個單引號,並且在前後加上單引號


Function SqlStr( data )
SqlStr = "'" & Replace( data,"'", "''" ) & "'"
End Function

  註:這是一個自訂的函數,用來把使用者輸入中的單引號(')轉換成兩個單引號('')。在ASP中,用雙引號圍著的是字串,因而上面的"'"代表的就是只有一個單引號的字串。之所以要把一個單引號換成兩個單引號,這是因為在SQL語句中,用單引號圍起來是用來代表變數的。為了不至於混淆,就要把字串中的單引號用兩個單引號來表示。而所有的使用者輸入都要作為變數嵌入到SQL語句中的,所以這個函數是必不可少的。

  (2)存貯準備


id=Request("id")
password=Request("password")
nickname=Request("nickname")
email=Request("email")
sex=request("sex")
 

  註:把來自使用者輸入表單中的內容儲存在變數中,這不是必須的,但寫了更容易讀寫。


if Request("name")=""then name=" " else name=request("name")
if Request("phone")=""then phone=" " else phone=request("phone")

  因為這些內容不是必須填的,為了防止使用者沒有輸入任何內容,而造成資料庫操作上的錯誤,就必須把沒有填入欄位用空格來代替。

  (3)建立串連


Set conn = Server.CreateObject("ADODB.Connection")
conn.Open "driver={Microsoft AccessDriver (*.mdb)};dbq=" & Server.MapPath("bbssystem.mdb")

 註:這一段是建立資料庫連接,資料庫的名稱為bbssystem.mdb,這一段中唯一要注意的是Server.MapPath函數的應用。一般來說,凡是涉及到具體的目錄的地方,都不要直接使用目錄名,而用Server.MapPath函數來代替。善用好Server.MapPath和Request.ServerVariables()等函數,能夠讓你的WEB應用具有更好的可移植性。


Set cmd = Server.CreateObject("ADODB.Command")

  (4)查詢作者是否已存在


Set cmd.ActiveConnection = conn
cmd.CommandText = "查詢作者"
ReDim param(0) ' 聲明參數數組
param(0) = CStr(id) ' Cint 不可忽略
Set rs = cmd.Execute( ,param ) 

  註:這一段就是用來執行預存程式的。在ADO中執行查詢的方法有很多種,但是對於預存程式就只能使用Command對象了。首先,建立了一個叫做cmd的Command對象,然後把conn連線物件設定給cmd對象的ActiveConnection屬性,把要執行的查詢名稱"查詢作者"設定給CommandText屬性,然後為查詢參數賦值。我們聲明了一個參數數組param(0),因為在"查詢作者"這個查詢中只有一個參數,所以數組就只有一個分量了。一般的,在查詢中有幾個參數,就要申明有相應分量個數的參數數組。並且參數出現的順序是個數組中分量的順序是對應的。在使用參數查詢的過程中,尤其要注意的是,參數的類型要嚴格匹配,否這就會出錯,所以上面的CStr()類型轉換函式是不可缺少的。


if not (rs.eof or rs.bof) then
response.write "錯誤,你輸入的ID號已經被佔用,請換一個再試試!"
else
sql = "Insert Into 作者表 (id, 暱稱,Email, 密碼,姓名,學校,系別,性別,電話) Values("
sql = sql & SqlStr(id) & ","
sql = sql & SqlStr(nickname) & ","
sql = sql & SqlStr(email) & ","
sql = sql & SqlStr(password) & ","
sql = sql & SqlStr(name) & ",&", "
sql = sql & SqlStr(sex) & ","
sql = sql & SqlStr(phone) & ")"
conn.Execute sql

  使用一個SQL的Insert語句把資料插入到資料庫中。其實這一查詢也可以做成預存程式放在資料庫中,我偷了點懶:-)不過對比之下也可以看到預存程式的好處,執行時查詢寫起來實在是太麻煩了。

 



相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。