原生PHP實現數據篩選以及簡單分頁功能

數據一般有許多分類項,好比12306買車票時,能夠選擇哪一種類型的車次,開車時間段,始發地等條件。最近在作一個線上考試系統,爲了方便試題管理,也提供了分類篩選功能,下面簡單說一下用原生PHP實現的方法。javascript

首先,頁面效果圖以下:php

分類項主要有2個:一個是根據題庫分,一個是根據題型分(基礎題,編程題等)。還有一個,不算是分類項,但也算是篩選數據的一個信息,就是左下角每頁顯示的條數。java

咱們先來分析下實現原理:無論前面怎麼篩選,最終進行數據查找的Sql語句都是這樣的: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元素提交(實際是就是刷新本頁面),這樣就把全部篩選條件都傳遞過去了。url

下面就是獲取傳遞條件,進行數據篩選。spa

注意,題庫和題型中都有所有這個選項,其對應的value值是'all',顯然,all是不具備篩選項的。WHERE子句的格式爲:code

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'
相關文章
相關標籤/搜索