**

PHP多条件搜索之后,对搜索集进行分页设置

**
关于PHP分页的问题,想必大家已经是非常的熟悉的了,今天,再来说一下相关PHP分页的知识。
最近在做一个小的项目,里面用到了,对多条件搜索的结果集进行分页,我就稀里糊涂的把之前写好的codes拷贝过去了,结果测试后发现,当我点击“下一页”或者“上一页”的时候,竟然出现的现象令我大吃一惊,点击下一页或者上一页的时候,竟然是对数据库中所有记录查询后的重新分页设置(我这么说,你能明白我的意思吗?),这么一来,岂不是分页的目的达不到了?
今天搞了一下午,加上百度、谷歌、必应……,发现竟然没有一篇详细的傻瓜教程,能满足我这个小菜鸟的需求,无奈之下,自己想明白之后,写个相对详细点的教程,以飨读者。
先来说下目标:

核心思想是,每次点击上一页或者下一页的时候,将搜索条件(url)传递过去,如此就不会出现搜索全部记录后再分页的情况了。废话不多说,直接上干货。
【1】我的条件搜索框是这样的,(在这里补充一点,form表单提交方式要设置成“get”)

好了,关于搜索栏的代码我就不贴出来了,毕竟很简单。下面说说主文件,我的文件名子是serach_visit.php。
文件代码如下:

<?php
 include("top.php");
?>

<table width="1300" height="438" border="0" align="center" cellpadding="0" cellspacing="0">
  <tr>
    <td width="346"  height="438" valign="top" bgcolor="#FFFFFF">
<?php include("left.php");?>
</td>
    <td width="940" align="center"valign="top" bgcolor="#FFFFFF">      
<table width="940" border="0" align="center" cellpadding="0" cellspacing="0">
<tr>
<td width="940" height="40"></td>
</tr>
<tr>
<td width="940">
<table width="840" border="1" cellspacing="0" cellpadding="0"align="center">
<tr class = "titlefont">
  <td width="300" bgcolor="#ffffff"align="center"><strong>文件名</strong></td>
  <td width="100" bgcolor="#ffffff"align="center"  ><strong>厂家</strong></td>
  <td width="100" bgcolor="#ffffff"align="center"><strong>型号</strong></td>
  <td width="100" bgcolor="#ffffff"align="center"><strong>备注</strong></td>
  <td width="200" bgcolor="#ffffff"align="center"><strong>生产时间</strong></td>
  <td width="40" bgcolor="#ffffff"align="center"><strong>操作</strong></td>
</tr>
<?php
header("Content-Type:text/html;charset=utf-8");
date_default_timezone_set("Asia/ShangHai");//设定时区为上海
require_once("lib/conn.php");
include("lib/page.func.php");
session_start();

 $datetime = date('Y-m-d',strtotime("+1 day"));//明天的时间
 $s_company = $_GET['s_company'];
 $s_model = $_GET['s_model'];
 $s_remarks = $_GET['s_remarks'];
 $checkintime = $_GET['checkintime'];
 //获取查询条件
        $wherelist = array();
$urlist=array();
if(!empty($s_company))
{
$wherelist[] = "company like '%$s_company%'";
$urllist[]="s_company=".$s_company;
}
if(!empty($s_model))
{
$wherelist[] = "model like '%$s_model%'";
$urllist[]="s_model=".$s_model;
}
if(!empty($s_remarks))
{
$wherelist[] = "remarks like '%$s_remarks%'";
$urllist[]="s_remarks=".$s_remarks;
}
if(!empty($checkintime))
{
$wherelist[] = "createtime between '$checkintime' and '$datetime'";
//$urllist[]="createtime=".$checkintime;        
}
//判断查询条件
        $where = isset($where) ? $where : '';
 //组装查询条件
