#项目进展
##2017-08-25
1.首先通过最简单的index页来进行页面的选择,
通过c来选择要调用的类,因为怕找不到相应的类所
以运用了autoload的魔术方法来进行将各种需要调
用的类的所在文件包含。通过isset和三元运算来给
a和c默认值为User和index
2.直接在下方实例化c,然后调用相应的方法来进行页面选择
3.User.class.php页面中将被调用了相应的方法,默认的是
调用了这个类和类中的index方法。
4.在这个方法中include './View/User/list.html',
来进行首页的界面布置,和提供遍历的前端环境
5.index方法中需要对当前的两个搜索进行判断和组成遍历出来
的where的语句,通过$str的拼接,若没有get到两个想搜索的,
便进行=‘1=1’
6.换页
1.$page = new Page($total,5);一个是传数据总数,一个是
每页想显示几个
2.page类里面show会返回,前端下面的分页a链接
$this->limit = (($this->current-1)*$num).','.$num;
这句可以将page的limit成员属性赋值为‘0,5’这种格式
3.$page->current这个成员属性是保存当前当前页面页数
4.//处理下一页
$first = $end = $pre = $next = $_GET;
$next['p'] = $this->current + 1;
$nextStr = http_build_query($next);
get到当前的两个搜索条件和页码username=王志伟&sex=1&p=2
将这个数组转成这串字符串放到上下页的a链接中就可以进行每次点击进行传这些值
7.删除和添加都是对于Model类的数据库操作,删除就直接调用删除,但是添加的时候点击添加会调用add方法中的 include跳转到add这个数据输入页,提交后再传到index.php?c=User&a=doAdd,调用user类里面 的doAdd方法,进行两个密码比较,不一样跳回去,一样的话调用Model类中的add方法,将post的值传过去
8.调用User的方法中要对数据库进行操作需要每次都实例化一下$user = new Model('user');在通过$user-> 相应 Model里面的方法名字.
9.自行添加修改功能的过程中出现了对于save.html页中的value的值遍历出现了错误,应该使用来输出值,而且要用Model类里面的find方法将这个id的数据查询出来
10.修改提交到doSave中,一定要记得将POST[id]删除掉,但是调用Model的save方法有需要传入一个id所以用$id先装好,再将POST内的id删除掉。
11.修改之后的doSave中要先判断密码是不是为空,是的话就直接删除post里的pwd若不是就要比较两次密码是否相等,不相等跳回去。
12.在建表的时候对id字段的primary key 设置的时候不要再进行设置not null,执行insert的sql语句会出错。
13.在搜索的时候点击会提交到index这个界面,在商品搜索的时候调到index.php。但是c被重置成了User,所以遍历出来的并不是商品页,而是用户页,所以要在搜索操作表单提交的时候传一个hidden传一个c=Good来进行完成搜索,其实不管哪个页都应该有一个hidden来进行传值。因为index.php默认值被设定好了,不穿的话就永远是User和index默认的ca值。
###总结:
先是查询的时候有坑,就是输入0的时候查询并不会是真的查询0的关键字,所以我们要用if来判断username!=='',这样子吧很多过滤掉了。对于需要用到id的数据库操作,都要有一步判断是否有接受到id没有的话跳转回去
##2017-08-28
1.对于用户的增删改查,对于没有进行修改的值会POST到‘’空的字符串,所以我们认为是不修改它,就直接unset($_POST['phone']);这样数据库里面的值还是null而不是空数组,此字段属于未定义
2.对于状态的单机改变是点击A链接传了id和另一个状态还有调用了doStatus方法,就调用Model里的save方法,传入get到的数组,非法字段会自动过滤
3.在首页的index.php中实例化类找不到类和方法会自动包含,直接让其跳转到登出类的登出方法中,然后还是会跳回登录界面,防止手贱用户
4.在登录类里面要对账户是否存在和密码是否正确进行判断,账户用一个select()方法来进行查询,返回数组则为存在,存在的时候进行对POST的密码进行md5加密比较,还有权限和禁用的判断,没有权限的和被禁用的则弹窗无法登陆,然后跳回前页面。
5.☆所有的了类都继承了common类,里面的构造函数会每次都检测$_SESSION是不是有对应的值,没有的话便跳回登录界面。
6.在登录类里面所有判断条件符合的时候就将你查询到的登录账户的数据库查询获取的数组值赋予$_SESSION.注销就是将$_SESSION数组清空。
7.前端性别的遍历显示:
$sexs = ['女','男','妖','gay'];
然后对应下标显示$sexs[$v['sex']];
8.对于头部的切割,可以判断$_SESSION中的权限值,来选择是否显示除了首页和登出的其他管理导航。
9.common公共类里面还封装了jump方法,可以进行所有语句判断出错的时候调用来进行跳回原来的界面或者跳转首页。
protected function jump($str,$url = '')
{
if(empty($url)) $url = $_SERVER['HTTP_REFERER'];
echo $str.'跳转中...';
echo '';
exit;
}
10.修改的时候用户名是否存在要进行判断当id<>$_POST['id']的时候是否能查询到,查不到则不存在。
11.Model类中的save方法进行了修改,在传进来的字段下标为id的时候讲对应的$v的值赋予where条件,即$this->where = 'where id='.$v;这样子我们进行调用Model的save方法的时候就不需要传限制条件了。
12.在进行状态改变的时候点击a链接跳过去doStatus处理过后传回来没有p的值。要进行url传p
##2017-08-29
1.添加分类的时候要判断有没有传值到add方法中,有的话就是为父类创建子分类,没有的话就是创建最高级别的分类
2.传到doAdd的需要用hidden传pid和path的值过去成为新的分类名的字段,如果添加的是子分类,则传过去的是父类的id作为pid,父类的path拼接上父类id再加上一个逗号,然后穿过去
3.创建这两个hidden要先将父类的分类属性全部查出来用find
4.添加商品的时候遍历前端的时候,要遍历关于类的下拉列表的时候,遍历下拉框的时候把每一个类名的id都和所有分类名的pid进行匹配,匹配到了则证明他是个父类,能不能选择,则给他一个disabled。
5.首页类别遍历的时候使用
$arr = $type->order('concat(path,id)')->select();
可以进行父子类的排序,可以明确看出父子类关系。
6.删除分类的时候先定义一个儿子变量,进行查询,看有没有分类的pid的值等GET过来的id,有的话则是这个分类下面有儿子或者后代,不允许他删除操作。
7.在商品搜索的时候,构造查询的sql语句要对最大最小价格的input获取的内容进行处理,就是p1和p2互相嵌套判断,即p1不空的时候判断p2空和不空的时候情况,p2也是如此,这样p1和p2有没有值都一样可以构造好sql语句。在P2可能大于P1的时候,那就用另一个变量来让它们的值互换,反正一定要保证p2大于p1.
8.点击修改状态的时候要传一个p当前页码的值给他,才能跳回当前页。或者在处理完状态后跳转回来一定要跳转到$_SERVER['HTTP_REFERER'],而不是index,不然少了很多传值。
##2017-08-30
1.添加删除修改中的图片上传都需要把原来的陆经理的图片进行删除和添加的操作,就利用文件删除的遍历读文件读到了获取到的id对应的图片名的对应文件,便直接删除。
2.对于isset的使用,在修改和添加的时候,对一个字段赋值的时候,不填的话用isset来进行判断是不是定义了,0也算是定义了,没定义的话给一个‘’,empty若检测到0的时候就默认为没有定义到,empty(0)是一个真。所以if(empty(0)){}会走进真区间,但是其实有时候就是要让赋值为0.
3.要对所有本来就是需要输入数字的进行限制,不能让字母之类的通过
4.实例化类的时候,会有不合法的类在地址栏获取,所以用正则限制手贱用户直接退出登录。
5.
action在用get提交的时候不能进行传值,因为是属于url传值,你在用get会前面url的实效,用post可以在action里面传值,可以将c和a传过去,但是搜索用了post的话,但是Goods的index方法中用$_GET传值会使sql语句出错。
6.在商品搜索之后再进行价格或者库存等信息进行升降序的时候,由于是a链接,点过去并没有将搜索的条件传到处理页,所以会清空搜索条件,能做的就是在升降序的a链接里将所有的搜索条件加进去,所有的搜索条件太长了,所以我们在index方法中将所有的GET到的值利用分页类中的$now = http_build_query($_GET);用这个函数将所有get到的值变成了链接后面连接的字符串。然后在a链接加上$now,但是由于获取了上一次的搜索条件和上次的排序,所以点击升序点击降序再点击升序的时候升序会无效,因为他的升序被覆盖,所以存在变化的传参尽可能放在a链接后面,所以将$now放在尽可能前面,这样点击的传参会覆盖它里面的相同参数。
7.每当升降序条件不为空的时候我们会构造order语句,但是有时候进行了价格排序之后$now里面会有商品排序参数,再点击库存排序同时又库存排序,所以每次获得排序参数后构造好order字符串之后立即删除$_GET['sort方式'];这样$now就不会有排序方式参数。反正每次点击a链接会重新给排序参数。
8.session的可以在index的主要界面进行session_start();因为每个界面都经过这个界面实例化出来,所以也可以在这里判断$_SESSION是不是有值,不是的话就直接让他退出登录。
##2017-09-04
1.购物车的A链接来控制数量增加减少,当为0的时候没有必要提交并加入订单详情,应该在填写信息页的时候遍历商品的时候将num=0的进行再购物车内的删除,以防添加没有用的信息
2.在增加订单的时候应该foreach以下购物车的物品将物品加入商品详情,而且提交商品详情之后应该清空session中的购物车信息,方便下次购物
##2017-09-05
1.在做多地址管理的时候最难的是默认地址的设置,给一个status字段,默认为0,遍历设为默认a链接的时候先查status为0遍历,为1的话显示为默认地址。
2.点击设置默认,处理是先根据传过来的uid进行where("uid=$_GET['uid'] and status=1")进行查询同一用户的地址,若存在就先将这个地址的状态改为0,然后将传过来的id和status=1修改对应的地址,或者说根本没查到有1状态的同用户的地址,那就直接进行修改地址。
3.在支付的钱输出的之前,应在是在数据库进行统计,而不是拿session里面的。
##2017-09-06
1.搜索框扩展,传一个name去匹配先去商品表模糊匹配这个名字,若是找不到结果就用这个name去type分类表查找有没有相对应的名字,有的话一般来说就只有一个匹配的数据,将这个类的id拿出来,将值给到$_GET['tid'].但是如果有匹配到这个模糊匹配的商品名就不进入这区间,而是构造寻找商品的sql语句。
2.浏览历史:每次进入商品详情就记录该商品id,浏览历史里面将最近浏览的保留在前面,越近浏览的排序排在最前面!
3.
1.首先是一开始的$_SESSION['see']的赋值问题,在登录方法里,开干之前给$_SESSION['see']=[];
2.进行in_array的判断,看当前GET到的id值在不在$_SESSION['see']里面,不在的话直接让$_SESSION['see'][]=$_GET['id'];
3.如果是但是点击相同商品重复进入只存一次,而且越近点击的要放在$_SESSION['see']的最后面,所以我们用$k=array_keys($arr,'值')来取出同样id值得下标存在$k当中,但是$k是一个数组并不是一个值,所以我们要删除掉相同的对应下标的id只能unset($_SESSION['see'][$k[0]]),同时还要将$k直接删除,因为下一次$k=array_keys($arr,'值')是追加$k这个数组的值,原来的前面下表对应的是还在很麻烦,所以直接删掉,每次$k都是一个空数组来接收array_keys返回过来的下标。
4.删除相同的id值之后再将自己的id追加到后面,这样是就有一种我跑到后面,前面的我就没了,然后不管下一个谁在我后面都是我离他最近。所以在遍历的时候要将$_SESSION['see']倒过来
5.$see = array_reverse($_SESSION['see']);然后对$see进行遍历,一定要用一个容器来装这个倒序之后的$_SESSION['see'];用自己来装的话,下一次刷新又将自己倒序了变成了正序。
4.取消订单和删除订单,状态:1.待支付,2.待发货,3.待收货,4.已完成
状态为1,2,3的时候都是可以取消订单,在已完成的时候要删除订单。用户取消订单则是将数据库的订单一起消除了,但是在完成订单之后删除订单不能删除数据库的定单,所以在前端遍历他的订单的时候我们要不让他看到他删除了的已完成订单,所以我们多给一个默认为0的shows字段,点击删除订单将这个shows改为1,遍历select的时候where天骄中多加一句status=0;这样用户就看不到自己删除的订单。
5.面包屑$num = substr_count($v['path'],',');统计字符串当中逗号的个数,来判断商品的上一级类有几个逗号就是商品有几层上一级,然后进行循环。
$type = new Model('type');
$goods = new Model('goods');
$a = $goods->find($_GET['id']);
$a = $a['tid'];
$b = $type->find($a);
$num = substr_count($b['path'],',');//2
//var_dump($num);
if(!empty($a)){
//要判断传过来的类型有没有子类,有的话将子类所有的商品查出来;如果没有子类,则直接差该分类下的商品
for($i=0;$i<$num;$i++){
$b = $type->find($a);
$qq[] = $b['name'];
$a = $b['pid'];
}
}