全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:3644
推到 Plurk!
推到 Facebook!

使用"函數遞迴"實現基於php和MySQL的動態樹型功能表

 
conundrum
尊榮會員


發表:893
回覆:1272
積分:643
註冊:2004-01-06

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-01-27 19:20:02 IP:61.221.xxx.xxx 未訂閱
http://www.linuxdby.com/articlesdisplay.php?s=f9d7e61d6ca6282e06820920d1073ae5&newsid=16
使用"函數遞迴"實現基於php和MySQL的動態樹型功能表 
樹型功能表在很多桌面應用系統中都有非常廣泛的應用,其主要優點是結構清晰,利於使用者非常清楚的知道目前自
己所在的位置。但在web上樹型功能表的應用因d沒有理想的現成元件可以拿過來直接使用,所以一般的情況下,程
式師主要是通過JavaScript來實現一些簡單的樹型結構功能表,但這些功能表往往都是事先定好各功能表專案,以及各
功能表專案之間的層次關係,不利於擴充,一旦需要另一個功能表結構時,往往還需要重新編寫,因此使用起來不是
很方便。     經過對函數遞迴的研究,我發現這種樹型功能表可以通過遞迴函數,使樹型功能表的顯示實現動態變化,並沒有級數
的限制。下面就是我用php,MySQL,JavaScript寫的一個動態樹型功能表的處理代碼,如果大家有興趣的話,就和我一
起來看看我是如何實現的吧:)     首先,我們需要一個資料庫,在這個資料庫中,我們建立以下一張表:     CREATE TABLE menu ( 
id tinyint(4) NOT NULL auto_increment, 
parent_id tinyint(4) DEFAULT '0' NOT NULL, 
name varchar(20), 
url varchar(60), 
PRIMARY KEY (id) 
);     這張表中 
id d索引 
parent_id 用來保存上一級功能表的id號,如果是一級功能表則d0 
name d功能表的名稱,也就是要在頁面上顯示的功能表內容 
url 如果某功能表d末級功能表,則需要指定該連接的url位址,這個欄位就是用來保存此位址的,其他非末級功能表,
該欄位d空     好了,資料庫有了,你就可以添加一些記錄了,下面是我做測試的時候,使用的一些記錄:     INSERT INTO menu VALUES ( '1', '0', '人事管理', ''); 
INSERT INTO menu VALUES ( '2', '0', '通訊交流', ''); 
INSERT INTO menu VALUES ( '3', '1', '檔案管理', ''); 
INSERT INTO menu VALUES ( '4', '1', '考勤管理', 'http://localhost/personal/attendance.php'); 
INSERT INTO menu VALUES ( '5', '2', '通訊錄', ''); 
INSERT INTO menu VALUES ( '6', '2', '網路會議', ''); 
INSERT INTO menu VALUES ( '7', '3', '新增檔案', 'http://localhost/personal/add_achive.php'); 
INSERT INTO menu VALUES ( '8', '3', '查詢檔案', 'http://localhost/personal/search_archive.php'); 
INSERT INTO menu VALUES ( '9', '3', '刪除檔案', 'http://localhost/personal/delete_archive.php'); 
INSERT INTO menu VALUES ( '10', '5', '新增通訊記錄', 'http://localhost/communication/add_address.php'); 
INSERT INTO menu VALUES ( '11', '5', '查詢通訊記錄', 'http://localhost/communication/search_address.php'); 
INSERT INTO menu VALUES ( '12', '5', '刪除通訊記錄', 'http://localhost/communication/delete_address.php'); 
INSERT INTO menu VALUES ( '13', '6', '召開會議', 'http://localhost/communication/convence_meeting.php'); 
INSERT INTO menu VALUES ( '14', '6', '會議查詢', 'http://localhost/communication/search_meeting.ph');     在添加記錄的時候,一定要注意,非一級功能表的parent_id一定要指定d上級功能表的ID號,否則你的功能表是不
會顯示出來的:)     好了!有了資料庫,下面就是通過php,JavaScript把功能表從資料庫中讀出來,並顯示出來了:)     1、JavaScript腳本: 
function ShowMenu(MenuID) 
{ 
if(MenuID.style.display=="none") 
{ 
MenuID.style.display=""; 
} 
else 
{ 
MenuID.style.display="none"; 
} 
} 
這個腳本很簡單,就是用來回應點擊某個功能表被點擊的事件的。     2、CSS文件: 
<!-- 表格樣式 --> 
TD { 
FONT-FAMILY: "Verdana", "宋體"; FONT-SIZE: 12px; LINE-HEIGHT: 130%; letter-spacing:1px 
}     <!-- 超級連接樣式 --> 
A:link { 
COLOR: #990000; FONT-FAMILY: "Verdana", "宋體"; FONT-SIZE: 12px; TEXT-DECORATION: none; letter-spacing:1px 
} 
A:visited { 
COLOR: #990000; FONT-FAMILY: "Verdana", "宋體"; FONT-SIZE: 12px; TEXT-DECORATION: none; letter-spacing:1px 
} 
A:active { 
COLOR: #990000; FONT-FAMILY: "Verdana", "宋體"; FONT-SIZE: 12px; TEXT-DECORATION: none; letter-spacing:1px 
} 
A:hover { 
COLOR: #ff0000; FONT-FAMILY: "Verdana", "宋體"; FONT-SIZE: 12px; TEXT-DECORATION: underline; letter-spacing:1px 
}     <!-- 其他樣式 --> 
.Menu { 
COLOR:#000000; FONT-FAMILY: "Verdana", "宋體"; FONT-SIZE: 12px; CURSOR: hand 
}     定義了一些基本的樣式資訊,比如字體,岫漶A超級連接的樣式等,如果你想改變樣式的話,只要修改這裏就行了!     3、下面就是我的php頁面了!     <html> 
<head> 
<link href='style.css' rel=stylesheet> 
 