//$where="";
if(count($wherelist) > 0)
{
$where = " where ".implode('and ',$wherelist); //注意or后面的空格
$url='&'.implode('& ',$urllist);
}
//$_SESSION['url'] = $url;
//分页的实现原理
//1.获取数据表中总记录数

       //得到查询条件
$sql = "SELECT * FROM tb_file {$where} ";
$arr=mysql_query($sql)or die("对不起,没有查找到!");
$totalRows=mysql_num_rows($arr);
//echo $totalRows;
$pageSize=8;//每页显示的记录数
$totalPage=ceil($totalRows/$pageSize);//总共有几页
//echo $totalPage;
$page=$_GET['page']?(int)$_GET['page']:1;
if($page<1 ||$page==null || !is_numeric($page))
{
$page = 1;
}
if($page >= $totalPage)
{
$page = $totalPage;
}
//偏移量offset
$offset = ($page -1)*$pageSize;
//$sql1 = "select * from tb_file limit {$offset},{$pageSize}";
$sql_page = "SELECT * FROM tb_file {$where} limit {$offset},{$pageSize}";

$arr_page= mysql_query($sql_page);
while($result = mysql_fetch_array($arr_page))//遍历查询结果的每一行
{
$name = $result[name];
$company = $result[company];
$model = $result[model];
$remarks = $result[remarks];
$time = $result[createtime];
?>
<tr>
<td bgcolor="#bbffbb" id="note"><?php echo $result['name'] ; ?></td>
<td bgcolor="#bbffbb"><?php echo "$company" ;?></td>
<td bgcolor="#bbffbb"><?php echo "$model" ;        ?></td>
<td bgcolor="#bbffbb"><?php echo "$remarks" ;        ?></td>
<td bgcolor="#bbffbb"><?php echo $result['createtime'] ; ?></td>
<td bgcolor="#bbffbb"><a  href="download.php?P_ID=<?php echo $result['id']?>">下载</a></td>
</tr>
<?php
}
?>
<tr>
<td colspan = "6" align = "center">
<?php 
    echo showPage($page,$totalPage,$url);
?>
</td>

</tr>
  </table>
</td>
        </tr>

</table>
</td>
  </tr>
</table>
<?php
 include("bottom.php");
?>

【2】
简单的说i一下这个代码:
这一段主要是引入外部文件,conn.php是链接数据库用到的,page.func.php是本次分页用到的

header("Content-Type:text/html;charset=utf-8");
date_default_timezone_set("Asia/ShangHai");//设定时区为上海
require_once("lib/conn.php");
include("lib/page.func.php");
session_start();

这一段是获取搜索条件,而且建立一个数组$wherelist[ ]用于保存多个不同的条件,最后通过implode函数将多个条件组合成一条sql语句并赋值给$where,建立另一个数组$urllist[ ]用于保存要传递的值。

 $datetime = date('Y-m-d',strtotime("+1 day"));//明天的时间
 $s_company = $_GET['s_company'];
 $s_model = $_GET['s_model'];
 $s_remarks = $_GET['s_remarks'];
 $checkintime = $_GET['checkintime'];
 //获取查询条件
        $wherelist = array();
$urlist=array();
if(!empty($s_company))
{
$wherelist[] = "company like '%$s_company%'";
$urllist[]="s_company=".$s_company;
}
if(!empty($s_model))
{
$wherelist[] = "model like '%$s_model%'";
$urllist[]="s_model=".$s_model;
}
if(!empty($s_remarks))
{
$wherelist[] = "remarks like '%$s_remarks%'";
$urllist[]="s_remarks=".$s_remarks;
}
if(!empty($checkintime))
{
$wherelist[] = "createtime between '$checkintime' and '$datetime'";
//$urllist[]="createtime=".$checkintime;        
}
//判断查询条件
        $where = isset($where) ? $where : '';
 //组装查询条件
//$where="";
if(count($wherelist) > 0)
{
$where = " where ".implode('and ',$wherelist); //注意or后面的空格
$url='&'.implode('& ',$urllist);
}

