PHP && mysql分页类
类文件page_class.php------------------------------------------------------
<?php
class page {
var $pagesize; //设置每一页显示的记录数
var $numrows; //记录总数
var $pages; //记录总页数
var $page; //设置页数
var $url; //Url参数
var $csql; //查询记录数的sql语句
var $sql;
function page($csql,$sql,$pagesize,$url){
//取得记录总数$rs,计算总页数用
$rs=mysql_query($csql);
$myrow = mysql_fetch_array($rs);
$numrows = $myrow ;
//计算总页数
$pages = intval($numrows/$pagesize);
if($numrows%$pagesize)
$pages++;
//设置页数
if(isset($_GET['page'])){
$page=intval($_GET['page']);
}else{
$page = 1;
}
//计算记录偏移量
$offset=$pagesize*($page - 1);
//读取指定记录数
$rs=mysql_query($sql." limit $offset,$pagesize");
if ($myrow=mysql_fetch_array($rs))
{
$i=0;
do {
$i++;
echo "留言人:".$myrow["leavename"]." 时间:".$myrow["leavetime"]."<br /><br/>留言标题:".$myrow["title"]."<br/><br/>留言内容:".$myrow["content"]."<hr><br/>";
}
while ($myrow=mysql_fetch_array($rs));
}
echo "<div align='center'>共有".$pages."页(".$page."/".$pages.")";
for ($i=1;$i< $page;$i++)
echo "<a href='".$url."?page=".$i."'>[".$i ."]</a> ";
echo "[".$page."]";
for ($i=$page+1;$i<=$pages;$i++)
echo "<a href='".$url."?page=".$i."'>[".$i ."]</a> ";
echo "</div>";
?>
<?php
$first=1;
$prev=$page-1;
$next=$page+1;
$last=$pages;
if ($page > 1)
{
echo "<a href='".$url."?page=".$first."'>首页</a> ";
echo "<a href='".$url."?page=".$prev."'>上一页</a> ";
}
if ($page < $pages)
{
echo "<a href='".$url."?page=".$next."'>下一页</a>";
echo "<a href='".$url."?page=".$last."'>尾页</a> ";
}
}
}
?>
调用文件test.php
<?php
require_once("conn.php");
include("page_class.php");
$Page = new page("select count(*) from leaves","select * from leaves",2,"test.php");
?>
说明:功能现在这样完全可以实现
现在问题是:
如何把page_class.php文件中的
echo "留言人:".$myrow["leavename"]." 时间:".$myrow["leavetime"]."<br /><br/>留言标题:".$myrow["title"]."<br/><br/>留言内容:".$myrow["content"]."<hr><br/>";
应该写到test.php中来实现 达到通用类的效果。。望各位大虾嘛指点下。。期待中。。 请问模板中如何调用?
改进后
调用文件test.php<?php
require_once("conn.php");
include("page_class.php");
$Page = new page("select count(*) from leaves","select * from leaves",2,"test.php");
?>
这就可以调用,但是通用性不好。。前台显示的样子要在类里面写
所以整理后如下。。您可以参考下。。
[ 本帖最后由 小妍儿 于 2007-5-23 14:13 编辑 ]
重新整理
page.php类文件-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
<?php
//PHP分页类
class page
{
var $count; //总记录
var $cur_page; //当前页面
var $sql; //数据库语句
var $conn; //数据库连接串
var $page_size; //首页显示的记录数
var $pages; //总页数
var $url; //当前页面url
function page($conn)//构造函数
{
$this->conn =$conn;//数据库连接
}
function init()//初始化函数
{
$this->get_count();//获取总纪录数
$this->get_curpage();//获取当前页数
$this->get_allpage();//总页数
$this->url=$_SERVER['PHP_SELF'];//当前页面url
}
function open()//获取记录集
{
$this->init();//初始化
if($this->conn)
{
$sql=$this->sql." limit ".$this->page_size * $this->cur_page." ,".$this->page_size;
$rs=mysql_query($sql,$this->conn);
return $rs;
}
else
return false;
}
function get_count()//获取总纪录数
{
if(isset($_GET['count']))
$this->count=$_GET['count'];
else
{
$rs=mysql_query($this->sql,$this->conn);
$this->count=mysql_num_rows($rs);
}
}
function get_curpage()//获取当前页数
{
if(isset($_GET['cur_page']))
$this->cur_page=intval($_GET['cur_page'])+0;
else
$this->cur_page=0;
}
function get_allpage()//获取总页数
{
if($this->count % $this->page_size)
$this->pages=intval($this->count / $this->page_size);
else
$this->pages=intval($this->count / $this->page_size)-1;
}
//文字分页链接
function first_page($name="首页",$str="",$class_name="")//首页。$name为首页名称,$str为自定义传递字符串,$class_name为CSS类选择标签名(注,以下同)
{
if($this->cur_page >0)//当前页大于第一页
printf("<a href='%s?cur_page=%d&count=%d&$str' class='$class_name'>$name</a> ",$this->url,0,$this->count);
}
function back_page($name="上一页",$str="",$class_name="")//上一页
{
if( $this->cur_page > 0)//当前页不是第一页
printf("<a href='%s?cur_page=%d&count=%d&$str' class='$class_name'>$name</a> ",$this->url,$this->cur_page-1,$this->count);
}
function next_page($name="下一页",$str="",$class_name="")//下一页
{
if($this->cur_page<$this->pages)//当前页小于总页数
printf("<a href='%s?cur_page=%d&count=%d&$str' class='$class_name'>$name</a> ",$this->url,$this->cur_page+1,$this->count);
}
function last_page($name="最后一页",$str="",$class_name="")//尾页
{
if( $this->cur_page < $this->pages)//当前页不是最后一页
printf("<a href='%s?cur_page=%d&count=%d&$str' class='$class_name'>$name</a>",$this->url,$this->pages,$this->count);
}
}
?>
//调用页面如下
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
<?php
require("page.php"); //类文件
//连接数据库
$conn=mysql_connect("localhost","root","")or die("数据库连接失败,请联系管理员!");
mysql_select_db("test",$conn);
mysql_query("set names 'gbk'");
$obj=new page($conn);
$obj->sql="select * from leaves";//查询语句
$obj->page_size=2;//每页显示的记录数
$rs=$obj->open();
if(false==$rs)
die("获取记录集失败,请检查数据库连接是否成功!");
else
{
while($myrow=mysql_fetch_array($rs))
echo "留言人:".$myrow["leavename"]." 时间:".$myrow["leavetime"]."<br /><br/>留言标题:".$myrow["title"]."<br/><br/>留言内容:".$myrow["content"]."<hr><br/>";
}
$obj->first_page();
$obj->back_page();
$obj->next_page();
$obj->last_page();
echo "<br />";
?>
[ 本帖最后由 小妍儿 于 2007-5-23 14:10 编辑 ] 类中最好不要有输出, 并且你类的这种写法也不太好
function page($csql,$sql,$pagesize,$url)
在分页类不应该出现SQL语句,下面是我的写法,在分页类中不会出现SQL查询,提高了效率
page($total = 0 , $per = 1 , $midNum = 10 , $num = 3 , $main_page = 'index.php') 呵呵..谢谢您的建议,初学,很很多的地方不太懂,以后多多指教 太复杂,还是自己写的好。
我自己一个函数来搞定
//获取分页function turnPage($sql, $proFile, $seachStr, $pageSize_p = "")
{
global $pageSize, $_GET;
$page = $_GET["page"];
$reArray = array();
if($pageSize_p != "") $pageSize = $pageSize_p;
$query = mysql_query($sql);
$num = mysql_num_rows($query); //取得总条目数
//做分页
$MaxPage = ceil($num/$pageSize);
$page = $page ? $page : 1;
if(!$page or $page <= 1){$start = 0; $page = 1;}
elseif($page > $MaxPage){ $start = ($MaxPage-1) * $pageSize; $page = $MaxPage;}
else $start = ($page - 1) * $pageSize;
$reArray["limit"] = " LIMIT " . $start . ", " . $pageSize;
if($pageSize > 1) $reString = " 每页".$pageSize."条,共 ".$MaxPage." 页,第 ".$page." 页 ";
else $reString = "共 ".$MaxPage." 页,第 ".$page." 页 ";
if($page > 1)
$reString .= "
<a href=\"#\" onclick=\"load('".$proFile."?".$seachStr."&page=1')\">首页</a>
<a href=\"#\" onclick=\"load('".$proFile."?".$seachStr."&page=".($page-1)."')\">上一页</a>";
else
$reString .= "
<font style=\"color:#A9A9A9\">首页 上一页</font>";
if($page < $MaxPage)
$reString .= "
<a href=\"#\" onclick=\"load('".$proFile."?".$seachStr."&page=".($page+1)."')\">下一页</a>
<a href=\"#\" onclick=\"load('".$proFile."?".$seachStr."&page=".$MaxPage."')\">末页</a> ";
else
$reString .= "
<font style=\"color:#A9A9A9\">下一页 末页</font> ";
$reArray["page"] = $reString;
return $reArray;
}
谁给写个像51js分页的类或函数啊????
如题!因为看着漂亮很~~~~
期待中............. 我也正在做一个东东,实现这样的调用:
$m = new Lister;
$m->db = $db;
$m->sql = 'select * from user';
$m->page = $page;
$m->item = <<<EOF
<tr>
<td>{{字段1}}</td>
<td>{{字段2}}</td>
<td>{{字段3}}</td>
</tr>
$m.show();
EOF; 我也有一个
function Page($_Total, $_Num=30, $_View=10, $_Start_End=true, $_Pre_Next=true, $_Jump=true, $_Rand=false)
{
if($_Total <= $_Num) return '只有一页';
$_Link = eregi('(.+)&page=(+)$', $_Url=basename($_SERVER).'?'.$_SERVER, $_TUrl) ? $_TUrl : $_Url;
$_CPage = empty($_TUrl) ? 1 : $_TUrl;
$_Total = floor($_Total/$_Num)+1;
$_List = floor($_View/2);
$_Start = ($_List >= $_CPage) ? $_CPage-($_List-($_List-$_CPage))+1 : $_CPage-$_List;
$_End = ($_CPage+$_List>=$_Total) ? $_Total : $_CPage+$_List+($_List-($_CPage-$_Start));
for($i=$_Start; $i<=$_End; $i++)
{
$_Res .= ($i==$_CPage) ? "<a href='#'><b>[$i]</b></a>\n" : "<a href='{$_Link}&page={$i}'>{$i}</a>\n";
}
if($_Start_End)
{
$_First = "<a href='{$_Link}&page=1'>第一页</a>\n";
$_End = "<a href='{$_Link}&page=$_Total'>最末页</a>\n";
}
if($_Pre_Next)
{
if($_CPage > 1) $_Pre = "<a href='{$_Link}&page=".($_CPage-1)."'>上一页</a>\n";
if($_CPage < $_Total) $_Next = "<a href='{$_Link}&page=".($_CPage+1)."'>下一页</a>\n";
}
if($_Jump)
{
for($i=1; $i<=$_Total; $i++) { $_Tjump .= ($i==$_CPage) ? "<option value=$i selected>$i</option>" : "<option value=$i>$i</option>"; }
$_Code = "\n<select onchange=\"location.href='{$_Link}&page='+this.value\">\n{$_Tjump}\n</select>";
}
if($_Rand)
{
$_Rand = "<a href='{$_Link}&page=".rand(1, $_Total)."'>随机翻页</a>";
}
return $_First.$_Pre.$_Res.$_Next.$_End.$_Rand.$_Code;
}
我也來一個
我也來一個<?php
/*##################################################################
php+mysql分页类,程式设计:kamon,QQ:350665550,欢迎交流!
本分页类有3个属性3个方法
page - 当前页码
count - 总记录数
pagesize - 设置每页显示几条记录
通过设置上面的属性用GetPages()可以获得总页数
get_limit()获得sql查询条件
page_list()输出分页按扭
示例:
require_once("config.php");
require_once("inc_Pagination.php");
$mypage = new Pagination();//使用分页类
$mypage->page=$_GET['page'];//设置当前页
$mypage->pagesize=10;//每页多少条记录
$conn = connetSql();
$mypage->count=mysql_num_rows(mysql_query("select id from dt_content",$conn));//获取并设置数据库总记录数
echo "共有".$mypage->GetPages()."页记录<br/>";//输出有多少页
$sql = "select * from dt_content order by id asc".$mypage->get_limit();//分页条件查询
$rs = mysql_query($sql,$conn);
while($row=mysql_fetch_object($rs)){
echo $row->id."<br/>";
}
$mypage->page_list("inc_ControlDatabase.php");//输出分页按扭
##################################################################*/
class Pagination {
public $page=0;//当前页码 - set
public $count=0;//总记录数 - set
public $pagesize=0;//分页的每页记录数 - set
public function Pagination(){
$this->page=intval($page);
$this->count=$count;
$this->pagesize=$pagesize;
}
private function Page(){
$this->pagecount=ceil($this->count/$this->pagesize);
if ($this->page<=0) $this->page=1;
if ($this->page>$this->pagecount) $this->page=$this->pagecount;
return ($this->page);
}
//获得总页数 - get
public function GetPages(){
return (ceil($this->count/$this->pagesize));
}
//计算查询条件 - get
public function get_limit(){
$page_num=$this->Page();
$limit_start = ($page_num-1)*$this->pagesize;
return " limit ".$limit_start.",".$this->pagesize." ";
}
//输出分页按扭 - get
public function page_list($link=""){
$page_num=$this->Page();
$temppage=$index_page=$prev_page=$next_page=$end_page="";
Switch ($page_num) {
Case 1 :
$next_page="<a href=".$link."?page=".($page_num+1).">下一页 </a>";
$end_page="<a href=".$link."?page=".$this->pagecount.">未页</a>";
if($this->pagecount==1)$next_page=$end_page="";
Break;
Case $this->pagecount :
$index_page="<a href=".$link."?page=1>首页 </a>";
$prev_page="<a href=".$link."?page=".($page_num-1).">上一页 </a>";
Break;
Default:
$index_page="<a href=".$link."?page=1>首页 </a>";
$prev_page="<a href=".$link."?page=".($page_num-1).">上一页 </a>";
$next_page="<a href=".$link."?page=".($page_num+1).">下一页 </a>";
$end_page="<a href=".$link."?page=".$this->pagecount.">未页</a>";
Break;
}
for($i=1;$i<=$this->pagecount;$i++){
if ($i!=$page_num){
$temppage.="<a href=".$link."?page=".$i.">[".$i."]</a>"." ";
}else{
$temppage.=$i." ";
}
}
echo "共".$this->count."条记录 ".$page_num."/".$this->pagecount."页 ".$index_page.$prev_page.$temppage.$next_page.$end_page;
}
}
?>
php里也有var关键字? 其实zend的分页类不错哟 php里也有var关键字?
有的,不过在PHP5以后就不推荐使用了。
页:
[1]