php数据库内容分页原理 php实现分页显示
PHP分页原理
兄台可以看一下php教程,$_GET[page]是通过url传的参数,即: a href=$url?page=".($pageval+1)."下一页/a";这样子。而且貌似$SQL="SELECT * FROM `ye` limit $page $pagesize";写的有一点问题,建议写成$SQL="SELECT * FROM `ye` limit ($page-1)* $pagesize,$pagesize";总之只是给您提供了一点建议,希望您的编程之路越走越远。
公司专注于为企业提供成都做网站、网站建设、微信公众号开发、商城网站建设,小程序开发,软件按需网站建设等一站式互联网企业服务。凭借多年丰富的经验,我们会仔细了解各客户的需求而做出多方面的分析、设计、整合,为客户设计出具风格及创意性的商业解决方案,成都创新互联更提供一系列网站制作和网站推广的服务。
PHP里生成分页的原理和代码。高手帮下忙!MYSQL数据库!
看看那个limit,分页程序主要是用sql的limit实现,网上php分页类很多,就不粘了
原理是这样:
用sql语句查询后得到所有的记录条数;
根据每页显示的条数得到总共有多少页数;
通过url就是get得到当前第几页;
根据当前页数和每页显示的条数得到当前页显示的数据的起始条数start_num和结束条数end_num;
最后 select * from talbel where 条件 limit start_num,end_num;
这时得到的结果就是当前页需要显示的内容,循环输出就行了
请问哪位大侠能给我解释下PHP分页的原理么,麻烦附上代码加注释,我大部分能看懂,但是有些模糊,谢谢
?php
/*
$recordcount 总数据量
$pernumber 每页显示记录数
$pagelong 显示页码的长度
*/
function showpage($pagecount,$pagelong=5){
if(!isset($_GET['page'])){
$_GET['page']='';
}
if(!isset($p)){
$p='';
}
if($_GET['page']1||$_GET['page']==""){
$_GET['page']=1;
}
//总页数小于等于页码长度
if($pagecount=$pagelong){
for($i=1;$i=$pagecount;$i++){
if($i==$_GET['page']){
$p=$p." span$i/span ";
}
else{
$p =$p." a href='".get_url($i)."' hidefocus$i/a ";
}
}
}
//总页数大于页码长度
else{
//循环页码数
for($i=$_GET['page'];$i=$_GET['page']+$pagelong-1;$i++){
//判断是否在当前页
if($i==$_GET['page']$_GET['page']!=1){
//输出 当前页前面的
for($i=$_GET['page']-5;$i$_GET['page'];$i++){
if($i=1){
$p=$p." a href='".get_url($i)."' hidefocus$i/a ";
}
}
$p=$p." span$i/span ";
}
else{
if($i==$_GET['page']){
$p =$p." span$i/span ";
}
else{
$p =$p." a href='".get_url($i)."' hidefocus$i/a ";
}
}
//总页数-当前页码 小于 页码长度
if(($pagecount-$_GET['page'])=$pagelong){
for($i=$_GET['page']+1;$i=$pagecount;$i++){
$p=$p." a href='".get_url($i)."' hidefocus$i/a ";
}
break;
}
//当前页大于等于总页数
if($_GET['page']=$pagecount){
break;
}
}
}
//当前页不是首页
if($_GET['page']!="1"){
$a=$_GET['page']-1;
//if($_GET['page']4){
$p = " a href='".get_url(1)."' hidefocus/a a href='".get_url($a)."' hidefocus/a ".$p;
//}
}
//当前页不是尾页
if($_GET['page']$pagecount){
$a=$_GET['page']+1;
if($_GET['page']$pagecount-2){
$p = $p." a href='".get_url($a)."' hidefocus/a a href='".get_url($pagecount)."' hidefocus/a ";
}
else{
$p = $p." a href='".get_url($a)."' hidefocus/a ";
}
}
return $p;
}
//获取分页的URL
function get_url($page){
//默认的
if(empty($_SERVER['QUERY_STRING'])){ //empty变量是否为空 $_SERVER['QUERY_STRING'] URL中第一个问号?之后的内容
return $_SERVER['PHP_SELF'].'?page='.$page; //$_SERVER['PHP_SELF'] 当前正在执行脚本的文件名
}
//有分页的
elseif(strpos($_SERVER['QUERY_STRING'],'page')!== false){ //strpos获取字符串page首次出现位置(判断是否有参数page)
//有参数
if(strpos($_SERVER['QUERY_STRING'], '') !== false){ //有多个参数
$u = explode('page', $_SERVER['QUERY_STRING']);
return $_SERVER['PHP_SELF'].'?'.$u[0].'page='.$page;
}
//无参数的
else{
return $_SERVER['PHP_SELF'] . '?page=' . $page;
}
}
//有参数,无分页的
else{
return $_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING'].'page='.$page;
}
}
关于php mysql分页原理
/**
* 分页函数
* author:
* @param int $num 总数
* @param int $perpage 每页显示数量
* @param int $curpage 当前页
* @param string $mpurl 传递的URL
* @param int $page 显示的页数,默认为11
*
* @return string
*/
function multi($num, $perpage, $curpage, $mpurl="?", $page = 11) {
$curpage = $curpage ? $curpage : 1;
echo 'style type="text/css"
!--
.pages em { line-height: 26px;border-right-width: 1px;border-right-style: solid;border-right-color: #CAD9EA; }
.pages {float: left;border: 1px solid #CAD9EA;background: #F7F7F7;height: 24px;line-height: 26px;color: #999;overflow: hidden;font-family: Verdana, Arial, Helvetica, sans-serif;}
.pages a, .pages strong, .pages em, .pages kbd, #multipage .pages em { float: left;padding: 0 8px;line-height:26px;text-decoration: none;color: #000000;font-size: 12px; font-family: Verdana, Arial, Helvetica, sans-serif;}
.pages a:hover {font-weight: bold;background-color: #FFF;color: #F26100;text-decoration: underline;font-family: Verdana, Arial, Helvetica, sans-serif;}
.pages strong {font-weight: bold;color: #F26100;background: #CAD9EA;}
.pages a.prev, .pages a.next {width: 60px;line-height: 24px;font-family: Verdana, Arial, Helvetica, sans-serif;}
.pages kbd {border-left: 1px solid #CAD9EA;margin: 0;}
* html .pages kbd {padding: 1px 8px;}
.pages kbd input {border: 1px solid #CAD9EA;margin-top: 3px !important;margin-top: 1px !important;margin: 1px 4px 0 3px;padding: 0 2px;height: 17px;}
.pages kbd input {margin-bottom: 2px;}
--
/style';
$multipage = '';
$pages = 1;//总页数 if($num $perpage) {
$offset = ceil($page/2)-1; $pages = @ceil($num / $perpage);
if($page $pages) {
$from = 1;
$to = $pages;
} else {
$from = $curpage - $offset;
$to = $from + $page - 1;
if($from 1) {
$to = $page;//$curpage + 1 - $from;
$from = 1;
if($to - $from $page) {
$to = $page;
}
} elseif($to $pages) {
$from = $pages - $page + 1;
$to = $pages;
}
} $curpage = $curpage = $pages ? $curpage : $pages; $multipage .= ($curpage - $offset 1 $pages $page ? 'a href="'.$mpurl.'page=1" class="first"1 .../a' : '').
($curpage 1 ? 'a href="'.$mpurl.'page='.($curpage - 1).'" class="prev" title="prev" ‹‹上一页/a' : '');
for($i = $from; $i = $to; $i++) {
$multipage .= $i == $curpage ? 'strong'.$i.'/strong' :
'a href="'.$mpurl.'page='.$i.'"'.$i.'/a';
} $multipage .= ($curpage $pages ? 'a href="'.$mpurl.'page='.($curpage + 1).'" class="next" title="next" 下一页››/a' : '').
($to $pages ? 'a href="'.$mpurl.'page='.$pages.'" class="last"... '.$pages.'/a' : '').
($pages $page ? 'kbdinput type="text" name="custompage" size="3" onkeydown="if(event.keyCode==13 !isNaN(this.value) ) {window.location=\''.$mpurl.'page=\'+this.value; return false;}" //kbd' : ''); $multipage = $multipage ? 'div class="pages"'.('em title="总共 '.$num.' 条记录" '.$num.' /em').$multipage.'a href="#top"回到顶部/a/div' : '';
}
return $multipage;
}效果:
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;
}
}
?
祝你成功!
网站栏目:php数据库内容分页原理 php实现分页显示
浏览路径:http://scyanting.com/article/doojsjg.html