下面的这段代码主要是查询mysql数据库符合条件的记录集个数,以及设置每页要显示多少条记录,一共多少页

 //得到查询条件
$sql = "SELECT * FROM tb_file {$where} ";
$arr=mysql_query($sql)or die("对不起,没有查找到!");
$totalRows=mysql_num_rows($arr);
//echo $totalRows;
$pageSize=8;//每页显示的记录数
$totalPage=ceil($totalRows/$pageSize);//总共有几页
//echo $totalPage;
$page=$_GET['page']?(int)$_GET['page']:1;
if($page<1 ||$page==null || !is_numeric($page))
{
$page = 1;
}
if($page >= $totalPage)
{
$page = $totalPage;
}
//偏移量offset
$offset = ($page -1)*$pageSize;
//$sql1 = "select * from tb_file limit {$offset},{$pageSize}";
$sql_page = "SELECT * FROM tb_file {$where} limit {$offset},{$pageSize}";
下面的这段代码主要作用是将符合搜索条件的所有结果集输出并且显示
$arr_page= mysql_query($sql_page);
while($result = mysql_fetch_array($arr_page))//遍历查询结果的每一行
{
$name = $result[name];
$company = $result[company];
$model = $result[model];
$remarks = $result[remarks];
$time = $result[createtime];
?>
<tr>
<td bgcolor="#bbffbb" id="note"><?php echo $result['name'] ; ?></td>
<td bgcolor="#bbffbb"><?php echo "$company" ;?></td>
<td bgcolor="#bbffbb"><?php echo "$model" ;        ?></td>
<td bgcolor="#bbffbb"><?php echo "$remarks" ;        ?></td>
<td bgcolor="#bbffbb"><?php echo $result['createtime'] ; ?></td>
<td bgcolor="#bbffbb"><a  href="download.php?P_ID=<?php echo $result['id']?>">下载</a></td>
</tr>
<?php
}
?>

最后这段代码,是调用page.func.php文件中的函数showPage( ),第一个参数为$page,表示当前页码,$toatalPage,表示总共几页

<tr>
<td colspan = "6" align = "center">
<?php 
    echo showPage($page,$totalPage,$url);
?>
</td>

</tr>

最后,来说下page.func.php文件,完整代码如下:

<?php 
function showPage($page,$totalPage,$url=null,$sep="&nbsp;")
{
//$where=($where==null)?null:"&".$where;
$index = ($page == 1) ? "首页" : "<a href='search_visit.php?page=1{$url}'>首页</a>";
$last = ($page == $totalPage) ? "尾页" : "<a href='search_visit.php?page={$totalPage}{$url}'>尾页</a>";
$prevPage=($page>=1)?$page-1:1;
$nextPage=($Page>=$totalPage)?$totalPage:$page+1;
$prev = ($page == 1) ? "上一页" : "<a href='search_visit.php?page={$prevPage}{$url}'>上一页</a>";
$next = ($page == $totalPage) ? "下一页" : "<a href='search_visit.php?page={$nextPage}{$url}'>下一页</a>";
$str = "总共{$totalPage}页/当前是第{$page}页";
for($i = 1; $i <= $totalPage; $i ++) 
{
//当前页无连接
if ($page == $i) 
{
$p .= "[{$i}]";
} else 
{
$p .= "<a href='search_visit.php?page={$i}{$url}'>[{$i}]</a>";
}
}
         $pageStr=$str.$sep . $index .$sep. $prev.$sep . $p.$sep . $next.$sep . $last;
         return $pageStr;
}
?>

——————————————————————————————————————————————————————
这里只简单说一点,就是$url的位置,放到?Page={…}后面就ok,即?Page={…}{$url},不在多说,自己细细品味吧!

2016年12月27日 杭州

更多推荐

PHP多条件搜索之后,对搜索集进行分页设置,避免了点击“上一页”或“下一页”后出现不是所要查询的内容