分享

PHP查询分页程序

 跃来跃去 2007-05-16
       首先要说的是分页功能在很多地方都是很常用的一个功能。特别是用于论坛等应用。这次自己写了一个分页是因为要显示查询结果。而查询条件又不是固定的。所以一般网上的很多php分页的介绍都是介绍写死的查询条件的sql。所以很难加以利用。这次自己改进了一下可以把这个分页功能用于查询呵呵。嘿嘿~。废话不多说。开始喽~。
searchmember.php
代码如下:
-------------------------------------
<?php
 /**
  *此方法可以实现中英文混和的字符串截取
  *hanxiaoyue 070515
  *$exec    需要截取的字符串
  *$sublen  截取的长度
  */
 function cnSubStr($exec,$sublen) {
        if($sublen>=strlen($exec)) {
            return $string;
        }
        $s="";
        for($i=0;$i<$sublen;$i++) {
            if(ord($exec{$i})>127) {
                 $s.=$exec{$i}.$exec{++$i};
                 continue;
            }else {
                 $s.=$exec{$i};
                 continue;
             }
        }
        return $s;
    }
 
 $surname = $_POST[‘surname‘];
 $membername = $_POST[‘membername‘];
 $sex = $_POST[‘sex‘];
 $age = $_POST[‘age‘];
 $phone = $_POST[‘phone‘];
 $cardid = $_POST[‘cardid‘];
 $createdate = $_POST[‘createdate‘];
 $createdate2 = $_POST[‘createdate2‘];
 $cardstate = $_POST[‘cardstate‘];
 $integral = $_POST[‘integral‘];
 
 require_once(‘../include/db_mysql.php‘);
    $exec="select * from hxy_member where";
 $exec2="select count(*) from hxy_member where";
 if($surname != "" && $surname != null) {
     $exec = "$exec surname = ‘$surname‘ and";
  $exec2 = "$exec2 surname = ‘$surname‘ and";
 }
 if($membername != "" && $membername != null) {
     $exec = "$exec username = ‘$membername‘ and";
  $exec2 = "$exec2 username = ‘$membername‘ and";
 }
 if($sex != "" && $sex != null) {
     $exec = "$exec sex = ‘$sex‘ and";
  $exec2 = "$exec2 sex = ‘$sex‘ and";
 }
 if($age != "" && $age != null) {
     $exec = "$exec age = ‘$age‘ and";
  $exec2 = "$exec2 age = ‘$age‘ and";
 }
 if($phone != "" && $phone != null) {
     $exec = "$exec phone = ‘$phone‘ and";
  $exec2 = "$exec2 phone = ‘$phone‘ and";
 }
 if($cardid != "" && $cardid != null) {
     $exec = "$exec cardid = ‘$cardid‘ and";
  $exec2 = "$exec2 cardid = ‘$cardid‘ and";
 }
 if($cardstate != "" && $cardstate != null) {
     $exec = "$exec cardstate = ‘$cardstate‘ and";
  $exec2 = "$exec2 cardstate = ‘$cardstate‘ and";
 }
 if($integral != "" && $integral != null) {
     $exec = "$exec integral = ‘$integral‘ and";
  $exec2 = "$exec2 integral = ‘$integral‘ and";
 }
 //此处的判断是为了实现时间段的搜索
 if(($createdate != "" && $createdate != null)&&($createdate2 != "" && $createdate2 != null)) {
      $exec = "$exec createdate >= ‘$createdate‘ and createdate <= ‘$createdate2‘ and";
      $exec2 = "$exec2 createdate >= ‘$createdate‘ and createdate <= ‘$createdate2‘ and";
 } else {
  if($createdate != "" && $createdate != null) {
         $exec = "$exec createdate = ‘$createdate‘ and";
      $exec2 = "$exec2 createdate = ‘$createdate‘ and";
     }
     if($createdate2 != "" && $createdate2 != null) {
         $exec = "$exec createdate = ‘$createdate2‘ and";
      $exec2 = "$exec2 createdate = ‘$createdate2‘ and";
     }
 
   }
   
 $sublen = strlen($exec);  //字符串长度
 $sublen2 = strlen($exec2);
 $len = $sublen-3;         //截取的长度
 $len2 = $sublen2-3;
 $cnexec = cnSubStr($exec,$len);
 $cnexec2 = cnSubStr($exec2,$len2);
  
 $pagesize=10;           //设置每一页显示的记录数
 session_start();
 
 //设置页数
 if (isset($_GET[‘page‘])) {
        $page=intval($_GET[‘page‘]); 
     $ex2 = $_SESSION[‘admin2‘];
  $rs = mysql_query($ex2);
    } else {
        $rs=mysql_query($cnexec2);  //取得记录总数$rs
  $page=1;
      }
  
    $myrow = mysql_fetch_array($rs);
    $numrows=$myrow[0];
   
 $pages=intval($numrows/$pagesize);  //计算总页数
 if ($numrows%$pagesize) {
     $pages++;
 }
 
 $offset=$pagesize*($page - 1); //计算记录偏移量
 //读取指定记录数
 if($page == 1) {
     //此处做page的判断是为了第二次访问第一页的时候有上一页的session信息传递过来
     if(isset($_GET[‘page‘])) {
      $eee = $_SESSION[‘admin3‘];
   $rsnumber=mysql_query("$eee order by Id desc limit $offset,$pagesize");
  } else {
         $_SESSION[‘admin‘] = $cnexec;
      $_SESSION[‘admin2‘] = $cnexec2;
            $rsnumber=mysql_query($_SESSION[‘admin‘]." order by Id desc limit $offset,$pagesize");
  }
 } else {
     $ex = $_SESSION[‘admin‘];
     $rsnumber=mysql_query("$ex order by Id desc limit $offset,$pagesize");
  //此处的admin3的作用是从第二页返回的时候把查询条件放到session中回到page等于1时候使用
  $_SESSION[‘admin3‘] = $ex;
      }
  
  
    if($myrow2 = mysql_fetch_array($rsnumber)) {
        $i=0;
/** 此处循环可以看出到底需要截取多少位
 for($i=1;$i<=$sublen+1;$i++) {
        if($i>$len) {
            echo $i."<b> →</b> ".cnSubStr($exec,$i)."…<br>";
            continue;
        }
        echo $i."<b> →</b> ".cnSubStr($exec,$i)."<br>";
    }
*/  
?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www./TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www./1999/xhtml">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
    <link rel="stylesheet" href="../image/style.css" type="text/css"/>
    <title>会员查询结果</title>
  </head>
  <body>
    <!--菜单修饰开始-->
    <table width="800px" cellpadding="0" cellspacing="0" align="center" class="menu">
      <tr>
     <td colspan="5" valign="middle">
    <img src="../image/banner.jpg">
  </td>
   </tr>     
   <tr>
     <td width="650px" align="right"><a href="../index.php">返回首页</a>  </td>
     <td width="75px" align="center"><a href="add.html">添加会员</a></td>
  <td width="75px" align="center"><a href="search.html">查询会员</a></td>
   </tr>
    </table>
    <table width="800px" border="1" bordercolor="#DCE7E9" cellpadding="0" cellspacing="1" align="center" class="main">
   <tr>
     <td><b>会员证号</b></td>
     <td><b>姓名</b></td>
     <td><b>性别</b></td>
     <td><b>联系电话</b></td>
     <td><b>创建日期</b></td>
     <td><b>积分</b></td>
   </tr>
<?php
    do {
        $i++;
?>
      <tr>
     <td><a href="viewmember.php?action=pro&userid=<?=$myrow2["Id"]?>"><?=$myrow2["cardid"]?></a></td>
        <td><?=$myrow2["surname"],$myrow2["username"]?></td>
        <td><?=$myrow2["sex"]?></td>
  <td><?=$myrow2["phone"]?></td>
  <td><?=$myrow2["createdate"]?></td>
  <td><?=$myrow2["integral"]?></td>
      </tr>
<?php
}  
    while ($myrow2 = mysql_fetch_array($rsnumber));
echo "</table>";
}
echo "<div align=‘center‘ class=‘searchpage‘>共有".$pages."页(".$page."/".$pages.")";
    for ($i=1;$i< $page;$i++)
        echo "<a href=‘searchmember.php?page=$i‘>[$i]</a>  ";
        echo "[".$page."]";
        for ($i=$page+1;$i<=$pages;$i++)
            echo "<a href=‘searchmember.php?page=$i‘>[$i]</a>  ";
            echo "</div>";
