前言:使用PHP和MySQL开发后台管理系统的过程中,发现有一些通用的【套路小Tip】,这里集中记录一下。结合工作中ing的后台业务,我逐渐体会到:除了技术知识外、能使用户体验好的“使用流程设计”积累也十分重要╭( ???)? ??
项目github地址:https://github.com/66Web/php_book_store,欢迎Star。
一、知识点记录
1、数据库的表名和列名
2、后台用户模块
<input type="hidden" name="id" value=‘<?php echo $row[‘id‘] ?>‘ />
3、_top 是指向:上一级目录
<p><a href="logout.php" target=‘_top‘>|-退出系统</a></p>
4、disabled 禁用username提交,不能修改
<p>管理员名:</p><p><input type="text" name=‘username‘ value=‘<?php echo $row[‘username‘]?>‘ disabled></p>
5、后台修改、删除
6、Select选项‘修改’时显示原选项
<p>类别:</p><p> <select name="class_id"> <?php $sqlClass="select * from class"; //创建sql语句 $rstClass=mysql_query($sqlClass); //发送sql语句 while($rowClass=mysql_fetch_assoc($rstClass)){ //读取并判断mysql服务器返回结果 if($rowClass[‘id‘] == $rowBook[‘class_id‘]){ //rowClass的id 与传过来的rowCook的class_id相同时,选中 加selected echo "<option value=‘{$rowClass[‘id‘]}‘ selected>{$rowClass[‘name‘]}</option>"; }else{ echo "<option value=‘{$rowClass[‘id‘]}‘>{$rowClass[‘name‘]}</option>"; } } ?> </select></p>
7、后台书的模块,delete.php
$file="../../public/uploads/{$img}"; //定义图片文件路径$file2="../../public/uploads/thumb_{$img}" //定义缩略图文件路径//删除图片 删除文件用unlink()unlink($file);unlink($file2);
8、传文件函数
$ext = array_pop(explode(‘.‘,$name));$dst = ‘../../public/uploads/‘.time().mt_rand().‘.‘.$ext;//指定地址,并随机生成新文件名// array_pop() 函数删除数组中的最后一个元素 // explode(‘.‘,$name) 字符串分割函数获得文件扩展名.jpg等$src = $_FILES[‘img‘][‘tmp_name‘]; //文件上传时在临时目录中被保存成一个临时文件的文件名$name = $_FILES[‘img‘][‘name‘]; //上传文件的文件名
//判断 原图x/目标x > 原图y/目标y 以大的比例结果为准1000/500 500/5002 1
$img = basename($dst); //获得目录下的文件名a.jpg
9、PHP中exit; 可以阻止脚本,不用通篇注释。
10、图书模块update.php
$imgerror=$_FILES[‘img‘][‘error‘]; //文件上传错误信息//图片上传--先上传新图,后删除原图,上传失败不删原图if($imgerror === 0){
11、多表查询
$sql="select comment.*,user.username,book.name from comment,user,book where comment.user_id=user.id and comment.book_id=book.id";$rst=mysql_query($sql);
$sql="select book.*,class.name cname from book,class where book.class_id=class.id";$rst=mysql_query($sql);
12、后台评论模块index.php
echo "<td>".date(‘Y-m-d‘,$row[‘time‘])."</td>";
13、在页面里面流通的get post中的数据都变成字符串了
if($row[‘id‘]==1){ //编号为1 的删除按钮的a链接,禁用--<a href=‘javascript:‘></a>,改背景色为灰色 echo "<td><a href=‘javascript:‘ style=‘background:#888‘>删除</a></td>"; }else{ echo "<td><a href=‘delete.php?id={$row["id"]}‘>删除</a></td>";}
14、后台广告模块
15、订单模块
$sql="select indent.price,indent.num,book.name,book.img from indent,book where indent.book_id=book.id and indent.code=‘{$code}‘";$rst=mysql_query($sql);
订单编号code是varchar类型,要加单引号:失误率极高!
indent.code=‘{$code}‘
echo $sql;exit;
加载出缩略图 thumb_{}
echo "<td><img src=‘../../public/uploads/thumb_{$row[‘img‘]}‘ width=‘50px‘></td>";
输出合计
echo "<td>".$row[‘price‘]*$row[‘num‘]."</td>";
16、后台权限把控:后台每一个页面都要写(或模块化引入)
<?php session_start(); if(!$_SESSION[‘userid‘]){ echo "<script>location=‘login.php‘</script>"; exit; //防止程序在跳转之前,突然的,执行下去下面的代码了 }?>
17、session数组:将数据存放在服务器中
session_start();
$_SESSION[‘username‘]=‘user1‘;$_SESSION[‘user_id‘]=‘15‘;
session_start();
$_SESSION=array();
setcookie(‘PHPSESSID‘,‘‘,time()-1,‘/‘);
session_destroy();
18、退出后台登录
<?php session_start(); $_SESSION = array(); //清空session数组 session_destroy(); //删除服务器上PHPSESSID所对应的session文件 setcookie(‘PHPSESSID‘,‘‘,time()-3600,‘/‘); //删除客户端的cookie文件 echo ‘<script>location="login.php"</script>‘;?>
19、前台广告 动态放置
<?php include ‘../public/common/conn.php‘; $sqlAdvert = "select * from advert"; $rstAdvert = mysql_query($sqlAdvert); while($rowAdvert=mysql_fetch_assoc($rstAdvert){ $rowAds[$rowAdvert[‘pos‘]]=$rowAdvert; }?> <div class="ads"> <img src="../public/upadverts/<?php echo $rowAds[0][‘img‘]?>" > </div>
20、网站下不要用绝对路径,这样文件名改动会出问题
<?php $path = $_SERVER[‘PHP_SELF‘]; $arr = explode(‘/‘,$path); $root = ‘/‘.$arr[1]; //获取根目录?><a href=""> <img src="<?php echo $root?>/home/public/img/logo.png" ></a>
21、首页 重复加载的相似度很高的【楼层、数据块】都要通过 php循环加载
<?php $sqlClass = "select * from class order by id limit 2"; $rstClass = mysql_query($sqlClass); $f = 1; while($rowClass=mysql_fetch_assoc($rstClass)){?><!--楼层开始--> …… …… …… <?php $sqlBook = "select book.* from book,class where book.class_id = class.id and class.id = {$rowClass[‘id‘]} and book.shelf=1 order by book.id limit 4"; $rstBook = mysql_query($sqlBook); while($rowBook = mysql_fetch_assoc($rstBook)){ ?> <!--楼层数据块开始--> …… …… …… <!--楼层数据块结束--><?php } }?><!--楼层结束-->
22、前台页面中 动态循环添加数据
$id=$_GET[‘class_id‘];$sqlClass="select * from class where id = {$id} ";$rstClass=mysql_query($sqlClass);
$rowClass=mysql_fetch_assoc($rstClass);
while($rowClass=mysql_fetch_assoc($rstClass)){ …… ……}
<?php echo $rowClass[‘name‘]?>
23、打印 查看:查到的数据结果
<?php …… …… while($rowClass=mysql_fetch_assoc($rstClass)){ echo ‘<pre>‘; print_r($rowClass); echo ‘</pre>‘; }?>
24、前台不同页面之间 跳转 通过a链接传递参数,查表,得到想要的结果
<span><a href=‘class.php?class_id=<?php echo $class_id?>‘>分类</a> » <?php echo $rowClass[‘name‘]?></span>
if($page>=1 && $totalpage>1){ echo "<a href=?page=1&class_id={$rowClass[‘id‘]}>第一页 </a>";}
25、header.php 中控制登录、注册、切换用户名
<?php if(!$_SESSION[‘home_username‘]){ echo "<a href=‘{$root}/home/login.php‘>登录</a>"; }else{ echo " <a href=‘{$root}/home/person/index.php‘>欢迎 {$_SESSION[‘home_username‘]}登录</a> <a href=‘{$root}/home/logout.php‘>退出</a>"; }?>
@$_SESSION[‘home_username‘];
26、个人中心 左右结构页面
27、通过session方法开发购物车,用户关闭浏览器后,自动清空购物车
session_start();$id = $_GET[‘id‘];$sql = "select * from book where id = {$id}";$rst = mysql_query($sql);$row = mysql_fetch_assoc($rst);$_SESSION[‘books‘][$id]=$row; //用id限制同一图书只能加一个,然后在购物车页面中进行加减数量//在图书信息的子数组中临时加一个num 默认1, 方便index.php中使用变量 <?php echo $book[‘num‘]?>$_SESSION[‘books‘][$id][‘num‘]=1;
echo ‘<script>location="index.php"</script>‘;
有了数组,就不用while了,用foreach遍历数组 index.php
<?php foreach($_SESSION[‘books‘] as $book){?> …… ……<?php }?>
// 在session中找到 删除 unset($_SESSION[‘books‘][$id]);
$_SESSION[‘books‘]=array();
不可以unset,那样会把 $_SESSION[‘books‘]删掉
$tot = 0
遍历后(foreach 或 while循环)
$tot += $row[‘price‘]*$row[‘num‘];
$_SESSION[‘books‘][$id][‘num‘]++;$_SESSION[‘books‘][$id][‘num‘]--;
限制数量 加→不能多于库存 减→不能少于1个
if($_SESSION[‘books‘][$id][‘num‘]<1){ $_SESSION[‘books‘][$id][‘num‘] = 1;}if($_SESSION[‘books‘][$id][‘num‘] > $_SESSION[‘books‘][$id][‘stock‘]){ $_SESSION[‘books‘][$id][‘num‘] = $_SESSION[‘books‘][$id][‘stock‘];}
28、购物车的 联系方式、提交订单
<!--判断用户是否登录 session--><?php if($_SESSION[‘home_username‘]){?> ……<?php }?>
$arr=$_SESSION[‘books‘];$_SESSION = array(); //清空session数组$_SESSION[‘books‘]=$arr;
29、登录后不仅要在session中放入username ,一般还要放入userid
$_SESSION[‘home_userid‘] = $row[‘id‘];$user_id = $_SESSION[‘home_userid‘];$sql = "select * from touch where user_id = {$user_id}";$rst = mysql_query($sql);
30、在各个 后台数据管理模块中 修改都要有一个隐藏域 传id
31、购物车生成订单
$code =time().mt_rand();$code =microtime(true).time().mt_rand(); //microtime(true)微秒$code =time().mt_rand().mt_rand(1,10);$code =time().mt_rand().range(‘a‘,‘z‘);
32、购物车 提交订单之后,要做两件事
33、提交订单的用户,只有在 ‘已确认’状态下,才可以评论
34、在CSS样式表里,用class类
二、运行效果图
1、注册功能
注册界面 |
错误提示 |
通过提示 |
2、二手书搜索功能
高级搜索成功界面 |
搜索失败提示 |
3、二手书发布功能
用户发布二手书界面 |
用户发布二手书成功 |
4、二手书购买与评论功能
加入购物车界面 |
购物车界面 |
提交订单成功 |
未确认时查看订单界面 |
未确认时查看订单详情界面 |
确认时查看订单详情界面 |
确认后撰写评论 |
评论成功 |
注:转载请注明出处