多條件異步搜索+分頁(PHP、 AJAX、ThinkPHP)


項目中遇到的多條件異步查詢及數據分頁問題,做了數次嘗試,最終雖目的達到,略有繁瑣,希望能有更好的處理方式

基於 tp框架

 

1、html頁面代碼

<div class="h_cityName1">

  <div class="h_cityName11">

<span>省</span>

<ul class="h_publicB" id="province_id" name="province_id" >

<volist name="list" id="vo">

<if condition="$areaId eq $vo.areaId">

<li value="{$vo.areaId}" onclick="sendData(this,'province_id')"  >{$vo.areaName}</li>

<else />

<li value="{$vo.areaId}" onclick="sendData(this,'province_id')"  >{$vo.areaName}</li>

</if>

</volist>

   </ul>

</div>

<div class="h_cityName11 h_cityList">

<span>市</span>

<ul class="h_publicB" id="city_id" name="city_id">

</ul>

</div>

   <div class="h_cityName11 h_areaList" >

<span>區</span>

<ul class="h_publicB" id="area_id" name="area_id">

</ul>

</div>

</div>

<div class="hangye"><b>行業</b></div>

  <ul>

  <volist name="industry" id="industry">

   <li value="" onclick="sendData(this,'industry')" name="{$idfrom_home}" ><span >{$industry.name}</span></li>    

   </volist>

   </ul>           

</div>

<div class="search3">

        <input type="text" name="" id="companyname" value=""  placeholder="搜索企業/商戶名稱"/>

         <a href="#"><input type="submit" class="but1"  id="s-by-c"  onclick="sendData(this,'companyname')" value="" /></a>

 

</div>

<div class="zongmu-lbbu" id="companylist">

<volist name="company" id="vo">

   <div class="recommend-logo" >

      <div class="fl1">

<a href="{:U('Home/Company/detail?id='.$vo['id'])}">

<img src="{$uploads}{$vo.logo}" class="fl-img"/>

<p>{$vo.name}</p>

<span class="span-add">{$vo.addreess}</span>

<img src="{$home_img}qiyezongmu_03.png" class="middle-img"/><span class="span-xx">{$vo.linkman}</span>

<img src="{$home_img}qiyezongmu2_06.png" class="middle-img"/><span class="span-xx">{$vo.linktel}</span>

<img src="{$home_img}qiyezongmu2_03.png" class="middle-img"/><span class="span-xx"> {$vo.qqnum}</span>

</a>

</div>

  <div class="fl2">

<h3>公司主營</h3>

<p>{$vo.des}</p>

</div>

</div>

 </volist>

</div>       

 <div class="page" id="page">

<if condition="$arr['count'] neq 0 ">

<span>共<b>{$arr.count}</b>條記錄,{$arr.p}/{$arr.Page}頁</span>

{$arr.show}

<else />

<center><b>暫無數據</b></center>

</if>

 

</div>

2、jquery & ajax

<script type="text/javascript">

/*

*區域(點擊省獲取區,點擊區獲取縣)

*/

function sendData(data,type){

var data1=data.value;

var name=$(data).attr('name');

   var companyname=$("#companyname").val();

var data2 =$(data).parent().attr("id");

   var aa = $(data).text();

 $(data).addClass('selectPublicA').siblings().removeClass()

/*ajax post提交返回區域列表 */

$.ajax({ 

url:"{:U('Home/Company/ajaxarea')}",

data:{data:data1,type:type},

type:"post",

dataType:"json",

success:function(msg){

  console.log(msg)

  if(type == 'province_id'){

  var html ='';

  $('#city_id').empty();

  $('#area_id').empty();

  for(var i=0;i<msg.length;i++){

  html += "<li value='"+msg[i].areaId+"' onclick='sendData(this,\"city_id\")'>"+msg[i].areaName+"</li>";

   }

  $(html).appendTo($("#city_id"));

    }else if(type == 'city_id'){

  $("#area_id").parent().css("display","block");

  var html ='';

  $('#area_id').empty();

  for(var i=0;i<msg.length;i++){

  html += "<li value='"+msg[i].areaId+"' onclick='sendData(this,\"area_id\")'>"+msg[i].areaName+"</li>"

  }

  $(html).appendTo($("#area_id"));

    }

  }

})

$.ajax({

url:"{:U('Home/Company/index')}",

data:{data:data1,type:type,name:name,companyname:companyname},

type:"post",

dataType:"json",

success:function(msg){

console.log(msg)

var html="";

var company=msg.rows;

var url=msg.url;

$('#page').empty(); 

$("#companylist").empty();

if(company != null){

for(var i=0;i<company.length;i++){

html += "<div class='recommend-logo' >"

html += "<div class='fl1'><a href='"+url[i]+"'><img src='{$uploads}"+company[i].logo+"' class='fl-img'/><p>"+company[i].name+"</p>"

html += "<span class='span-add'>"+company[i].addreess+"</span>"

html += "<img src='{$home_img}qiyezongmu_03.png' class='middle-img'/><span class='span-xx'>"+company[i].linkman+"</span>"

html += "<img src='{$home_img}qiyezongmu2_06.png' class='middle-img'/><span class='span-xx'>"+company[i].linktel+"</span>"

html += "<img src='{$home_img}qiyezongmu2_03.png' class='middle-img'/><span class='span-xx'>"+company[i].qqnum+"</span></a></div>"

html += "<div class='fl2'><h3>公司主營</h3><p>"+company[i].des+"</p></div></div>"

}

}

$(html).appendTo("#companylist");

var htmlpage="<span id='page'>共<b>"+msg.count+"</b>條記錄,"+msg.p+"/"+msg.Page+"頁"+msg.show+"</span>";

$(htmlpage).appendTo($("#page"));

}

})

}