?>
<?php
/*
$first=1;
$prev=$page-1;
$next=$page+1;
$last=$pages;
if ($page > 1)
{
echo "<a href=‘fenye.php?page=".$first."‘>首页</a>  ";
echo "<a href=‘fenye.php?page=".$prev."‘>上一页</a>  ";
}
if ($page < $pages)
{
echo "<a href=‘fenye.php?page=".$next."‘>下一页</a>  ";
echo "<a href=‘fenye.php?page=".$last."‘>尾页</a>  ";
}
*/
?>
  </body>
</html>
---------------------------------
那么下面来说下这段代码的意思。首先在开始的一个functio是用来截取字符串来拼凑sql语句的。
然后后边的一堆的参数是从前一个页面的form中传递过来的参数。
然后是require_once(‘../include/db_mysql.php‘);这里是数据库的链接。我自己给封装了。大家可以根据自己的实际情况来决定。   
然后的    $exec="select * from hxy_member where";
               $exec2="select count(*) from hxy_member where";
$exec是真正要查询的内容,而$exec2是来查这些内容的行数。
紧接着下面的一大串的判断都是对表单传递的参数进行的判断。为了拼凑最终的sql语句。
 $sublen = strlen($exec);  //字符串长度
 $sublen2 = strlen($exec2);
 $len = $sublen-3;         //截取的长度
 $len2 = $sublen2-3;
 $cnexec = cnSubStr($exec,$len);
 $cnexec2 = cnSubStr($exec2,$len2);
