模仿文件存儲方式,來進行添加、修改、添加子類的操作。
結合Mysql和Php完成的一個簡單實例。
過程如下:
①.先連接數據庫,因為在多個頁面都會使用同一個連接,所以可以將連接數據庫的過程封裝成函數,方便各個頁面調用(include ‘‘).代碼格式如下:
function getConnect() { $host = ‘localhost‘; $pwd = ‘root‘; $username = ‘root‘; $dbname = ‘operation‘; $conn = new mysqli($host, $username, $pwd, $dbname); if ($conn->connect_error) {die("數據庫連接失敗"); } return $conn; } function Select($sql){ $conn=getConnect(); $result=$conn->query($sql); return $result; }
②.建立一個數據庫表,用來存儲數據,並方便的進行相應操作。
③.總共有有五個頁面,分別是導航頁面,用來進行簡單的導航,方便操作;數據表顯示頁面,進過查詢數據庫,將查到的數據按照目錄的級別進行顯示;添加文件類型的頁面,用來人工添加文件;修改頁面,用來當操作修改時跳轉的頁面;添加子類頁面,用來添加相應的子類,當點擊添加子類時,需要跳轉的頁面。
導航頁面:(用的是框架集進行分欄瀏覽)
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>首頁</title>
</head>
<frameset cols=‘20%,*‘>
<frame src=‘navMessage.php‘ />
<frame src=‘typeList.php‘ name=‘main‘/>
</frameset>
</html>
這裏的navMessage.php是信息指示頁面:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <title>首頁</title> <link rel="stylesheet" type="text/css" href="css/style.css"> </head> <body> <div> <ul> <li><a href="typeList.php" target="main">類別管理</a></li> <li><a href="addList.php" target="main">類別添加</a></li> </ul> </div> </body> </html>
數據表顯示頁面:
<?php /* * 用來查詢數據庫中的數據,按照目錄的形式輸出來 */ include ‘getConnect.php‘; ?> <!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <title>首頁</title> <link rel="stylesheet" type="text/css" href="css/style.css"> </head> <body> <center> <h2>查看數據表</h2> <hr /> <table style="width: 800px;"> <tr> <th style="width:130px;background: #ccc;height: 40px;">編號</th> <th style="width:130px;background: #ccc;height: 40px;">類別信息</th> <th style="width:130px;background: #ccc;height: 40px;">目錄級別</th> <th style="width:130px;background: #ccc;height: 40px;">所屬根目錄</th> <th style="width:130px;background: #ccc;height: 40px;">所在路徑</th> <th style="width:200px;background: #ccc;height: 40px;">操作</th> </tr> <?php function showList($id = ‘/‘) { echo $id; $result = Select("select * from type_2 where fid= ‘$id‘"); while ($row = $result->fetch_assoc()) { ?> <tr> <td><?php echo $row[‘id‘] ?></td> <td><?php echo $row[‘typename‘] ?></td> <td><?php echo $row[‘class‘] ?></td> <td><?php echo $row[‘fid‘] ?></td> <td><?php echo $row[‘road‘] ?></td> <td><a href="action.php?action=del&road=<?php echo $row[‘road‘]; ?>&class=<?php echo $row[‘class‘] ?>">刪除</a>|<a href=‘updateList.php?fid=<?php echo $row[‘fid‘] ?>&typename=<?php echo $row[‘typename‘] ?>&road=<?php echo $row[‘road‘] ?>‘>修改</a>|<a href="addSon.php?action=addSon&road=<?php echo $row[‘road‘] ?>">添加子類</a></td> </tr> <?php // if($row[‘fid‘]==‘/‘){ // $row[‘fid‘]=‘‘; // showList($row[‘typename‘]); // }else{ // showList($row[‘fid‘].‘/‘.$row[‘typename‘]); if ($row[‘road‘] == ‘/‘) { break; } showList($row[‘road‘]); // } // echo "|"; } } showList(); ?> </table> </center> </body> </html>
這裏的主要思想是遞歸找到目錄及其子目錄。
首先需要明白的是這個遞歸查找的規則是什麽:
在我建立的表中,表中信息主要有:id(數據庫自動+1),typename(文件名)、fid(它的父級文件所在的目錄),road(當前文件的目錄)。
也就是遞歸傳進去的參數,是作為查找文件的父目錄來查找的,因為如果是傳文件的road的話,就會導致每次找的是一個文件,無法將它的所有子類找到,因為每個文件的road是
唯一的。更重要的,也無法進入查找語句,因為第一個首先傳進的參數是一個根目錄,根目錄的當前路徑是‘/’,它的typename也是‘/‘,始終是進不了它的子目錄的查找範圍。
所以遞歸的規則是:傳進去的是即將要查找相應目錄的父級目錄的文件。
當然,為了實現上面的查找規範,需要滿足一定的輸入規範。添加文件頁面代碼如下:
<?php include "getConnect.php"; /* * 當輸出將表單數據所在父目錄的路徑做為參數傳過去,則會作為響應子目錄的父目錄存在 */ ?> <!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <title>首頁</title> <link rel="stylesheet" type="text/css" href="css/style.css"> </head> <body> <center> <h2>歡迎添加類別</h2> <hr> <form action="action.php?action=add" method="post"> <table> <tr> <td>表中父目錄</td> <td> <select name="fid"> <option value="/">根目錄</option> <?php //可以通過 function showList($id = ‘/‘) { $result = Select("select * from type_2 where fid= ‘$id‘"); while ($row = $result->fetch_assoc()) { ?> <option value="<?php echo $row[‘road‘] ?>"><?php echo $row[‘road‘] ?></option> <?php // if($row[‘fid‘]==‘/‘){ // $row[‘fid‘]=‘‘; // showList($row[‘typename‘]); // }else // showList($row[‘fid‘].‘/‘.$row[‘typename‘]); if ($row[‘road‘] == ‘/‘) { break; } showList($row[‘road‘]); } } showList(); ?> </select> </td> <td><input type="button" value="新建文件目錄"/></td> </tr> <tr><td>類別名稱</td><td><input type=‘text‘ name="typename"/></td></tr> <tr> <td>選擇所屬級別</td> <td> <select name=‘class‘> <option value="0">根目錄</option> <option value="1">一級子目錄</option> <option value="2">二級子目錄</option> <option value="3">三級子目錄</option> <option value="4">四級子目錄</option> </select> </td> </tr> <tr> <td><input type="submit" value="添加"/></td> <td><input type="reset" value="重置"/></td> </tr> </table> </form> </center> </body> </html>
這是用form表單的形式,主要是方便多個數據的。在這個表單中,有一個是選擇你所在的根目錄的選項,選中的根目錄就作為該添加文件的fid,而路徑就是傳過去的fid 連接新添加文件的typename。在action.php主要是用來操作數據的,裏面有對數據的添加、刪除以及更新。添加數據的部分代碼是:
case ‘add‘: $fid=$_POST[‘fid‘]; $typename=$_POST[‘typename‘]; $class=$_POST[‘class‘]; $result_typename=Select("select typename,class,road from type_2"); $road=rtrim($fid,‘/‘).‘/‘.$typename; while($typename_s=$result_typename->fetch_assoc()){ if((($typename_s[‘road‘]==$road)&&($typename==$typename_s[‘typename‘]))){ echo "<script>alert(‘用戶名重復‘)</script>"; die("數據添加失敗"); } } $result=Select("insert into type_2(typename,fid,class,road)values(‘$typename‘,‘$fid‘,‘$class‘,‘$road‘)"); if($result){ echo "<script>alert(‘數據添加成功‘)</script>"; echo "<script>window.location=‘typeList.php‘</script>"; } break;
這裏需要提到的是添加子類需要跳轉的頁面,其實和添加類別這個頁面是一樣的,分開來寫詩因為這個添加子類的頁面需要獲得一個父類路徑,就是用來指定需要為哪個文件添加子文件,但是跳轉後也可以改變父類的路徑,這是靈活的。添加後,頁面也是跳轉到action.php中的add。添加子類跳轉的頁面代碼如下:
<?php /* * 這裏需要一個表單,主要是用來將多份數據傳送到指定的頁面,並進行處理 * 表單主要傳送的數據有: * 需要修改對象的類別名、所屬目錄級別以及它的fid。id是每個單體的唯一標識,一旦創建就不能修改,所以當需要選中 * 哪一個實體,即傳入它的id號。 * 修改後的版本:就是更新後的中是選擇改變fid(); * 更新的目的主要是修改數據的父目錄,則應該傳遞的是父目錄的名字,因為它存的路徑是它的當前路徑 */ include "getConnect.php"; ?> <!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <title>用來更新數據</title> </head> <body> <center> <h2>歡迎數據的更新</h2> <hr> <form action="action.php?action=add" method="post"> <table> <tr> <td>選擇所在父級目錄</td> <td> <select name=‘fid‘> <option value="/">根目錄</option> <?php //可以通過 function showList($id = ‘/‘) { $result = Select("select * from type_2 where fid= ‘$id‘"); while ($row = $result->fetch_assoc()) { ?> <option <?php if($_GET[‘road‘]==$row[‘road‘]) echo ‘selected‘?> value="<?php echo $row[‘road‘] ?>"><?php echo $row[‘road‘] ?></option> <?php if($row[‘road‘]==‘/‘){ break; } showList($row[‘road‘]); } } showList(); ?> ?> </select> </td> </tr> <tr><td>類別名稱</td><td><input type=‘text‘ name="typename"/></td></tr> <tr> <td>選擇所屬級別</td> <td> <select name=‘class‘> <option value="0">根目錄</option> <option value="1">一級子目錄</option> <option value="2">二級子目錄</option> <option value="3">三級子目錄</option> <option value="4">四級子目錄</option> </select> </td> </tr> <tr> <td><input type="submit" value="修改"/></td> </tr> </table> </form> </center> </body> </html>
更新操作:主要更新所選文件的父級目錄和它的文件名,代碼如下:
<?php /* * 這裏需要一個表單,主要是用來將多份數據傳送到指定的頁面,並進行處理 * 表單主要傳送的數據有: * 需要修改對象的類別名、所屬目錄級別以及它的fid。id是每個單體的唯一標識,一旦創建就不能修改,所以當需要選中 * 哪一個實體,即傳入它的id號。 * 修改後的版本:就是更新後的中是選擇改變fid(); * 更新的目的主要是修改數據的父目錄,則應該傳遞的是父目錄的名字,因為它存的路徑是它的當前路徑 */ include "getConnect.php"; ?> <!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <title>用來更新數據</title> </head> <body> <center> <h2>歡迎數據的更新</h2> <hr> <form action="action.php?action=update" method="post"> <table> <tr> <td>選擇所在父級目錄</td> <td> <select name=‘road‘> <option value="/">根目錄</option> <?php //可以通過 function showList($id = ‘/‘) { $result = Select("select * from type_2 where fid= ‘$id‘"); while ($row = $result->fetch_assoc()) { ?> <option <?php if($_GET[‘road‘]==$row[‘road‘]) echo ‘selected‘?> value="<?php echo $row[‘road‘] ?>"><?php echo $row[‘road‘] ?></option> <?php // if($row[‘fid‘]==‘/‘){ // $row[‘fid‘]=‘‘; // showList($row[‘typename‘]); // }else // showList($row[‘fid‘].‘/‘.$row[‘typename‘]); if($row[‘road‘]==‘/‘){ break; } showList($row[‘road‘]); } } showList(); ?> ?> </select> </td> </tr> <tr><td>類別名稱</td><td><input type=‘text‘ name="typename" value="<?php echo $_GET[‘typename‘]?>"/><input type="hidden" name="oldname" value="<?php echo $_GET[‘road‘]?>"/></td></tr> <tr> <td>選擇所屬級別</td> <td> <select name=‘class‘> <option value="0">根目錄</option> <option value="1">一級子目錄</option> <option value="2">二級子目錄</option> <option value="3">三級子目錄</option> <option value="4">四級子目錄</option> </select> </td> </tr> <tr> <td><input type="submit" value="更新修改"/></td> </tr> </table> </form> </center> </body> </html>
跳轉帶action.php中的update:代碼如下:
case ‘update‘: $fid=$_POST[‘road‘]; $typename=$_POST[‘typename‘]; $class=$_POST[‘class‘]; $oldname=$_POST[‘oldname‘]; $road=rtrim($fid,‘/‘).‘/‘.$typename; /* * 因為road是唯一的,road包含該文件的文件名和父類文件名,所以一旦重復就導致文件重復,所以需要先遍歷數據庫中是否有相同的road * 如果有則添加不成 */ $result_typename=Select("select typename,class,road from type_2"); while($typename_s=$result_typename->fetch_assoc()){ if((($typename_s[‘road‘]==$road))){ echo "<script>alert(‘用戶名重復‘)</script>"; echo "<script>window.location=‘typeList.php‘</script>"; die("所選的路徑有相同名字的文件,請更換目錄,或文件名字"); } } //用來比較如果修改的後的路徑發生重名,則無法完成更新。 /* * 更新需要一個特定的條件,才能將制定的數據進行更新 */ $result=Select("update type_2 set typename=‘$typename‘,fid=‘$fid‘,class=‘$class‘,road=‘$road‘ where road=‘$oldname‘"); if($result){ echo "<script>alert(‘數據更新成功‘)</script>"; echo "<script>window.location=‘typeList.php‘</script>"; } break;
刪除操作,不需要一個專門的中間頁面,只要選定某個文件,將它的路徑傳到action.php管理頁面,再使用數據庫語句,即可刪除,但需要註意的是,當刪除的文件下有許多子文件,按照我們的電腦的文件刪除原則,一旦這個文件刪除,那麽它的子文件也會被刪除。所以這裏需要簡單的處理。
代碼如下
case ‘del‘: $road=$_GET[‘road‘]; echo $fid; $result=Select("DELETE FROM type_2 WHERE road LIKE ‘$road%‘"); var_dump($result); if($result){ echo "<script>alert(‘刪除成功‘)</script>"; echo "<script>window.location=‘typeList.php‘</script>"; } break;
第一次將like用到實處,很高興,所以需要記住。
模仿文件存儲方式,來進行添加、修改、添加子類的操作。