php分页原理,懂得的指教一下哈!
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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(;;)
$zhi=mysql_fetch_assoc($result);
if($zhi)
$arr1[]=$zhi;
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;
?>
祝你成功! 参考技术A 相信你看了这个视频教程,一定可以写出自己的分页效果:http://www.php100.com/html/shipinjiaocheng/PHP100shipinjiaocheng/2009/0416/807.html 参考技术B 这一部分只是如何实现的显示比如1、2、3等的页码,还有一部分是从数据库中等读取数据的部分,就是类似select * from tables where id=id limit 0,10的语句。 参考技术C 一般是由URL传入页数(比如http://www.123456.com?p=2就是显示第二页)、
后台sql语句像一楼说的那样进行limit,(比如你显示第二页,每页10个就应该是limit 10,20 ,这样就只返回第10到19条记录,实现了分页显示)。
但是如果只是想使用分页的话 ,建议使用PEAR中的Pager类 ,非常方便。
哈士奇的工作原理是啥?
【中文标题】哈士奇的工作原理是啥?【英文标题】:How husky works?哈士奇的工作原理是什么? 【发布时间】:2019-12-09 08:49:32 【问题描述】:https://github.com/typicode/husky 能够自动运行 git 挂钩,以便在自己的存储库中的团队之间共享它们。
这怎么可能?由于钩子需要在.git/hooks
中,它没有添加到存储库中。
它是否包装git
命令并拦截命令,并在它们发生时运行钩子?
我想在不需要依赖 npm 或 node 的情况下为 python 和 php 项目重现这种行为。
【问题讨论】:
你看过源代码吗?我不是 javascript 专家,但在我看来,husky 会在您安装钩子时安装它。 我正在尝试。在github.com/typicode/husky/blob/… 似乎在上面的链接中复制了createHook
的钩子。这似乎发生在npm install
时间而不是git clone
。如果我想让它在 python 或 php 项目上运行,我需要在 pip 包或 composer 包中使用类似的东西
【参考方案1】:
从版本 5 开始,husky
准确地说是使用 git 的 core.hooksPath
git config core.hooksPath .husky
。这是在husky install
步骤中完成的。
由于husky install
创建的.husky
文件夹包含pre-commit
脚本,因此它将在提交之前运行。
默认情况下,它会包含npm test
,但您可以根据自己的意愿对其进行编辑。
你可以在任何项目中做类似的事情。只需在其中添加 .githooks
文件夹和挂钩文件(检查 .git/hooks 以获取示例文件)。但是您必须在克隆存储库(或第一次设置挂钩)时运行git config core.hooksPath .githooks
。您可以使用一些初始化脚本来执行此操作。npm
具有 scripts.prepare
,它可以在 npm install
(在本例中为 husky install
)上运行命令。
【讨论】:
【参考方案2】:在安装 husky 依赖项时(通过npm install
、npm add husky
、yarn install
、...)在 .git/hooks 目录中创建/更新 git 挂钩。如果挂钩是通过 git 命令触发的,则会触发来自 husky 的脚本,该脚本将根据您用于安装的包管理器执行命令。如果你使用 npm npx --no-install husky-run $hookName "$gitParams"
会被执行。该命令查看您的配置并执行为钩子定义的命令。
它就像 git hooks 的代理。代理安装一次,每次都由普通的 git 钩子执行。如果它被执行,它会查看配置并执行其中定义的命令。
【讨论】:
感谢您的回答。这很有趣,安装东西会运行任意代码,这是一个潜在的安全风险。我问是因为我试图用纯 git 重现这种行为,但这是不可能的。最后我找不到在克隆时将钩子复制到 .git/hooks 的方法,所以我将它们放在自述文件中并让用户手动安装它。再次感谢 @geckos:是的,存在一定的安全风险。但话又说回来:检查和构建 any 软件存在潜在的安全风险,因为几乎所有构建系统都允许执行任意外部命令(即任意代码执行)。所以无论如何你都不应该构建不受信任的软件。以上是关于php分页原理,懂得的指教一下哈!的主要内容,如果未能解决你的问题,请参考以下文章