结合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用到实处,很高兴,所以需要记住。