原生PHP实现数据筛选以及简单分页功能

数据通常有许多分类项,比如12306买车票时,可以选择哪种类型的车次,开车时间段,始发地等条件。最近在做一个线上考试系统,为了方便试题管理,也提供了分类筛选功能,下面简单说一下用原生PHP实现的方法。

首先,页面效果图如下:

100341_iakO_3618644.png

分类项主要有2个:一个是根据题库分,一个是根据题型分(基础题,编程题等)。还有一个,不算是分类项,但也算是筛选数据的一个信息,就是左下角每页显示的条数。

我们先来分析下实现原理:不管前面怎么筛选,最终进行数据查找的Sql语句都是这样的:

SELECT * FROM 表名 WHERE ...

所以,我们的重点就是获取WHERE后面的筛选条件

怎么获取呢?当我们选中下拉框时,下拉框中的值传入后台服务器处理无非2种方式,一是通过表单POST传递,二是通过URL中添加参数GET传递。(不考虑Ajax方式)。这里,由于不存在安全性问题(即传递的数据不是用户名、密码等敏感信息),所以,进行数据筛选一般都是通过URL添加参数的GET方式传递信息

确定了数据传递方式后,我们就要实现传递数据。这里,我们假设未进行数据筛选时的页面网址为:www.question.com。不管我们选中下拉的哪一个,都会在该URL中添加参数,然后重新刷新页面。假设题库、题型还有显示条数这3个下拉框select的name属性分别是category、type、nums,我们为每个select绑定change事件:

<script>
    $('select').on('change',function(){
         var url = "www.question.com?";
         var category = '&category='+$("[name='category']").val();
         var type = '&type='+$("[name='type']").val();
         var nums = '&nums='+$("[name='nums']").val();
         url += category + type +nums;
         $('form').attr('action',url).submit();
    })
</script>

解释:任何一个select的值发生变化,都将所有当前select的值作为参数加入到www.question.com中,并通过表单元素form元素提交(实际是就是刷新本页面),这样就把所有筛选条件都传递过去了。

下面就是获取传递条件,进行数据筛选。

注意,题库和题型中都有全部这个选项,其对应的value值是'all',显然,all是不具有筛选项的。WHERE子句的格式为:

WHERE 字段=值 AND 字段=值 AND 字段=值

显然,如果题库是全部,我们就不能有第一个字段,那题型前面就不能有AND;可是题型也不确定是否为全部,因此第三个字段前面要不要加AND也不确定。简单的说,就是下一个字段前是否有AND取决于它前面是否有字段,第二个字段需要考虑第一个字段是否存在,第三个字段需要考虑前2个字段是否存在,这种级联关系十分复杂,根本不能通过if else来判断。

该怎么解决呢?我们只需要将字段独立即可,即每个字段的AND不需要考虑其他字段是否存在。先看代码:

<?php
    $condition = " 'ack'='ack'";//注意,前面有个空格
    if(isset($_GET['category'])){
        if($_GET['category']!='all')
             $condition.=" AND category='".$_GET['category']."'";
    }
    //其它筛选项类似,只需要将category换成type和nums即可
?>

将WHERE后面的筛选条件创建一个变量$condition。默认值是‘ack’='ack'。这什么意思呢?其实,sql进行筛选信息时,是进行真假判断,字符串'ack'='ack'显然为真,所以相当于没有添加筛选条件,ack可以换成任何值,当然,也可以写成1=1,0=0,只要为真就行。

加入这个条件是为了后面字段方便。这样,只要后面字段存在,它前面就一定要加AND,因为ack作为第一个字段。这样就不要考虑是否要加AND的问题了。

然后将$condition加入到WHERE子句中即可:

'SELECT * FROM 表名 WHERE'.$condition

可以看出,WHERE后紧跟$condition,这就是为什么'ack'前要有空格的原因了。

很简单吧?总结下数据筛选:

通过GET方式将所有筛选信息进行拼接后传递——根据传递来的数据创建$condition——进行数据筛选,这里唯一的小技巧就是ack

至于分页:类似于筛选条件,只不过它不是创建WHERE子句,而是创建LIMIT子句。这里,我们只考虑最简单的情况,即:

首页 上一页 下一页 尾页

这种链接形式。

我们在翻页时,是在当前筛选条件下完成的,因此,需要保留筛选信息。由于链接形式和where查询相似:

www.question.com?参数=值&参数=值&参数=值

采用相同ack处理方法,创建一个查询字符串的变量,将上面的PHP语句添加内容为:

<?php
    $condition = " 'ack'='ack'";//注意,前面有个空格
    $query_str = "ack=ack";//查询字符串,注意,这里ack就不要加引号了
    if(isset($_GET['category'])){
        if($_GET['category']!='all')
             $condition.=" AND category='".$_GET['category']."'";
        $query_str.= $_GET['category'];
    }
    //其它筛选项类似,只需要将category换成type和nums即可
?>

这样,就保留住了筛选条件了。然后输出分页链接:

if(当前不是第一页){
    $link = '<a href="首页链接">首页</a><a href="上一页链接">上一页</a>';
}
else{
    $link = '<button>首页</button><button>上一页</button>'
}
if(不是最后一页){
    $link .= '<a href="下一页链接">下一页</a><a href="尾页链接">尾页</a>';
}
else{
    $link .= '<button>下一页</button><button>尾页</button>'
}

不是第一页,则前面一定有页数,所以创建为链接a形式,反正是不能链接的button

形式。同理,不是最后一页,则后面一定有页数,创建为链接形式,反之button形式。其中,链接中的href就拼接的结果,比如首页链接:

'www.question.com?'.$query_str.'&page=1'

 

转载于:https://my.oschina.net/u/3618644/blog/1540345

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值