说明:
案例使用自己设计的数据表结构,完成一个简易小说网站的数据管理,基本功能:
1、首页 index.php 首页展示的是各个分栏目推荐的小说,以数据表种的推荐标识作为识别,首页推荐位有4个。只展示当前状态正常且设置了推荐表示的书籍
2、分类页 type.php 根据数据库种的分类id标识,将分类id通过GET方式携带到分类页,并在分类页通过后台数据的查找,展示出需要的分类书籍信息,每类分类信息优先图文展示具有分类推荐标识的六本书籍。
3、书目介绍页 list.php 用户通过点击书名或图书图片连接跳转到数目介绍页面,本页面包括书籍介绍和已有的书籍目录列表。用户可以同点击选取查看对应的章节内容。
4、内容页 content.php 通过用户点击提交的GET请求,直接从后台查询出对应的内容ID,并显示在内容区块,由于本页设置会出现上下页的功能,所以要注意当读者在第一页 和最后一页时 点击上一页或下一页要做对应的判断处理,只有当前页不是第一页的情况下上一页才会生效,只有当前页不是最后以页的情况下,下一页才会生效。
5、本次案例过程中,因为使用了文件引入的模块操作,include 引入了文件头,而文件头中已设置启用了对应的sql实例,所以,在对应的不同文件主体中就不用再次设置新的数据库实例,可以直接使用PDO。
6、关于数据表设计:char(10) 标示只能输入10个字符 如纯英文10个字母 10个数字 10个汉字 总之长度最大为10的字符串。 varchar(10) 变长的,总之长度最大为10的字符串。
7、数据表机构
其中:
navType = 书籍分类表 bookInfo =书籍详情表 bookList = 图书列表 account= 用户登录表 userInfo = 用户信息表
用户权限角色管理 还没弄明白怎么实现,预留的,慢慢试。。。。
role=用户校色表(还未设置对应功能) menu = 菜单表 user_role 用户角色关联表 role_menu 角色权限关联表
实例样图:index.php
分类页 type.php
目录页 list.php
内容页 content.php
实例代码:
文件头 header.php 和文件底 footer.php(footer页太简单不提供代码了。。。)
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>蒜球小说网</title> <style> /*通用标签预设样式*/ *{margin: 0;padding: 0;} body{background-color:lightgrey;} a { text-decoration:none;color:black;} a:hover { text-decoration:none;color:red;} ul{ list-style-type: none;} p{line-height: 26px} /*头部样式设置*/ .header{width: 100%;color: #e2e2e2;} .row{width:100%;height: 70px;background-color:white;} .header_main{width:1000px;height: 70px;margin: auto;line-height: 60px;} .logo{width: 400px;height: 70px;float: left;} .logo img{width: 280px;height: 60px;margin-top: 5px;} .seo{float: left;width: 400px;height: 70px;line-height: 70px;} .seo input{width:300px;height: 26px;border-radius:5px ;} .seo button{width:90px;height: 34px;margin-top: 2px;border-radius:5px ;} .login{float: left;margin-left: 30px;width: 160px;height: 60px;color: #000000;} .login ul{width: 160px;height: 60px;line-height: 60px;list-style-type: none;} .login ul li{float: right;display: inline-block;width: 40px;padding: 0 10px; } /*导航条样式设置*/ .header .nav{clear: both;width:960px;height: 30px;margin: 10px auto;padding: 0 20px;line-height: 30px;border-radius: 4px;background-color:coral;} .nav ul{list-style-type: none;color: white;} .nav ul li{float: left;width: 100px;text-align: center;display: inline-block;} .nav ul li:hover {float: left;width: 100px;text-align: center;display: inline-block;background-color: #FF0000;} .nav ul li a{color: white;} /*主体外框样式 所有页面通用*/ .main{width: 1000px;margin: 10px auto;} /*首页左浮动主体设置*/ .main_left{width: 694px;height: 340px;float: left;margin:0 5px 0 0;background-color: cornsilk;border:3px solid #A9A9A9;} .main_left .item{width:335px;height:154px;float: left;padding:10px 0 0 10px;background-color: cornsilk;} .main_left .item ***age{width:120px;float: left;} .main_left .item ***age img{ width:120px; height: 150px; } .main_left .item dl{ width:190px; height: 153px; float: right; font-size: 12px; } .main_left .item dt{ height: 25px; line-height: 25px; overflow: hidden; font-size:16px; padding-bottom: 4px; font-weight: bold; border-bottom: 1px dotted cornflowerblue; } .main_left .item dt a{ color: black; } .main_left .item dt a:hover{ color: red; } .main_left .item dt span{ color: #A9A9A9; font-size:16px; font-weight: bold; float: right; } .main_left .item dd{ margin-top: 4px; text-indent:24px; height: 128px; line-height: 20px; overflow: hidden; text-align: justify; } /*首页右浮动主体设置*/ .main_right{ width: 282px; height: 340px; float: right; margin-left: 7px; background-color: cornsilk; border:3px solid #A9A9A9; } .main_right h3{ height: 30px; line-height: 30px; padding-left: 10px; font-size: 18px; background-color: lightgrey; } .main_right .item{ width:272px; height:154px; float: left; margin: 5px 5px 0 5px; overflow: hidden; background-color: cornsilk; } .main_right .item ***age{ width:120px; float: left; } .main_right .item ***age img{ width:120px; height: 150px; } .main_right .item ***g_text{ /*width:152px;*/ font-size: 14px; float: right; line-height: 25px; } .main_right .item ***g_text li{ width:140px; display: block; margin: 4px 0 3px 5px; border-bottom: 1px dotted cornflowerblue; } .main_right .item ***g_text a{color: #000000;} .main_right .item ***g_text a:hover{color: red;} /*分栏目页 主体样式*/ .main_type{ width: 994px; height: 340px; background-color: cornsilk; border:3px solid #A9A9A9; } .main_type .item{ width:320px; height:154px; float: left; padding:10px 0 0 10px; background-color: cornsilk; } .main_type .item ***age{ width:120px; float: left; } .main_type .item ***age img{ width:120px; height: 150px; } .main_type .item dl{ width:190px; height: 153px; float: right; font-size: 12px; } .main_type .item dt{ height: 25px; line-height: 25px; overflow: hidden; font-size:16px; padding-bottom: 4px; font-weight: bold; border-bottom: 1px dotted cornflowerblue; } .main_type .item dt a{ color: black; } .main_type .item dt a:hover{ color: red; } .main_type .item dt span{ color: #A9A9A9; font-size:16px; font-weight: bold; float: right; } .main_type .item dd{ margin-top: 4px; text-indent:24px; height: 128px; line-height: 20px; overflow: hidden; text-align: justify; } /* 文档目录页 list.php */ .main_list{width: 994px;height: 250px;background-color: cornsilk;border:3px solid #A9A9A9;} .main_list .nav{width: 100%;height: 30px;background-color:lightskyblue;border-bottom: 2px solid #A9A9A9;} .main_list .pic{width: 180px;height: 210px;float: left;margin: 5px 0 0 10px;} .main_list .pic img{ width: 160px;height: 200px;float: left;border-radius: 3px;} .main_list .main_info{width: 794px;height: 200px;float: left;margin-top: 5px;} .main_list .main_info .title{width: 100%;} .main_list .main_info .title p{height: 25px;line-height: 25px;float: left; width: 350px;margin-top: 5px;padding-top: 5px;} .main_list .main_info .content{width: 100%;height: 80px;line-height: 25px;text-align: justify;border-top: 1px dotted #A9A9A9;padding-top: 5px;margin-top: 5px;} .main_list .main_info .content p{line-height: 25px;float: left;display: inline-block;} .main_list .main_info .content span{margin-top: 10px;display: inline-block;} .main_list .main_info .content ul{float: left;display: inline-block;} .main_list .main_info .content li{float: left;display: inline-block;} .main_list .main_info .content li a{color: red;} .main_list .main_info .content li a:hover{color: black;} .main .content_list{width: 980px;height: 100%;border-radius: 5px;background-color: cornsilk;margin-top: 15px;padding: 10px 7px;border:3px solid #A9A9A9;} .main .content_list dd{color: black;display: block;width: 195px;height: 30px;float: left;border-bottom: 1px dashed #A9A9A9;} .main .content_list dd a{color: black;display: block;width: 155px;height: 30px;float: left;line-height: 30px;padding-left: 40px;} /*内容页样式 content.php */ .main_con {width: 994px;height: 100%; background-color: cornsilk;border: 3px solid #A9A9A9;} .main_con .main_info{height: 26px;padding: 10px 0 10px;text-align: center;} .main_con .nav{width: 100%;height: 30px;background-color:lightskyblue;border-bottom: 2px solid #A9A9A9; .main_con .list{width: 994px; height: 26px;padding: 10px 0 10px; text-align: center;} .main_con .list ul li{float: none;width:100px;text-align: center;display: inline-block;} .main_con .content{ width:944px;padding: 15px 25px;font-size: 20px;line-height: 26px;letter-spacing:3px;white-space:pre-line;text-align: justify;} /*全站通用底部样式*/ .footer{width: 1000px;height: 80px;margin: auto;background-color: black;color: #ffffff;text-align: center;opacity: 0.5;} .author{margin-top: 20px;padding-top: 15px;} .clear{ clear: both;} </style> <?php //数据库连接 实例化 try{ $pdo =new PDO("mysql:host=127.0.0.1;dbname=book","root","root"); }catch (PDOException $e){ die("数据库连接失败:".$e->getMessage()); } //在图书类型表中 查询状态正常的书籍分类 ID 名称 $sql = "SELECT `navName`,`typeID` FROM `navType` WHERE `state`= :state"; //绑定SQL语句 $stmt = $pdo->prepare($sql); //预处理执行语句 $stmt->execute(['state'=>0]); //获取执行结构集合 $rows =$stmt->fetchAll(); ?> </head> <body> <div class="header"> <div class="row"> <div class="header_main"> <div class="logo"><img src="../../images/logo.png" alt=""></div> <div class="seo"> <form action=""> <label for="text"></label> <input type="text" id="text" name="text" placeholder="请输入要查询的书名"> <button type="button">查询</button> </form> </div> <div class="login"> <ul><li>登录</li> <li>注册</li> </ul> </div> </div> </div> <div class="nav"> <ul> <li><a href="index.php">首页</a></li> <!-- foreach 循环输出获取的图书类型ID 和分类名称 --> <?php foreach($rows as $val) { ?> <!-- 分类模板页type.php 配合GET方式加上图书分类ID 实现分类模板页跳转 type.php?typeID=变量 --> <li><a href="type.php?typeID=<?php echo $val['typeID'] ?>"><?php echo $val['navName'] ?></a></li> <?php }?> </ul> </div> </div>
点击 "运行实例" 按钮查看在线实例
一、首页 index.php页 代码
<?php include __DIR__."./lib/model/header.php"; //引用的文件头已有数据库是实例,所以不再新建实例 //查询首页推荐标志位的书籍信息 $sql = "SELECT `bookName`,`author`,`pic`,`summary`,`bookID` FROM `bookList` WHERE `recommendIndex` = :index"; //绑定查询语句 $stmt = $pdo->prepare($sql); //参数绑定执行预处理 $stmt->execute(["index"=>0]); //获得处理结果,并将结果集赋值给变量 用于推荐区块的数据显示 $left_rows =$stmt->fetchALL(PDO::FETCH_ASSOC ); $sql = "SELECT `bookName`,`author`,`pic`,`summary`,`bookID` FROM `bookList` WHERE `recommendIndex` = :index AND `recommendType` = :typeID"; $stmt = $pdo->prepare($sql); $stmt->execute(["index"=>1,"typeID"=>0]); $right_rows = $stmt->fetchAll(PDO::FETCH_ASSOC); ?> <div class="main"> <div class="main_left"> <?php foreach($left_rows as $val){ ?> <div class="item"> <div class="image"> <a href="list.php?bookID=<?PHP echo $val['bookID']?>"> <img src="./images/<?php echo $val['pic'] ?>" alt=""> </a> </div> <dl> <dt> <a href="list.php?bookID=<?PHP echo $val['bookID']?>"><?php echo $val['bookName'] ?></a> <span><?php echo $val['author'] ?></span> </dt> <dd> <?php echo $val['summary'] ?> </dd> </dl> <div class="clear"></div> </div> <?php }?> </div> <div class="main_right"> <h3>好书推荐</h3> <div class="item"> <!-- --><?PHP //foreach($right_rows as $val){?> <div class="image"> <a href=""> <img src="./images/10001.jpg" alt=""> <!-- <img src="./images/--><?php //echo $val['pic']?><!--" alt="">--> </a> </div> <div class="img_text"> <ul> <!-- <li><a href="">--><?php //echo $val['bookName']?><!--</a></li>--> <!-- --><?php //}?> <li><a href="">凡人修仙传之仙界篇</a></li> <li><a href="">凡人修仙传之仙界篇</a></li> <li><a href="">凡人修仙传之仙界篇</a></li> <li><a href="">凡人修仙传之仙界篇</a></li> </ul> </div> </div> <h3 class="clear">完本好书</h3> </div> <div class="clear"></div> </div> <?php include __DIR__."./lib/model/footer.php"; ?>
点击 "运行实例" 按钮查看在线实例
二、图书分类页type.php
通过GET 方式获得分类查询需要的ID 经过查询进而显示所需页面内容
<?php include "lib/model/header.php"; //获取图书分类的ID $id = $_GET['typeID']; //生成根据图书分类ID查询的语句 推荐位***6个 所以获取六个数据即可 $sql = "SELECT `bookName`,`author`,`pic`,`summary`,`bookID` FROM bookList WHERE `typeID` = :id LIMIT 0,6"; $stmt = $pdo->prepare($sql); $stmt->execute(["id"=>$id]); //获取结果记录集 $rows =$stmt->fetchALL(PDO::FETCH_ASSOC); ?> <div class="main"> <div class="main_type"> <?php foreach($rows as $val ){?> <div class="item"> <div class="image"> <!-- GET方式传递图书的识别ID到图书目录列表模板页,用于页面内容查询 --> <a href="list.php?bookID=<?php echo $val['bookID']?>"> <!--图书配图--> <img src="./images/<?php echo $val['pic']?>" alt=""> </a> </div> <dl> <dt> <!-- GET方式传递图书的识别ID到图书目录列表模板页,用于页面内容查询 --> <a href="list.php?bookID=<?php echo $val['bookID']?>"><?php echo $val['bookName']?></a> <!--图书作者--> <span><?php echo $val['author']?></span> </dt> <dd> <!--图书简介--> <?php echo $val['summary']?> </dd> </dl> <div class="clear"></div> </div> <?php }?> </div> </div> <?php include "lib/model/footer.php"; ?>
点击 "运行实例" 按钮查看在线实例
三、图书目录页 list.php
<?php include __DIR__."./lib/model/header.php"; //GET获得图书的识别ID $bookID = $_GET['bookID']; //根据ID查询该图书主要信息 $sql ="SELECT `bookName`,`author`,`summary`,`typeID`FROM bookList WHERE `bookID` = :id"; $stmt = $pdo->prepare($sql); $stmt->execute(["id"=>$bookID]); $bookInfo =$stmt->fetch(PDO::FETCH_ASSOC); //根据ID查询该图书所归属的分类信息 可以获得图书归属分类的数据 仙侠小说 $typeID = $bookInfo['typeID']; $sql = "SELECT `navName`,`typeID` FROM navType WHERE `typeID` = :id"; $stmt = $pdo->prepare($sql); $stmt->execute(["id"=>$typeID]); $typeInfo =$stmt->fetch(PDO::FETCH_ASSOC); //根据ID查询该图书的详细信息 包括章节 内容 等 $sql ="SELECT `nodeID`,`nodeName`,`createTime` FROM `bookInfo` WHERE `bookID` =:id ORDER BY `nodeID` ASC "; $stmt = $pdo->prepare($sql); $stmt->execute(["id"=>$bookID]); $count = $stmt->rowCount(); //统计当前章节总数,如章节总数不是5的整倍数 则为变量 $num赋值 在页面循环,主要是为了主体页面美观 $i= $count % 5; $num = 0; if ($i!=0){ $num = 5-$i; } //获得图书的详细的数据集合 $rows = $stmt->fetchALL(PDO::FETCH_ASSOC); ?> <div class="main"> <div class="main_list"> <div class="nav"></div> <div class="pic"> <img src="./images/10001.jpg" alt=""> </div> <div class="main_info"> <div class="title"> <h1><?php echo $bookInfo['bookName']?></h1> <p>本 书 作 者 : <?php echo $bookInfo['author']?></p> <p>文 章 类 别 : <?php echo $typeInfo['navName']?></p> <p>最 新 章 节 : 第<?php echo $count?>章 树倒猢狲散</p> <p>更 新 时 间 : 2019-07-22 12:45</p> </div> <div class="content clear"> <p><?php echo $bookInfo['summary']?></p> <span> <p>过往作品集合:</p> <ul> <li><a href="">《凡人修仙传》</a></li> <li><a href="">《魔天记》</a></li> <li><a href="">《玄界之门》</a></li> </ul> </span> </div> </div> </div> <div class="content_list"> <dl> <!--循环输出图书详细信息--> <?php foreach($rows as $val){?> <!-- GET方式传递章节ID信息到内容模板页,用于模板页查询显示 --> <dd><a href="content.php?nodeID=<?php echo $val['nodeID']?>"> <!-- 章节计数 --> 第<?php echo $val['nodeID']?>章 <!-- 章节名称 --> <?php echo $val['nodeName']?></a> </dd> <?php }?> <!-- 如果当前章节未满足一行5个章节的显示样式,空的位置由空章节填补--> <?php for($j=0;$j<$num;$j++){ ?> <dd></dd> <?php }?> </dl> <div class="clear"></div> </div> </div> <?php include __DIR__."./lib/model/footer.php"; ?>
点击 "运行实例" 按钮查看在线实例
四、content.php 内容显示模板页
<?php include __DIR__."./lib/model/header.php"; //获取文章节点ID $nodeID =$_GET['nodeID']; //根据文章节点ID查询对应ID的文章内容 $sql = "SELECT `nodeID`,`nodeName`,`content`,`bookID` FROM `bookInfo` WHERE `nodeID` = :id"; $stmt = $pdo->prepare($sql); $stmt->execute(["id"=>$nodeID]); $result =$stmt->fetch(PDO::FETCH_ASSOC); $bookID=$result['bookID']; //根据图书的ID查询统计当前一共有多少个章节点 用于设置下一页的ID参数 $sql = "SELECT `nodeID`,`nodeName`,`content`,`bookID` FROM `bookInfo` WHERE `bookID` = :id"; $stmt = $pdo->prepare($sql); $stmt->execute(["id"=>$bookID]); //如果当前页数的ID等于统计值,则标识当前页为最后一页,即下一页无效. $count = $stmt->rowCount(); ?> <div class="main"> <div class="main_con"> <div class="nav"></div> <div class="main_info"> <!-- 输出章节数 与章节内容--> <h2>第<?php echo $nodeID?>章 <?php echo $result['nodeName']?></h2> </div> <div class="list"> <ul> <!-- 当前页为第一页时 上一页 内容无效--> <li><a href="content.php?nodeID=<?php echo ($nodeID-1>0)?$nodeID-1:$nodeID ?>">上一章</a></li> <li><a href="list.php?bookID=<?php echo $result['bookID']?>">章节列表</a></li> <!-- 当前页为最后一页时 下一页 无效--> <li><a href="content.php?nodeID=<?php echo ($nodeID+1<=$count)?$nodeID+1:$nodeID ?>">下一章</a></li> </ul> </div> <div class="content"> <?php echo $result['content']?> </div> <div class="list"> <ul> <li><a href="content.php?nodeID=<?php echo ($nodeID-1>0)?$nodeID-1:$nodeID ?>">上一章</a></li> <li><a href="list.php?bookID=<?php echo $result['bookID']?>">章节列表</a></li> <li><a href="content.php?nodeID=<?php echo ($nodeID+1<=$count)?$nodeID+1:$nodeID ?>">下一章</a></li> </ul> </div> </div> </div> <?php include __DIR__."./lib/model/footer.php"; ?>
点击 "运行实例" 按钮查看在线实例