</script>

 

3、PHP 頁面

 

public function index(){   

        $p = I('request.p');//獲取點擊分頁的頁數

        $paging  = $p<1?1:$p;

   //==============================接收AJAX/GET傳參===============//

        $areaId=I('request.data');

        $industryId=I('request.name');

        $type=I('request.type');

        $companyname=I('request.companyname');

   //==============================接收AJAX/GET傳參===============//

   //==============================查詢條件=====================//

        $map = array('data' => $areaId,'type'=>$type,'name'=>$industryId,'companyname'=>$companyname);

        $order='';

        if(IS_AJAX){

            if($areaId>0){//若點擊省市區  該條件寫入session

                 $_SESSION['areaId']=$areaId;

                 $_SESSION['type']=$type;

            }

            if($industryId >0){//若點擊行業 該條件寫入session

                 $_SESSION['industryId']=$industryId;

            }

            if($type == 'industry'){//若點擊行業 調用session地區條件

                $areaId=$_SESSION['areaId'];

                $type=$_SESSION['type'];

             }

            if($type == 'companyname'){//若輸入企業名查詢 調用session 地區、行業條件

                $areaId=$_SESSION['areaId'];

                $industryId=$_SESSION['industryId'];

                $type=$_SESSION['type'];

            }

            $where= $this->get_where($areaId,$type,$industryId,$companyname);

        }else{

            //刷新頁面時清除session中條件

            $_SESSION['areaId']="";

            $_SESSION['type']='';

            $_SESSION['industryId']='';

            $where = 'ischeck = 1';

            $where .=" AND ".$this->get_where($areaId,$type,$industryId,$goodsname);

        } 

   //==============================查詢條件=====================//

   //==============================查詢數據=====================//

   $list =  D('Areas','Api')->getareas(100,1,'*','`parentId`=0');//所有地區列表

        $industry = D('Industry','Api')->getindustry(1000,1,'*','`status`=1 AND `isdelete`=1');//行業信息

   $arr=$this->getData_page('Company',3,'*',$where,$order,$map);

   //==============================查詢數據=====================//

         $arr['p']=$paging;

         $company=$arr['rows'];

   if(IS_AJAX){

    echo json_encode($arr);

   }else{

    $this->assign('areaId',$areaId);

            $this->assign('industryId',$industryId);

            $this->assign('company',$company);

            $this->assign('arr',$arr);

            $this->assign('list',$list['tag']);

            $this->assign('industry',$industry['tag']);//需求列表

            $this->display();  

   }

    }

    /*

     * ajax區域聯動

     */

 public function ajaxarea(){

        $data['parentId']=$_POST['data'];

        if($_POST['type'] == 'province_id'){

            $list =D('Areas')->getarea($data);

            echo json_encode($list);

        }else if($_POST['type'] == 'city_id'){

            $list =D('Areas')->getarea($data);

            echo json_encode($list);

        }

 

 }

/**

*查詢條件處理函數

*/

public function get_where($areaId='',$type='',$industryId='',$companyname=''){

        $where = "1=1";//初始化where變量

        if ( $areaId > 0){

            $where .=" AND {$type}={$areaId}";

        }

        if ($industryId >0){

            $where .= " AND industry_id={$industryId}";

        }

        if ('' != $companyname){

            $where .=" AND `name` LIKE '%{$companyname}%'";

        }

        return $where;

    }

/**

*查詢分頁數據

*$model 模型名也可視為數據表名

*/

public function getData_page($model,$num='',$field='',$where='',$order ='',$map=''){

        $Model =M($model);

        $num  = ($num != '') ? $num : '10';

        $field  = ($field != '') ? $field : '*';

        if (!empty($field)){

            $Model->field($field);

        } else {

            $Model->field('*');

        }

        if (!empty($where)){

 

            $Model->where($where);

        } 

        if (!empty($order)){

            $Model->order($order);

        }else{

            unset($order);

        }

 

        $count =$Model->where($where)->count();

 

 

        if (!empty($field)){

            $Model->field($field);

        } else {

            $Model->field('*');

        }

        if (!empty($where)){

            $Model->where($where);

        } 

        if (!empty($order)){

            $Model->order($order);

        }

        $Page = new \Think\Page($count,$num);

        $Page->setConfig('prev','上一頁');

        $Page->setConfig('next','下一頁');

        $Page->setConfig("last",'尾頁');

        $Page->setConfig('first','首頁');

        $Page->rollPage = '5';

   //TP分頁方法 $show 中url 拼接條件參數  點擊分頁條 除了傳P 也會傳查詢條件參數

        foreach($map as $key=>$val) {

            $Page->parameter[$key]   =   urlencode($val);

        }

        $show = $Page->show();

        $offset = $Page->firstRow.','.$Page->listRows;

        $Model->limit($offset);

        $rows = $Model->select();

        $pagetotal =ceil($Page->totalRows/$num);

        $pagetotal<1 ? 1:$pagetotal;

        $arr =array('count'=>"$count",'Page'=>"$pagetotal",'show'=>"$show",'rows'=>$rows);

        return $arr;

    }

 

總結:ajax獲取條件參數提交給 php,php分情況存SESSION,以保證下個條件查詢時擁有之前的條件;分頁部分利用tp自帶分頁查詢,在此基礎上 將ajax提交的參數拼接到每次點擊分頁后的URL 再通過get獲取即可實現異步查詢后的數據分頁

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM