导航:首页 > 编程语言 > php分页功能的实现原理

php分页功能的实现原理

发布时间:2024-06-03 07:40:49

php中的分页显示

1、前言

分页显示是一种非常常见的浏览和显示大量数据的方法,属于web编程中最常处理的事件之一。对于web编程的老手来说,编写这种代码实在是和呼吸一样自然,但是对于初学者来说,常常对这个问题摸不着头绪,因此特地撰写此文对这个问题进行详细的讲解,力求让看完这篇文章的朋友在看完以后对于分页显示的原理和实现方法有所了解。本文适合初学者阅读,所有示例代码均使用php编写。

2、原理

所谓分页显示,也就是将数据库中的结果集人为的分成一段一段的来显示,这里需要两个初始的参数:

每页多少条记录($PageSize)?
当前是第几页($CurrentPageID)?

现在只要再给我一个结果集,我就可以显示某段特定的结果出来。
至于其他的参数,比如:上一页($PreviousPageID)、下一页($NextPageID)、总页数($numPages)等等,都可以根据前边这几个东西得到。
以mysql数据库为例,如果要从表内截取某段内容,sql语句可以用:select * from table limit offset, rows。看看下面一组sql语句,尝试一下发现其中的规率。

前10条记录:select * from table limit 0,10
第11至20条记录:select * from table limit 10,10
第21至30条记录:select * from table limit 20,10
……

这一组sql语句其实就是当$PageSize=10的时候取表内每一页数据的sql语句,我们可以总结出这样一个模板:

select * from table limit ($CurrentPageID - 1) * $PageSize, $PageSize

拿这个模板代入对应的值和上边那一组sql语句对照一下看看是不是那么回事。搞定了最重要的如何获取数据的问题以后,剩下的就仅仅是传递参数,构造合适的sql语句然后使用php从数据库内获取数据并显示了。以下我将用具体代码加以说明。

3、简单代码
请详细阅读以下代码,自己调试运行一次,最好把它修改一次,加上自己的功能,比如搜索等等。

<?php
// 建立数据库连接
$link = mysql_connect("localhost", "mysql_user", "mysql_password")
or die("Could not connect: " . mysql_error());
// 获取当前页数
if( isset($_GET['page']) ){
$page = intval( $_GET['page'] );
}
else{
$page = 1;
}
// 每页数量
$PageSize = 10;
// 获取总数据量
$sql = "select count(*) as amount from table";
$result = mysql_query($sql);
$row = mysql_fetch_row($result);
$amount = $row['amount'];
// 记算总共有多少页
if( $amount ){
if( $amount < $page_size ){ $page_count = 1; } //如果总数据量小于$PageSize,那么只有一页
if( $amount % $page_size ){ //取总数据量除以每页数的余数
$page_count = (int)($amount / $page_size) + 1; //如果有余数,则页数等于总数据量除以每页数的结果取整再加一
}else{
$page_count = $amount / $page_size; //如果没有余数,则页数等于总数据量除以每页数的结果
}
}
else{
$page_count = 0;
}

// 翻页链接
$page_string = '';
if( $page == 1 ){
$page_string .= '第一页|上一页|';
}
else{
$page_string .= '<a href="/?page=1>";第一页</a>|<a href="/?page='."($page-1).'>上一页</a>|';
}
if( ($page == $page_count) || ($page_count == 0) ){
$page_string .= '下一页|尾页';
}
else{
$page_string .= '<a href="/?page='."($page+1).'>下一页</a>|<a href="/?page='."$page_count.'>尾页</a>';
}
// 获取数据,以二维数组格式返回结果
if( $amount ){
$sql = "select * from table order by id desc limit ". ($page-1)*$page_size .", $page_size";
$result = mysql_query($sql);

while ( $row = mysql_fetch_row($result) ){
$rowset[] = $row;
}
}else{
$rowset = array();
}
// 没有包含显示结果的代码,那不在讨论范围,只要用foreach就可以很简单的用得到的二维数组来显示结果
?>

4、OO风格代码
以下代码中的数据库连接是使用的pear db类进行处理

<?php
// FileName: Pager.class.php
// 分页类,这个类仅仅用于处理数据结构,不负责处理显示的工作
Class Pager
{
var $PageSize; //每页的数量
var $CurrentPageID; //当前的页数
var $NextPageID; //下一页
var $PreviousPageID; //上一页
var $numPages; //总页数
var $numItems; //总记录数
var $isFirstPage; //是否第一页
var $isLastPage; //是否最后一页
var $sql; //sql查询语句

function Pager($option)
{
global $db;
$this->_setOptions($option);
// 总条数
if ( !isset($this->numItems) )
{
$res = $db->query($this->sql);
$this->numItems = $res->numRows();
}
// 总页数
if ( $this->numItems > 0 )
{
if ( $this->numItems < $this->PageSize ){ $this->numPages = 1; }
if ( $this->numItems % $this->PageSize )
{
$this->numPages= (int)($this->numItems / $this->PageSize) + 1;
}
else
{
$this->numPages = $this->numItems / $this->PageSize;
}
}
else
{
$this->numPages = 0;
}

switch ( $this->CurrentPageID )
{
case $this->numPages == 1:
$this->isFirstPage = true;
$this->isLastPage = true;
break;
case 1:
$this->isFirstPage = true;
$this->isLastPage = false;
break;
case $this->numPages:
$this->isFirstPage = false;
$this->isLastPage = true;
break;
default:
$this->isFirstPage = false;
$this->isLastPage = false;
}

if ( $this->numPages > 1 )
{
if ( !$this->isLastPage ) { $this->NextPageID = $this->CurrentPageID + 1; }
if ( !$this->isFirstPage ) { $this->PreviousPageID = $this->CurrentPageID - 1; }
}

return true;
}

/***
*
* 返回结果集的数据库连接
* 在结果集比较大的时候可以直接使用这个方法获得数据库连接,然后在类之外遍历,这样开销较小
* 如果结果集不是很大,可以直接使用getPageData的方式获取二维数组格式的结果
* getPageData方法也是调用本方法来获取结果的
*
***/

function getDataLink()
{
if ( $this->numItems )
{
global $db;

$PageID = $this->CurrentPageID;

$from = ($PageID - 1)*$this->PageSize;
$count = $this->PageSize;
$link = $db->limitQuery($this->sql, $from, $count); //使用Pear DB::limitQuery方法保证数据库兼容性

return $link;
}
else
{
return false;
}
}

/***
*
* 以二维数组的格式返回结果集
*
***/

function getPageData()
{
if ( $this->numItems )
{
if ( $res = $this->getDataLink() )
{
if ( $res->numRows() )
{
while ( $row = $res->fetchRow() )
{
$result[] = $row;
}
}
else
{
$result = array();
}

return $result;
}
else
{
return false;
}
}
else
{
return false;
}
}

function _setOptions($option)
{
$allow_options = array(
'PageSize',
'CurrentPageID',
'sql',
'numItems'
);

foreach ( $option as $key => $value )
{
if ( in_array($key, $allow_options) && ($value != null) )
{
$this->$key = $value;
}
}

return true;
}
}
?>

<?php
// FileName: test_pager.php
// 这是一段简单的示例代码,前边省略了使用pear db类建立数据库连接的代码
require "Pager.class.php";
if ( isset($_GET['page']) )
{
$page = (int)$_GET['page'];
}
else
{
$page = 1;
}
$sql = "select * from table order by id";
$pager_option = array(
"sql" => $sql,
"PageSize" => 10,
"CurrentPageID" => $page
);
if ( isset($_GET['numItems']) )
{
$pager_option['numItems'] = (int)$_GET['numItems'];
}
$pager = @new Pager($pager_option);
$data = $pager->getPageData();
if ( $pager->isFirstPage )
{
$turnover = "首页|上一页|";
}
else
{
$turnover = "<a href='?page=1&numItems=".$pager->numItems."'>首页</a>|<a href="/?page=".$pager->PreviousPageID."&numItems=".$pager->numItems."'>上一页</a>|";
}
if ( $pager->isLastPage )
{
$turnover .= "下一页|尾页";
}
else
{
$turnover .= "<a href="/?page=".$pager->NextPageID."&numItems=".$pager->numItems."'>下一页</a>|<a href="/?page=".$pager->numPages."&numItems=".$pager->numItems."'>尾页</a>";
}
?>

需要说明的地方有两个:

这个类仅仅处理数据,并不负责处理显示,因为我觉得将数据的处理和结果的显示都放到一个类里边实在是有些勉强。显示的时候情况和要求多变,不如自己根据类给出的结果处理,更好的方法是根据这个Pager类继承一个自己的子类来显示不同的分页,比如显示用户分页列表可以:

<?php
Class MemberPager extends Pager
{
function showMemberList()
{
global $db;

$data = $this->getPageData();
// 显示结果的代码
// ......
}
}
/// 调用
if ( isset($_GET['page']) )
{
$page = (int)$_GET['page'];
}
else
{
$page = 1;
}
$sql = "select * from members order by id";
$pager_option = array(
"sql" => $sql,
"PageSize" => 10,
"CurrentPageID" => $page
);
if ( isset($_GET['numItems']) )
{
$pager_option['numItems'] = (int)$_GET['numItems'];
}
$pager = @new MemberPager($pager_option);
$pager->showMemberList();
?>

第二个需要说明的地方就是不同数据库的兼容性,在不同的数据库里截获一段结果的写法是不一样的。
mysql: select * from table limit offset, rows
pgsql: select * from table limit m offset n
......
所以要在类里边获取结果的时候需要使用pear db类的limitQuery方法。

ok,写完收功,希望花时间看完这些文字的你不觉得是浪费了时间。

㈡ php分页原理,懂得的指教一下哈!

分页的原理在所有的WEB语言几乎都是差不多的!下面我来说说吧
如果你能好好研究我写的东西,分页将不再是问题
分页有两种情况
一、文件数据的分页
二、数据库数据的分页
其中数据库数据的分页用得最多,原理也是差不多,只不过获得数据的方法不同。
下面主要说一下数据库数据的分页
首先我们要明白见个量
a、页面上要显示的链接数$links(我们这里讨论的不是只有上一页和下一页的情形,我们讨论网络图片中的分页效果)
b、每一页要显示的记录数$page_messages即一页中显示的数据的多少
c、当前的页码$page
d、数据库中总的记录数(不是必要,但是为保证生成分页条正确,我们也应该考虑)
有了上面的四个量我们就可以通过他们得出分页条的开始页码和结束页码,以及
select * from tables where fields=value limit offset,numbers中的offset和numbers
其中offset=($page-1)*$page_messages
numbers=$page_messages

其次,我们要明白在点击分页条中的链接时我们应该将相应的页码传递到后台去
即$page传递PHP文件,通过它来动态的生成offset,重新从数据中读取数据

最后,在模板文件中或者直接在HTML中通过循环控制语句,将数据显示出来

分页条中页码的计算须要考虑多方面,这里不做详述,我会在最后给你一个分页的源码,由于这个分页的源码是用面向对象写的,所以有点难,不过你只需会用这个类的最后一个方法理解它的每一个参数就可以实现分页.
这个分布类用到一个数据操作类所以一并给出
<?php
header("content-type:text/html;charset=utf-8");
class DB{
static private $obj = null;
static private $db_link = null;
static private $dbhost;//数据库服务器地址
static private $dbuser;//数据库用户名
static private $dbpass;//数据库密码
static private $dbname;//数据库名
static private $dbcharset;//数据库编码
static public function ConstZhi($host,$user,$password,$dbname,$dbcharset){
self::$dbhost=$host;
self::$dbuser=$user;
self::$dbpass=$password;
self::$dbname=$dbname;
self::$dbcharset=$dbcharset;
}
static public function &Instance(){
if ( null == self::$obj ){
$class = __CLASS__;
self::$obj = new $class;
}
return self::$obj;
}

function __construct(){
self::$db_link=mysql_connect(self::$dbhost,self::$dbuser,self::$dbpass);
@mysql_select_db(self::$dbname, self::$db_link ) or die("数据库名错误,请查正!".mysql_error());
@mysql_query( 'SET NAMES '.self::$dbcharset,self::$db_link ) or die("编码设置错误".mysql_error());
}

function __destruct(){
self::Close();
}

static public function Close(){
if ( is_resource( self::$db_link ) ){
@mysql_close( self::$db_link );
}

self::$db_link = null;
self::$obj = null;
}

static public function EscapeString( $string ){
self::Instance();
return @mysql_real_escape_string( $string, self::$db_link );
}

static public function GetInsertId(){
self::Instance();
return intval( @mysql_insert_id(self::$db_link) );
}

static public function Query( $sql ){
self::Instance();
$result = @mysql_query( $sql, self::$db_link );
if ( $result ){
return $result;
}

self::Close();
return false;
}

static public function doInsert( $table , $arr1 ){

$sql_fd = '';
$sql_v = '';

foreach ( $arr1 as $k => $v ) {
$sql_fd .= ", `$k` ";
$sql_v .= ", '".self::EscapeString( $v )."' ";
}

$sql_fd = '('.trim( $sql_fd , ',' ).')';
$sql_v = '('.trim($sql_v , ',').')';

$sql = "INSERT INTO `$table` ".$sql_fd.' VALUES '.$sql_v;
if ( mysql_query($sql) ) {
return mysql_insert_id();
}

return false;
}

static public function doDelete( $table , $val , $fd = 'id' ) {
self::Instance();
$sql = "DELETE FROM `$table` WHERE `$fd` = ".self::EscapeString($val) ;
return self::Query( $sql , self::$db_link );
}
/**
* doDeleteXu() made by xudianyang
* */
static public function doDeleteXu( $table , $val , $fd = 'id' ) {
self::Instance();
$sql = "DELETE FROM `$table` WHERE `$fd` = ".$val;
return self::Query( $sql , self::$db_link );
}

//UPDATE `sina`.`sohu_url` SET `state` = '1' WHERE `sohu_url`.`id` =1 LIMIT 1 ;
static public function doUpdate( $table , $arr1 , $arr2 ){
self::Instance();
$sql_set = '';
foreach ( $arr2 as $k => $v ) {
$sql_set .= ", `$k` = '".self::EscapeString($v)."' ";
}
$sql_set = trim( $sql_set , ',' );
$arr_w = array();
foreach ( $arr1 as $k => $v ){
$arr_w[] = " `".self::EscapeString($k)."` = '".self::EscapeString($v)."' ";
}
$sql = "UPDATE `$table` SET $sql_set WHERE ".implode('and' , $arr_w);
if ( self::Query($sql) )
return true;

return false;
}

static public function getRows( $table , $arr=array() , $one = 0 ) {
self::Instance();
if ( empty($arr) ){
$sql = "SELECT * FROM `$table`";
}else{
$arr_w = array();
foreach ( $arr as $k => $v ){
if(is_numeric($v))
$arr_w[] = " `".self::EscapeString($k)."` = ".self::EscapeString($v);
else
$arr_w[] = " `".self::EscapeString($k)."` = '".self::EscapeString($v)."' ";
}
$sql = "SELECT * FROM `$table` WHERE ".implode(' and' , $arr_w)." ORDER BY `id` ASC";
//echo $sql ;
}

if ( $ret = self::Query($sql) ){
if ( $one ){
return mysql_fetch_assoc( $ret );
}else{
$arr_out = array();
while( $row = mysql_fetch_assoc( $ret ) ){
$arr_out[] = $row;
}
return $arr_out;
}
}

return false;
}

static private function makeWhere( $arr ){
$arr_w = array();
foreach ( $arr as $k => $v ){
$arr_w[] = " `".self::EscapeString($k)."` = '".self::EscapeString($v)."' ";
}
return implode('and' , $arr_w);
}

static public function getCount( $table , $arr ){
if ( is_array($arr) and count($arr) > 0 ) {
$sql = "SELECT COUNT(*) n FROM `$table` WHERE ". self::makeWhere($arr);
if ( $ret = self::Query($sql) ){
$tmep = mysql_fetch_assoc( $ret );
return $tmep['n'];
}
}
return false;
}

/**
* getCountXu() made by xudianyang
* */
static public function getCountXu( $table , $arr ){
$sql = "SELECT COUNT(*) n FROM `$table`" ;
if ( $ret = self::Query($sql) ){
$tmep = mysql_fetch_assoc( $ret );
return $tmep['n'];
}
return false;
}

static public function getQueryResult( $sql, $one=false ){
$ret = array();
if ( $result = self::Query($sql) ){
while ( $row = mysql_fetch_assoc($result) ){
//$row = array_change_key_case($row, CASE_LOWER);
if ( $one ){
$ret = $row;
break;
}else{
array_push( $ret, $row );
}
}
@mysql_free_result( $result );
}
return $ret;
}
}

可以在类中配置你自己的数据库服务器相应的账号和密码

<?php
class Fenye{
private $mDB;
public function __construct(DB $obj){
$this->mDB=$obj;
}
/**
* 计算总共的页数
*
* @param string $table 表名
* @param array $conditon 查询的条件
* @param integer $message_number 每页显示的记录数
* @return array */
public function getPageAll($table,$condition,$message_number){
if($condition == ""){
$recodernum=$this->mDB->getCountXu($table,$condition);
}else{
$recodernum=$this->mDB->getCount($table,$condition);
}
$arrnumber['all']=$recodernum;
$arrnumber['page_all']= ceil($recodernum/$message_number);
return $arrnumber;
}
/**
* 生成查询的SQL语句
*
*@param string $table 需要查询的表
*@param array $conditon 查询的条件
*@param array $arr 查询的字段所组成的一个数组
*@param mixed $order 表示排序方式
*@param array $limit 表示指定查询记录的数目
*@return string
**/

public function createSQL($table,$condition,$arr,$order,$limit){
if ($table == ""){
return false;
}else{
$str1="";
$str2="";
$str3="";
$str4="";
$n=0;
$m=0;
$p=0;
if ($arr == ""){
$str1="*";
}else{
foreach ($arr as $value){
$p++;
if ($p == 1){
$str1.=$value;
}else{
$str1.=",".$value;
}
}
}
if($condition == ""){
$str2="";
}else{
foreach ($condition as $key => $value){
$n++;
if ($n == 1){
$str2.="where ".$key."="."'".$value."'";
}else{
$str2.=" and ".$key."="."'".$value."'";
}
}
}
if($order == ""){
$str3="";
}else{
foreach ($order as $key => $value){
$m++;
if ($m == 1){
$str3.=" order by ".$key." ".$value;
}else{
$str3.=",".$key." ".$value;
}
}
}
if ($limit == ""){
$str4="";
}else{
$str4="limit ".$limit[0].",".$limit[1];
}
$sql="select ".$str1." from ".$table." ".$str2.$str3." ".$str4;
}
return $sql;
}
/**
*获取当前页面应有的信息
*
*@param integer $page 当前的页码
*@param integer $message_number 每页显示的记录数
*@param integer $pageall 总共的页数
*@param string $sql 待执行的SQL语句
*@return array
*/
public function getPageInformation($page,$page_all,$message_number,$sql){
$start=0;//开始的页码
$end=0;//结束的页码
$arr=array();//返回的结果储存在这个数组中
$left=intval($message_number/2);
$start=$page-$left;
$end=$page+$left;
if($message_number <= $page_all){//判断总的页数是否大于每一页的链接数
if($end <= $message_number){
$end=$message_number;
}
}else{
$end=$page_all;
}
if($start <= 0){
$start=1;
}
if($end >= $page_all){
$start=$page_all-$message_number+1;
if($start <= 0){
$start=1;
}
$end=$page_all;
}
if($page < 1){
$page=1;
$start=1;
if($page_all <= $message_number){
$end=$page_all;
}
$end=$message_number;
}
if($page >= $page_all){
$page=$page_all;
$start=$page-$message_number+1;
if($start <= 0){
$start=1;
}
$end=$page;
}
$result=$this->mDB->Query($sql);
if($result){
for(;;){
$=mysql_fetch_assoc($result);
if($){
$arr1[]=$;
}else{
break;
}
}
}
$arr['start']=$start;
$arr['end']=$end;
$arr['page_all']=$page_all;
$arr['page']=$page;
$arr['content']=@ $arr1;
return $arr;
}
/**
* 修改传递的页码使其合法
*
* @param integer $page 传递过来的页码
* @param integer $page_all 总的页码
* @return integer*/
public function checkPage($page,$page_all){
if($page < 1){
$page=1;
}
if($page >= $page_all){
$page=$page_all;
}
return $page;
}
/**
* 生成分页条
*
* @param integer $page 当前页码
* @param integer $start 分页条开始页码
* @param integer $end 分页条结束的页码
* @param integer $page_all 总共页码数
* @param string $otherquery 需要传递的其他参数 如&string=Publisher
* @return string
* */
public function createFenYeTiao($page,$start,$end,$page_all,$otherquery=''){
$str="";
if($page == 1){
$str.='首页'." ".'上一页'." ";
}else{
$str.="<a href='?page=1".$otherquery."' target='_self'>".'首页'."</a>"." ";
$str.="<a href='?page=".($page-1).$otherquery."' target='_self'>".'上一页'."</a>"." ";
}

for($i=$start;$i<=$end;$i++){
if($page == $i){
$str.="<a href='?page=".$page.$otherquery."' target='_self'>".$page."</a>"." ";
}else{
$str.="<a href='?page=".$i.$otherquery."' target='_self'>[".$i."]</a>"." ";
}
}
if($page == $page_all){
$str.='下一页'." ".'尾页';
}else{
$str.="<a href='?page=".($page+1).$otherquery."' target='_self'>".'下一页'."</a>"." ";
$str.="<a href='?page=".$page_all.$otherquery."' target='_self'>".'尾页'."</a>"." ";
}
return $str;
}
/**
* 完成分页所有操作
*
*@param string $table 需要查询的表
*@param array $conditon 查询的条件
*@param array $arrField 查询的字段所组成的一个数组
*@param mixed $order 表示排序方式
*@param integer $page 当前页码
*@param integer $mess_num 每页显示的记录数
*@param integer $page_link 显示的链接数目
*@param string $otherquery 点击分页页码时需要传递的其他参数,默认为空
*@return array 包括分页条和从数据库读得的数据分别保存在索引为content和fenyetiao的两个元素中,注意
*索引为content的元素为一个二维数组*/
public function FinishFenYe($table,$condition,$arrField,$order,$page,$mess_num,$page_link,$otherquery){
$allnumber=$this->getPageAll($table,"",$mess_num);
$page_all=$allnumber['page_all'];
$page=$this->checkPage($page,$page_all);
$limitoffet=($page-1)*$mess_num;
$limit=array($limitoffet,$mess_num);
$sql=$this->createSQL($table,$condition,$arrField,$order,$limit);
$resarr=$this->getPageInformation($page,$page_all,$page_link,$sql);
$resarr['page']=$this->checkPage($resarr['page'],$resarr['page_all']);
$fenyetiao=$this->createFenYeTiao($resarr['page'],$resarr['start'],$resarr['end'],$resarr['page_all'],$otherquery);
$resarr['fenyetiao']=$fenyetiao;
$resarr['all']=$allnumber['all'];
return $resarr;
}
}
?>

祝你成功!

㈢ php分页代码 怎么写

Web开发是今后分布式程式开发的主流,通常的web开发都要涉及到与数据库打交道,客户端从服务器端读取通常都是以分页的形式来显示,一页一页的阅读起来既方便又美观。所以说写分页程序是web开发的一个重要组成部分,在这里,我们共同来研究分页程序的编写。

一、分页程序的原理

分页程序有两个非常重要的参数:每页显示几条记录($pagesize)和当前是第几页($page)。有了这两个参数就可以很方便的写出分页程序,我们以MySql数据库作为数据源,在mysql里如果要想取出表内某段特定内容可以使用的 T-SQL语句:select * from table limit offset,rows来实现。这里的offset是记录偏移量,它的计算方法是offset=$pagesize*($page-1),rows是要显示的记录条数,这里就是$page。也就是说select * from table limit 10,10这条语句的意思是取出表里从第11条记录开始的20条记录。

二、主要代码解析

$pagesize=10; //设置每一页显示的记录数
$conn=mysql_connect("localhost","root",""); //连接数据库
$rs=mysql_query("select count(*) from tb_proct",$conn); //取得记录总数$rs
$myrow = mysql_fetch_array($rs);
$numrows=$myrow[0];

//计算总页数

$pages=intval($numrows/$pagesize);

//判断页数设置

if (isset($_GET['page'])){
$page=intval($_GET['page']);
}
else{
$page=1; //否则,设置为第一页
}

三、创建用例用表myTable

create table myTable(id int NOT NULL auto_increment,news_title varchar(50),news_cont text,add_time datetime,PRIMARY KEY(id))

四、完整代码

<html>
<head>
<title>php分页示例</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>

<body>
<?php
$conn=mysql_connect("localhost","root","");
//设定每一页显示的记录数
$pagesize=1;
mysql_select_db("mydata",$conn);
//取得记录总数$rs,计算总页数用
$rs=mysql_query("select count(*) from tb_proct",$conn);
$myrow = mysql_fetch_array($rs);
$numrows=$myrow[0];
//计算总页数

$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("select * from myTable order by id desc limit $offset,$pagesize",$conn);
if ($myrow = mysql_fetch_array($rs))
{
$i=0;
?>
<table border="0" width="80%">
<tr>
<td width="50%" bgcolor="#E0E0E0">
<p align="center">标题</td>
<td width="50%" bgcolor="#E0E0E0">
<p align="center">发布时间</td>
</tr>
<?php
do {
$i++;
?>
<tr>
<td width="50%"><?=$myrow["news_title"]?></td>
<td width="50%"><?=$myrow["news_cont"]?></td>
</tr>
<?php
}
while ($myrow = mysql_fetch_array($rs));
echo "</table>";
}
echo "<div align='center'>共有".$pages."页(".$page."/".$pages.")";
for ($i=1;$i< $page;$i++)
echo "<a href='fenye.php?page=".$i."'>[".$i ."]</a> ";
echo "[".$page."]";
for ($i=$page+1;$i<=$pages;$i++)
echo "<a href='fenye.php?page=".$i."'>[".$i ."]</a> ";
echo "</div>";
?>
</body>
</html>

五、总结

本例代码在windows2000 server+php4.4.0+mysql5.0.16上运行正常。该示例显示的分页格式是[1][2][3]…这样形式。假如想显示成“首页 上一页 下一页 尾页”这样形式,请加入以下代码:

$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> ";
}

其实,写分页显示代码是很简单的,只要掌握了它的工作原理。希望这篇文章能够带给那些需要这方面程序web程序员的帮助。

㈣ php应该怎样分页

我也和你一样,看了好多例子都不懂,后来看了这个,总算搞懂了。这个还算简单,是说的php mysql的分页。

正文:
在看本文之前,请确保你已掌握了PHP的一些知识以及MYSQL的查询操作基础哦。

作为一个Web程序,经常要和不计其数的数据打交道,比如会员的数据,文章数据,假如只有几十个会员那很好办,在一页显示就可以了,可是假如你的网站是几千甚至几十万会员的话,如果都在一页打开的话无论对浏览器还是观看者都是一种折磨。

相信每个学习PHP的新手都会对分页这个东西感觉很头疼,不过有了默默的这一水帖,你肯定会拍拍脑袋说,嘿,原来分页竟然如此简单?的确,现在请深呼吸一口新鲜的空气,仔细的听默默给你一点一点的分解。

假设我们要处理1000条数据,要在每页中显示10条,这样的话就会分100页来显示,咱们先看一看在mysql里提取10条信息是如何操作的。

Select * from table limit 0,10

上面是一句很简单的mysql查询语句,它的作用是从一个名叫table的表里提取10条数据,并且把所有字段的值都获得。

关键的地方就在这段“limit 0,10”,它其中的0是以0为起始点,后面的10则是显示10条数据,那么我们要以10为起始点,显示到第20条数据该怎么写呢?

可能很多大大会心直口快的说“limit 10,20”嘛!啊哦,这样可就错误了哦,正确的写法是“limit 10,10”它后面的参数并非是结束点而是要提取的数目,记住哦。

懂得了如何提取10条数据,那么提取1000条也就是做100次这种查询呀,就是说要做如下的查询:

Limit 0,10 //第一页
Limit 10,10 //第二页
Limit 20,10 //第三页
Limit 30,10 //第四页
……
看出有什么规律了吗?没错,第一个参数每翻一页就增加10,可是第二个参数是不变的。
也就是说咱们设法根据页数来改变第一个参数的值,就可以进行分页显示数据了,怎么样,原理是不是很简单?

可是要怎么设法根据页数来改变第一个参数的值呢?首先,咱们要有一个页数的值,用url的GET方式获取。
比如index.php?page=18
相信大部分的大大对这个东西不陌生吧,这种url地址可是随处可见,其中的page参数的作用就是传入要显示的页数。

咱们通过一段代码来看一看究竟是如何实现的吧:

PHP代码如下:

/*

Author:默默
Date :2006-12-03

*/