然后在这里得到最终的sql查询语句。
然后的部分是设置页数和计算总页数之类的。
重点是:
 //读取指定记录数
 if($page == 1) {
     //此处做page的判断是为了第二次访问第一页的时候有上一页的session信息传递过来
     if(isset($_GET[‘page‘])) {
      $eee = $_SESSION[‘admin3‘];
   $rsnumber=mysql_query("$eee order by Id desc limit $offset,$pagesize"); 
  } else {
         $_SESSION[‘admin‘] = $cnexec;
      $_SESSION[‘admin2‘] = $cnexec2;
            $rsnumber=mysql_query($_SESSION[‘admin‘]." order by Id desc limit $offset,$pagesize");
  }
 } else {
     $ex = $_SESSION[‘admin‘];
     $rsnumber=mysql_query("$ex order by Id desc limit $offset,$pagesize");
  //此处的admin3的作用是从第二页返回的时候把查询条件放到session中回到page等于1时候使用
  $_SESSION[‘admin3‘] = $ex;
      }
 
       这里用到了session。之所以使用session的原因是因为sql语句不是固定的,在翻页的时候请求的是同一个页面。但是表单的参数已经无法再传递了,但是如果把所有的表单参数通过url传递的话那么代码肯定显得零乱。为了简单方便,那么最后选择了使用session。在searchmember.php之前可以看到很早有一个session_start();。这里是session的开始。之所以写在这里的原因是因为session_start();之前是绝对不能有html标签输出的,不然会报出warning警告的。而且这样避免了session的重复start。还有就是在最后读取指定记录数的代码段中一定要想好自己的分页逻辑。不然在分页的第一页和第N页之间切换的话会出现分页结果的错误。
       在这个分页程序的编写过程中出现过的问题就是session的使用,sql语句的拼凑。大家合理的利用输出就可以很快的定位问题的所在。现在这个分页程序可以良好比较稳定的进行查询后的分页显示。如果想借鉴的话那么就把之间的form参数改成自己的,sql的order by和每页显示数量那里进行相应的修改就可以了。而且准备了两种分页显示的样式。可以自己选择。呵呵。自己就总结那么多。再有问题再总结。

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多