</head> 
<body> 
<?php 
//基本變數設置 
$GLOBALS["ID"] =1; //用來跟蹤下拉功能表的ID號 
$layer=1; //用來跟蹤當前功能表的級數     //連接資料庫 
$Con=mysql_connect("localhost","root",""); 
mysql_select_db("work");     //提取一級功能表 
$sql="select * from menu where parent_id=0"; 
$result=mysql_query($sql,$Con);     //如果一級功能表存在則開始功能表的顯示 
if(mysql_num_rows($result)>0) ShowTreeMenu($Con,$result,$layer,$ID);     //============================================= 
//顯示樹型功能表函數 ShowTreeMenu($con,$result,$layer) 
//$con:資料庫連接 
//$result:需要顯示的功能表記錄集 
//layer:需要顯示的功能表的級數 
//============================================= 
function ShowTreeMenu($Con,$result,$layer) 
{ 
//取得需要顯示的功能表的專案數 
$numrows=mysql_num_rows($result);     //開始顯示功能表,每個子功能表都用一個表格來表示 
echo "";     for($rows=0;$rows<$numrows;$rows++) 
{ 
//將當前功能表專案的內容導入陣列 
$menu=mysql_fetch_array($result);     //提取功能表專案的子功能表記錄集 
$sql="select * from menu where parent_id=$menu[id]"; 
$result_sub=mysql_query($sql,$Con);     echo ""; 
//如果該功能表專案有子功能表,則添加JavaScript onClick語句 
if(mysql_num_rows($result_sub)>0) 
{ 
echo ""; 
echo ""; 
echo ""; 
} 
//繼續顯示下一個功能表專案 
} 
echo "
"; //將級數加1 $layer++; //遞迴調用ShowTreeMenu()函數,生成子功能表 ShowTreeMenu($Con,$result_sub,$layer); //子功能表處理完成,返回到遞迴的上一層,將級數減1 $layer--; echo "
"; } ?> </body> </html> 在上面的php頁面裏面,我定義了一個函數ShowTreeMenu(),通過這個函數的調用,會從資料庫中遞迴的調出每個功 能表專案,並顯示在頁面上了:) 好了!肯定還有很多地方不是完善,如果大家有什l意見,請給我發Mail: webmaster@code-labs.com,我好繼續把 它完善!做得更好
發表人 - conundrum 於 2004/01/27 19:28:15
系統時間:2024-05-07 4:17:59
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!