$page=isset($_GET['page'])?intval($_GET['page']):1; //这句就是获取page=18中的page的值,假如不存在page,那么页数就是1。
$num=10; //每页显示10条数据

$db=mysql_connect("host","name","pass"); //创建数据库连接
$select=mysql_select_db("db",$db); //选择要操作的数据库

/*
首先咱们要获取数据库中到底有多少数据,才能判断具体要分多少页,具体的公式就是
总数据数除以每页显示的条数,有余进一。
也就是说10/3=3.3333=4 有余数就要进一。
*/

$total=mysql_num_rows(mysql_query("select id from table")); //查询数据的总数,id是数据库中的一个自动赋值的字段
$pagenum=ceil($total/$num); //获得总页数

//假如传入的页数参数大于总页数,则显示错误信息
If($page>$pagenum || $page == 0){
Echo "Error : Can Not Found The page .";
Exit;
}

$offset=($page-1)*$num; //获取limit的第一个参数的值,假如第一页则为(1-1)*10=0,第二页为(2-1)*10=10。

$info=mysql_query("select name from table limit $offset,$num"); //获取相应页数所需要显示的数据,name是数据里的一个字段
While($it=mysql_fetch_array($info)){
Echo $it['name']."
";
} //显示数据

For($i=1;$i<=$pagenum;$i++){

$show=($i!=$page)?"$i":"$i";
Echo $show." ";
}

/*显示分页信息,假如是当页则显示粗体的数字,其余的页数则为超连接,假如当前为第三页则显示如下
1 2 3 4 5 6
*/
?>

㈤ PHP分页问题. 望大虾开示

1.$_GET[page] 是你点击 上一页 或者 下一页 传递过来的, 当你的页面初始化的时候 也就是你没还没点击上一页 下一页 的时候 他应该是0
2.$page.=','; 这个的意思是 $page = $page . ','; 他是用来拼写SQL 语句的
拼写后 你的SQL 应该是 select * from message limit 0,5; 注意看 0 和之间 有个 逗号 代表 从结果集的第一行数据 往下取5 行

3.分页其实非常简单 比如说你有26记录 每5条为一页 26条记录能分几页啊 ? 当然是 6页了...
可是计算机不知道 你就给他一个算法
记住公式 (总的记录条数 + 每页的记录数 - 1) / 每页的记录数
咱们用公式算一下 (26 + 5 -1) / 5 = 6
然后我们看下SQL $sql="select * from message limit $page $pagesize ";
第1页的时候 是 limit 0,5
第2页的时候 是 limit 5,5
第2页的时候 是 limit 10,5
刚才也说了 limit 是从第几行数据 往下 走 几行 因为咱们是 5条数据一分也所以 第2个参数永远都不用变就是5 ,第一个参数 非常好算 每页的记录数 * (当前页数 - 1)
第1页的时候 是 5*(1-1)=0
第2页的时候 是 5*(2-1)=5
第1页的时候 是 5*(3-1)=10

还有说的就是你的代码 问题很严重 . php 5.3 版本 你这程序根本就运行不了....
$_GET['page'] 这个样写才标准. 不要以为PHP 单引号 和 双引号 没有任何差别 单引号的速度要比 双引号 快3倍. $_GET[page] 这种写法 5.3 以后直接就报错了. 建议你马上升级为5.3 或更高的版本 养成一个练好的编写代码习惯.

阅读全文

与php分页功能的实现原理相关的资料

热点内容
安卓手机拍摄慢动作怎么设置 浏览:478
中国程序员加油 浏览:169
python去哪个城市比较多 浏览:757
闪迪u盘加密初始密码 浏览:773
房屋办理解压需要契税和发票吗 浏览:888
丽江易学java高级程序员 浏览:661
程序员木兰教程 浏览:665
pythontkinter按钮 浏览:439
如何快捷录音安卓 浏览:7
sd播放音乐需要哪些文件夹 浏览:839
华为平板m3怎么升级到安卓11 浏览:532
联通app排队号怎么看 浏览:647
怎么不越狱安装app 浏览:183
python怎么用链表 浏览:851
8k程序员面试题 浏览:541
贵州交警app怎么下载 浏览:414
解压缩安装包怎么安装 浏览:44
压缩机系统与装置 浏览:677
上海大众app怎么查保养记录 浏览:464
抖音网红一手资源解压密码 浏览:543