如何架設一個新聞系統呢?一個完整的新聞系統不僅僅只包括供瀏覽的新聞介面,它還包括許多功能的控制和後台管理的強勁功能。那麼這些功能內的子功能又如何調度分配呢?下面就來介紹一下各功能的調配控制。新聞系統的實現是簡單的,但也可以說是非常複雜的。
新聞系統可分為三大部分:管理員登入系統,新聞管理系統,使用者瀏覽系統。整個過程是簡單的:
1、管理員發布新聞-->資料庫-->使用者瀏覽新聞
2、發現問題-->登入管理系統-->編輯修改新聞
以上流程看似簡單,但實現起來卻並不是那麼簡單,這是個系統的開發,遠比留言版的實現要複雜,但基本運作原理又與留言版相同。在新聞發布系統的重中之重又在於資料庫的規劃和管理系統的實現。
現在來新聞都有些什麼內容:新聞分類,資訊本體。在資料庫包函這兩項內容於一個資料表內是可以實現的,但不經濟,因此我們可用兩個資料表來分別儲存內容,一個專門儲存新聞的分類,而另一個用來儲存資訊的本體。如何調用實現雙表內容的共用呢?運用表關聯來實現這個問題(這裡並不介紹這方面的知識,讀者可自行參考資料庫相關的知識內容,靠自己努力得來的知識最有價值,不是嗎?)
下面要介紹的是管理功能的實現:
1、首先是新聞的發布
這是一系列的提交表單共同組成的,而這裡又分兩類,建立新聞分類和發布新聞;建立完新聞分類,然後再在各個分類中發布相關的新聞,很簡單嘛!並不是這樣的,想想所有的資訊本體全都集中在一個資料表裡,如何區分資訊的分類,上面提到的表關聯在這就非常重要了,當然也可不用這種方法,為每個分類建立一個獨立的表也能解決問題,可是這樣划算嗎?維護性和可擴充性有如何呢?
新聞分類和資訊本體的相關調用引起了麻煩,對了,解決之道就是活用表關聯。
2、編輯,修改,刪除的問題
這是 php+mysql 知識的基本運用,實現這些功能並無困難,這裡不作過多的介紹,只是要注意的是更改或刪除一個分類時,該如何處理該分類下的資訊本體呢?由於使用表關聯,處理這些功能如同是在一個表內處理一般。
3、多工處理
但許多人在同時編輯一條新聞時會出現什麼情況呢?情況就資料庫只會儲存最後編輯的內容,這種情況發生將意味著前面修改的人的辛苦白費了,多功處理就是解決這個問題的,採取的方法是先入為主的,即先進入編輯的擁有編輯許可權,而後進入的只擁有瀏覽的許可權直到編輯完成為止。這個功能很象 linux 的許可權控制,不是嗎?
完成這個功能可用幾種方法:1。用 cookie 來控制,2。在表內增加權控欄位。當然用 cookie 更加簡單些,cookie 實現的方法和流程是這樣的:
當有管理員進入編輯,設定 cookie ,編輯功能的程式段則判斷 cookie 值,為空白允許編輯,非空則拒絕編輯,退出編輯時則將 cookie 清空,如此迴圈往複;多工功能是個有效功能,至少能減少時間上和人力上的浪費。
新聞瀏覽功能的實現很簡單,加上翻頁功能(本站已經介紹過了),強大的新聞系統基本完成,似乎少了個很重要的功能,不錯就是搜尋引擎。能夠擁有強大的搜尋引擎是每個網站的心愿,而一個強大的搜尋引擎的製作又是相當複雜和困難的,它涉及到效率,準確性和速度等諸多方面。
這裡介紹的搜尋引擎不會涉及到這麼深的研究,只是針對特定的內容進行精確的查詢。一個功能複雜而強大的搜尋引擎要用到很多的程式和資料庫技巧,我們就先從簡單的搜尋引擎開始介紹。搜尋引擎的工作狀況是怎樣的呢?它接收給出的關鍵字,然後在給出的範圍內進行搜尋,然後將搜尋的結果返回。
給出的關鍵字可能在資訊內容的任何位置,引擎又是如何進行尋找的呢?在這要用到如下的資料庫語句:
select * from table where (name like '%".$keyword."%'); |
name 是尋找的具體位置,一般放欄位名,like '%".$keyword。"%' 是模式比對,就是在內容中尋找有無 $keyword。看個例子:
在資料表 news 尋找包含關鍵字 good 的所有標題:
select * from news where (title like '%good%'); |
這是個精確尋找,能夠在資料庫內找出所有帶 good 的 title 出來,還有一種模糊尋找:
select * from news where (title like '%good'); |
這樣也可尋找出結果。
假設 news 裡包含 title(標題),message(內容),user(使用者) 等的欄位,上面的尋找範圍就太狹窄了,因為只對 title 進行了尋找,要對其它內容進行尋找又不想操作太複雜該如何處理呢?
我們注意到在程式裡任何變動的值都用變數來進行處理,在這這個方法一樣行得通,可將想要搜尋的範圍作為變數進行傳送,這樣就有如下的資料庫文法了:
mysql_query("select * from news where ($name like '%".$keyword。"%')); |
$name 存放的就是傳送過來的欄位變數的值,而這種可變的值通過 html 的 select 下拉提交表單來完成。如果想要將搜尋結果限制在一定的時間範圍內又該如何?呢?如想要尋找 5 天之內的資訊。還記得曾在 cookie 介紹中用到的資料庫文法嗎?
對了,該聯合的文法如下:
mysql_query("select * from news where ($name like '%".$keyword。"%') and time>date_sub('$time',interval 5 day)"); |
其中 $time 為尋找的現在時間:$time=date('Y-m-d H:i:s'); time 是資料庫儲存資訊時間的欄位。現在將 $old 來代替 5:
mysql_query("select * from news where ($name like '%".$keyword。"%') and time>date_sub('$time',interval $old day)"); |
同樣 $old 的值通過 select 提交表單將限定的不同時間提交過來,便完成了這個頗為強大的搜尋引擎。一些更為強大的搜尋引擎需要程式技巧上的配合,讀者可通過以上的原理自行擴充實驗。