导航:首页 > 编程语言 > php分页器下载

php分页器下载

发布时间:2023-01-17 11:19:47

❶ 唯一的30分呀,求php 结果集分页 (isset($_GET['page'])) 里面的isseet; 是什么意思

首先回答你$_GET['page']是怎么来的:看到上一页和下一页前面的代码了吗(<a href='?page=$prev'>)?$_GET['page']就是由page=$prev而来的,当你点击上一页或者下一页是浏览器地址栏最末尾就会出现"page=xxx"的字样,$_GET['page']就是取得page等号后面的值。
再来说说isset,isset是PHP的一个函数,用来检测变量是否存在,isset($_GET['page'])就是检测$_GET['page']是否存在。

❷ php分页功能怎么实现

php本身是没有分页概念的,分页是URL传参,然后通过mysql查询语句到数据库获取数据,然后实现的分页,url上的参数,通过PHP的$_GET都是可以获取到的。
现在市面上的PHP框架基本都有PHP分页类,参照文档直接调用就好了,如果想看实现过程,可以去下载一个TP框架,然后打开里面的分页类查看里面的源代码。

❸ PHP 模拟登陆后如何抓取分页页面信息

curl基本特性

❹ 云南java培训学校告诉你学习PHP程序开发的路线和建议

学习PHP程序开发是一个循序渐进的过程,PHP学习是容易的,浅显易懂,不过IT技术是需要用心的推敲和持续实践的。零基础的想学好PHP不用担心,下面IT培训http://www.kmbdqn.cn/讲讲PHP的学习路线和建议。

一、学习PHP程序开发先要了解HTML/CSS/JS、网页基本元素,做到可自己制作容易的网页,了解元素属性。网站是由网页构成的,如果想制作网站,要先学习做网页,学会静态网页的制作技术是学习开发网站的先决条件。因此要学习HTML,为以后制作网站打基础。学习HTML要边学边实践所有元素,清楚各元素起什么作用后,便会深刻记忆。


二、学习PHP程序开发解析动态语言概念及运做机制,了解基础PHP语法。当能够独立完成静态页面,就可以着手了解动态语言,起初会有众多不解,学习运用专用的语法结构就能让任何的解析器工作了。


三、学习PHP程序开发研究怎样使PHP、HTML结合,实现简易动态页面。弄明白HTML和PHP的概念。


四、学习PHP程序开发接触学习MySQL,开始设计数据库。MySQL是PHP的伴侣,要战胜这个数据库,领会数据库的概念后,要试着先用PHP来衔接数据库,再用PHP成功的插入,删除和更新数据。


五、学习PHP程序开发连续加强PHP语法,了解PHP常用的函数,清楚面向对象编程,MySQL优化和一些模板、结构。试着做个简单的留言本。如果能够把表单的数据插入数据库后展现出来,那么一个程序的幼形就降生了。不过,还需再加强知识,掌握PHP和MySQL开发的方法后,回顾留言本,或许会心中存疑那不是你写的!此时,要整理下留言本,加入注册和分页的功能,加强UI。


❺ thinkphp 分页接口怎么写

很多人初学thinkphp时,不太熟悉thinkphp的分页使用方法,现在将自己整理的分页方法分享下,有需要的朋友可以看看。

控制器中的代码:

$db = M("cost");
$where = "查询条件";

$count = $db->where($where)->count();

$pagecount = 20;

$page = new \Think\Page($count , $pagecount);

$page->parameter = $row; //此处的row是数组,为了传递查询条件

$page->setConfig('first','首页');

$page->setConfig('prev','上一页');

$page->setConfig('next','下一页');

$page->setConfig('last','尾页');

$page->setConfig('theme','%FIRST% %UP_PAGE% %LINK_PAGE%
%DOWN_PAGE% %END% 第 '.I('p',1).' 页/共 %TOTAL_PAGE% 页 (
'.$pagecount.' 条/页 共 %TOTAL_ROW% 条)');

$show = $page->show();

$list = $db->where($where)->order('id
desc')->limit($page->firstRow.','.$page->listRows)->select();

$this->assign('list',$list);

$this->assign('page',$show);

$this->display();

模版中调用代码:

<**div class="pagelist">{$page}<**/div**>

//博客中会过滤DIV标签,请将上面一句话中的**去除,再使用

附带分页样式:

.pagelist{ text-align:center; background:#f1f1f1; padding:7px
0;}

.pagelist a{ margin:0 5px; border:#6185a2 solid 1px;
display:inline-block; padding:2px 6px 1px; line-height:16px;
background:#fff; color:#6185a2;}

.pagelist span{ margin:0 5px; border:#6185a2 solid 1px;
display:inline-block; padding:2px 6px 1px; line-height:16px;
color:#6185a2; color:#fff; background:#6185a2;}

❻ 在php中如何对多条记录进行分页

方法一:讲sql查询进行分页进行,需要调用几个函数,具体见脚本:
1.pager.class.php

<?php

class pager {
public $sql; //SQL查询语句
public $datanum; //查询所有的数据总记录数
public $page_size; //每页显示记录的条数
protected $_errstr;
protected $_conn;
protected $_query_id;

public function query($query)///这个函数有问题,暂时可以不用
{
$ret = false;
if (!empty($query)) {
if ($this->_conn === false || !is_resource($this->_conn)) {
warningLog(__METHOD__ . ': query sql with no connection', true);
return false;
}
$this->_query_id = @mysql_query($query, $this->_conn);
if ($this->_query_id === false) {
$this->_errstr = @mysql_error();
$ret = false;
} else {
$this->_errstr = 'SUCCESS';
$ret = $this->_query_id;
}
}
$msg = ($ret === false) ? 'false' : strval($ret);
debugLog(__METHOD__.": [$msg] returned for sql query [$query]");
return $ret;
}
function __construct($sql,$page_size) {
$result = mysql_query($sql);
$datanum = mysql_num_rows($result);
$this->sql=$sql;
$this->datanum=$datanum;
$this->page_size=$page_size;
}

//当前页数
public function page_id() {
if($_SERVER['QUERY_STRING'] == ""){
return 1;
}elseif(substr_count($_SERVER['QUERY_STRING'],"page_id=") == 0){
return 1;
}else{
return intval(substr($_SERVER['QUERY_STRING'],8));
}
}

//剩余url值
public function url() {
if($_SERVER['QUERY_STRING'] == ""){
return "";
}elseif(substr_count($_SERVER['QUERY_STRING'],"page_id=") == 0){
return "&".$_SERVER['QUERY_STRING'];
}else{
return str_replace("page_id=".$this->page_id(),"",$_SERVER['QUERY_STRING']);
}
}

//总页数
public function page_num() {
if($this->datanum == 0){
return 1;
}else{
return ceil($this->datanum/$this->page_size);
}
}
//数据库查询的偏移量
public function start() {
return ($this->page_id()-1)*$this->page_size;
}

//数据输出
public function sqlquery() {
return $this->sql." limit ".$this->start().",".$this->page_size;
}

//获取当前文件名
private function php_self() {
return $_SERVER['PHP_SELF'];
}

//上一页
private function pre_page() {
if ($this->page_id() == 1) { //页数等于1
return "<a href=".$this->php_self()."?page_id=1".$this->url().">上一页</a> ";
}elseif ($this->page_id() != 1) { //页数不等于1
return "<a href=".$this->php_self()."?page_id=".($this->page_id()-1).$this->url().">上一页</a> ";
}
}

//显示分页
private function display_page() {
$display_page = "";
if($this->page_num() <= 10){ //小于10页
for ($i=1;$i<=$this->page_num();$i++) //循环显示出页面
$display_page .= "<a href=".$this->php_self()."?page_id=".$i.$this->url().">".$i."</a> ";
return $display_page;
}elseif($this->page_num() > 10){ //大于10页
if($this->page_id() <= 6){
for ($i=1;$i<=10;$i++) //循环显示出页面
$display_page .= "<a href=".$this->php_self()."?page_id=".$i.$this->url().">".$i."</a> ";
return $display_page;
}elseif(($this->page_id() > 6) && ($this->page_num()-$this->page_id() >= 4)){
for ($i=$this->page_id()-5;$i<=$this->page_id()+4;$i++) //循环显示出页面
$display_page .= "<a href=".$this->php_self()."?page_id=".$i.$this->url().">".$i."</a> ";
return $display_page;
}elseif(($this->page_id() > 6) && ($this->page_num()-$this->page_id() < 4)){
for ($i=$this->page_num()-9;$i<=$this->page_num();$i++) //循环显示出页面
$display_page .= "<a href=".$this->php_self()."?page_id=".$i.$this->url().">".$i."</a> ";
return $display_page;
}
}
}

//下一页
private function next_page() {
if ($this->page_id() < $this->page_num()) { //页数小于总页数
return "<a href=".$this->php_self()."?page_id=".($this->page_id()+1).$this->url().">下一页</a> ";
}elseif ($this->page_id() == $this->page_num()) { //页数等于总页数
return "<a href=".$this->php_self()."?page_id=".$this->page_num().$this->url().">下一页</a> ";
}
}

// 设置分页信息
public function set_page_info() {
$page_info = "共".$this->datanum."条 ";
$page_info .= "<a href=".$this->php_self()."?page_id=1".$this->url().">首页</a> ";
$page_info .= $this->pre_page();
$page_info .= $this->display_page();
$page_info .= $this->next_page();
$page_info .= "<a href=".$this->php_self()."?page_id=".$this->page_num().$this->url().">尾页</a> ";
$page_info .= "第".$this->page_id()."/".$this->page_num()."页";
return $page_info;
}

}
?>

2.脚本2:

<?php
//类的用法
// 读取分页类
include("pager.class.php");
// 数据库连接初始化
// $db = new mysql();
$impeach_host = '10.81.43.139';
$impeach_usr = 'vmtest15';
$impeach_passwd = 'vmtest15';
$impeach_name = 'ufeature';
$impeach_con = mysql_connect($impeach_host, $impeach_usr, $impeach_passwd) or
die("Can't connect ".mysql_error());
mysql_select_db($impeach_name, $impeach_con);
// 这是一个sql查询语句,并得到查询结果
$sql = "select word from ufeature.spam_accuse_word_list where flag='0'";
// 分页初始化
$page = new pager($sql,20);
// 20是每页显示的数量
// $res_1 = mysql_query($sql) or
// die("Can't get result ".mysql_error());

$result=mysql_query($page->sqlquery());
while($info = mysql_fetch_array($result,MYSQL_ASSOC)){

// while($info = mysql_fetch_array($res_1, MYSQL_ASSOC)){
echo $info["word"]."<br/>";
}
// 页码索引条
echo $page->set_page_info();

?>

方法二:使用ajax的方法
1、首先了解SQL语句中的limit用法

SELECT * FROM table …… limit 开始位置 , 操作条数 (其中开始位置是从0开始的)

例子
取前20条记录:SELECT * FROM table …… limit 0 , 20
从第11条开始取20条记录:SELECT * FROM table …… limit 10 , 20
LIMIT n 等价于 LIMIT 0,n。
如select * from table LIMIT 5; //返回前5行,和select * from table LIMIT 0,5一样
2、分页原理
所谓分页显示,也就是讲数据库中的结果集,一段一段显示出来
怎么分段,当前在第几段 (每页有几条,当前再第几页)
前10条记录:select * from table limit 0,10
第11至20条记录:select * from table limit 10,10
第21至30条记录:select * from table limit 20,10
分页公式:
(当前页数 - 1 )X 每页条数 , 每页条数

Select * from table limit ($Page- 1) * $PageSize, $PageSize

3、$_SERVER["REQUEST_URI"]函数
预定义服务器变量的一种,所有$_SERVER开头的都叫做预定于服务器变量。
REQUEST_URI的作用是取得当前URI,也就除域名外后面的完整的地址路径。
例子:
当前页为:http://www.test.com/home.php?id=23&cid=22
echo $_SERVER["REQUEST_URI"]
结果为:/home.php?id=23&cid=22
4、parse_url()解析URL函数
parse_url() 是讲URL解析成有固定键值的数组的函数
例子

$ua=parse_url("http://username:password@hostname/path?arg=value#anchor");
print_r($ua);

结果:

Array
(
[scheme] => http ;协议
[host] => hostname ;主机域名
[user] => username ;用户
[pass] => password ;密码
[path] => /path ;路径
[query] => arg=value ;取参数
[fragment] => anchor ;
)

5、代码实例
这个一个留言的分页,分为3个部分,一个是数据库设计,一个是连接页面,一个是显示页面。
(1)设计数据库
设计数据库名为bbs,有一个数据表为message,里面包含title,lastdate,user,content等字段,分别表示留言标题,留言日前,留言人,留言的内容
(2)连接页面

<?php
$conn = @ mysql_connect("localhost", "root", "123456") or die("数据库链接错误");
mysql_select_db("bbs", $conn);
mysql_query("set names 'GBK'"); //使用GBK中文编码;
//将空格,换行转换为HTML可解析
function htmtocode($content) {
$content = str_replace("\n", "<br>", str_replace(" ", " ", $content)); //两个str_replace嵌套
return $content;
}
//$content=str_replace("'","‘",$content);
//htmlspecialchars();

?>

(3)显示页面

<?php
include("conn.php");
$pagesize=2; //设置每页显示2个记录
$url=$_SERVER["REQUEST_URI"];
$url=parse_url($url);
$url=$url[path];

$numq=mysql_query("SELECT * FROM `message`");
$num = mysql_num_rows($numq);
if($_GET){
$pageval=$_GET;
$page=($pageval-1)*$pagesize;
$page.=',';
}
if($num > $pagesize){
if($pageval<=1)$pageval=1;
echo "共 $num 条".
" <a href=$url?page=".($pageval-1).">上一页</a> <a href=$url?page=".($pageval+1).">下一页</a>";
}
$SQL="SELECT * FROM `message` limit $page $pagesize ";
$query=mysql_query($SQL);

while($row=mysql_fetch_array($query)){
?>
<table width=500 border="0" cellpadding="5" cellspacing="1" bgcolor="#add3ef">
<tr bgcolor="#eff3ff">
<td>标题:<?php echo $row[title]?></td> <td>时间:<?php echo $row[lastdate]?></td>
</tr>
<tr bgcolor="#eff3ff">
<td> 用户:<?php echo $row[user]?></td><td></td>
</tr>
<tr>
<td>内容:<?php echo htmtocode($row[content]);?></td>
</tr>
<br>
</table>
<?php
}
?>

方法3:
<script>
function viewpage(p){
if(window.XMLHttpRequest){
var xmlReq = new XMLHttpRequest();
} else if(window.ActiveXObject) {
var xmlReq = new ActiveXObject('Microsoft.XMLHTTP');
}
var formData = "page="+p;
xmlReq.onreadystatechange = function(){
if(xmlReq.readyState == 4){
document.getElementByIdx_x('content2').innerHTML = xmlReq.responseText;
}
}
xmlReq.open("post", "hotel_list.php", true);
xmlReq.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xmlReq.send(formData);
return false;
}
</script>

脚本2:

header("Content-Type:text/html;charset=GB2312");
$pagesize=10;
//echo $_POST['page'];
$result = mysql_query("Select count(DISTINCT hotelname) FROM ".TBL_HOTELS);
$myrow = mysql_fetch_array($result);
$numrows=$myrow[0];

$pages=intval($numrows/$pagesize);
if ($numrows%$pagesize)
$pages++;
if (isset($_POST['page'])){
$page=intval($_POST['page']);
}
else{
//设置为第一页
$page=1;
}
$first=1;
$prev=$page-1;
$next=$page+1;
$last=$pages;
//计算记录偏移量
$offset=$pagesize*($page - 1);
//读取指定记录数
$result=mysql_query("select `hotelname` , count( * ) from ".TBL_HOTELS." GROUP BY `hotelname` order by id desc limit $offset,$pagesize");
$num = mysql_num_rows($result);
while ($row = mysql_fetch_array($result,MYSQL_NUM)) {
$hotelname[] = $row[0];
$countpeople[] = $row[1];
}
for($a=0;$a<$num;$a++)
{
//$result=mysql_query("select count(title) from " . TBL_Comments ." where `title`=\"".$title[$a]."\"");
//$row = mysql_fetch_row($result);
echo "<TABLE style=\"MARGIN-BOTTOM: 20px\" cellSpacing=0 cellPadding=0 width=100% border=0>\n";
echo "<TBODY>\n";
echo "<TR>\n";
echo "<TD style=\"PADDING-TOP: 5px\" vAlign=top align=left width=80>\n";
//rating_bar($title[$a],5);
echo "</TD>\n";
echo "<TD style=\"PADDING-TOP: 5px\" align=left width=100%><A title=$hotelname[$a] style=\"FONT-SIZE: 14px\" href=#>$hotelname[$a]</A>\n";
echo "</TD></TR>\n";
echo " <TR>\n";
echo "<TD></TD>\n";
echo "<TD style=\"PADDING-LEFT: 0px\">\n";
echo "<IMG src=\"images/comment.gif\" border=0> 推荐人数:($countpeople[$a]) |\n";
echo "<SPAN>平均分:<STRONG></STRONG> (".$count."票) | 评论数:()</SPAN>\n";
echo "</TD></TR></TBODY></TABLE>\n";
}
echo "<TABLE style=\"MARGIN-TOP: 30px\" cellSpacing=0 cellPadding=0 width=\"100%\"";
echo "border=0>";
echo "<TBODY><TR><TD colSpan=3 height=20>";
echo "<DIV align=center>";
echo "<P align=left><FONT color=red>第".$page."页/总".$pages."页 | 总".$numrows."条</FONT> | ";
if ($page>1) echo "<a onclick=\"viewpage(".$first.")\" href='#'>首页</a> | ";
if ($page>1) echo "<a onclick=\"viewpage(".$prev.")\" href='#'>上页</a> | ";
if ($page<$pages) echo "<a onclick=\"viewpage(".$next.")\" href='#'>下页</a> | ";
if ($page<$pages) echo "<a onclick=\"viewpage(".$last.")\" href='#'>尾页</a>";
echo "转到第 <INPUT maxLength=3 size=3 value=1 name=goto_page> 页 <INPUT hideFocus onclick=\"viewpage(document.all.goto_page.value)\" type=button value=Go name=cmd_goto>";
echo "</P></DIV></TD></TR></TBODY></TABLE>";

❼ ThinkPHP 怎么结合Bootstrap进行分页

这个问题最好去thinkPHP官网问一下,

我是这样做的。

首先下载 ThinkPHP 的分页类,然后修改 分页类代码,使之返回的字符串符合Bootstrap分页布局格式,然后通过控制器将分页数据扔给模板就好了。当然不用改分页类,通过js前端修改dom也是没问题的。

额,不知道你有没有懂我的意思。算了,贴一段代码好了。我找找看

下面是一个tp的分页类(tp3.2版的。我已经修改过了,把这个放到ORG下,创建个Page类,然后在控制器类中创建分页实例,返回数据。)

额,算了。你先看吧,有问题再说

<?php
/**
*分页Page.class.php
**/
classPage{
//分页栏每页显示的页数
public$rollPage=6;

//页数跳转时要带的参数
public$parameter;
//分页URL地址
public$url='';

//需要分页的数据总数
public$totalRows;
//每页的数据显示数
public$everyPageRow;
//分页数
protected$pageNum;
//当前页数
protected$p;

//分页使用的字符串
public$pageStr;


//----------------------------------------
//分页总页面数


/**
*构造函数
*@accesspublic
*@paramarray$totalRows总的记录数
*@paramarray$listRows每页显示记录数
*@paramarray$parameter分页跳转的参数
*/
function__construct($count,$unit,$url='',$parameter='p')
{
$this->totalRows=$count;
$this->everyPageRow=$unit;
$this->url=$url;
$this->parameter=$parameter;
$this->pageNum=ceil($this->totalRows/$this->everyPageRow);

$p=$_GET[$this->parameter];
if(empty($p)||$p<=0){
$p=1;
}elseif($p>$this->pageNum){
$p=$this->pageNum;
}
$this->p=$p;
}
publicfunctionshow(){
$pgStr='';
$pp=intval($this->pageNum/$this->rollPage);
$activePP=intval(($this->p-1)/$this->rollPage);

if($this->p!=1){
$pgStr.="<li><ahref='".$this->url.'/'.$this->parameter.'/'.($this->p-1)."'>".上一页."</a></li>";
}
if($activePP>0){
$pgStr.="<li><ahref='".$this->url.'/'.$this->parameter.'/'.($this->p-$this->rollPage)."'>".上.$this->rollPage.页."</a></li>";
}
//具体分页编码
if($activePP<$pp&&$activePP>=0){
for($i=$activePP*$this->rollPage;$i<($activePP+1)*$this->rollPage;$i++){
if($i==($this->p-1)){
$pgStr.="<liclass='active'><ahref='javascript:;'>".($i+1)."</a></li>";
}else{
$pgStr.="<li><ahref='".$this->url.'/'.$this->parameter.'/'.($i+1)."'>".($i+1)."</a></li>";
}
}
}else{
for($i=$activePP*$this->rollPage;$i<$this->pageNum;$i++){
if($i==($this->p-1)){
$pgStr.="<liclass='active'><ahref='javascript:;'>".($i+1)."</a></li>";
}else{
$pgStr.="<li><ahref='".$this->url.'/'.$this->parameter.'/'.($i+1)."'>".($i+1)."</a></li>";
}
}
}

if($this->p!=$this->pageNum){
$pgStr.="<li><ahref='".$this->url.'/'.$this->parameter.'/'.($this->p+1)."'>".下一页."</a></li>";
}
if($activePP<$pp){
$pgStr.="<li><ahref='".$this->url.'/'.$this->parameter.'/'.($this->p+$this->rollPage)."'>".下.$this->rollPage.页."</a></li>";
}
if($activePP<$pp){
$pgStr.="<li><ahref='".$this->url.'/'.$this->parameter.'/'.($this->pageNum)."'>".最后一页."</a></li>";
}

return$pgStr;
}
}
?>


❽ php新手,我下载了一个无刷新分页插件,不知道怎么使用啊

无刷新分页 都是用 ajax技术来做的,
所以你要先找到js在哪处理的分页加载(ajax调用请求数据),还有一个php的接口(用于返回数据)

❾ PHP+MySQL高效的分页方法,如何优化LIMIT,OFFSET进行的分页

很多应用往往只展示最新或最热门的几条记录,但为了旧记录仍然可访问,所以就需要个分页的导航栏。然而,如何通过MySQL更好的实现分页,始终是比较令人头疼的问题。虽然没有拿来就能用的解决办法,但了解数据库的底层或多或少有助于优化分页查询。

我们先从一个常用但性能很差的查询来看一看。

SELECT *
FROM city
ORDER BY id DESC
LIMIT 0, 15

这个查询耗时0.00sec。So,这个查询有什么问题呢?实际上,这个查询语句和参数都没有问题,因为它用到了下面表的主键,而且只读取15条记录。

CREATE TABLE city (
id int(10) unsigned NOT NULL AUTO_INCREMENT,
city varchar(128) NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB;

真正的问题在于offset(分页偏移量)很大的时候,像下面这样:

SELECT *
FROM city
ORDER BY id DESC
LIMIT 100000, 15;

上面的查询在有2M行记录时需要0.22sec,通过EXPLAIN查看SQL的执行计划可以发现该SQL检索了100015行,但最后只需要15行。大的分页偏移量会增加使用的数据,MySQL会将大量最终不会使用的数据加载到内存中。就算我们假设大部分网站的用户只访问前几页数据,但少量的大的分页偏移量的请求也会对整个系统造成危害。Facebook意识到了这一点,但Facebook并没有为了每秒可以处理更多的请求而去优化数据库,而是将重心放在将请求响应时间的方差变小。

对于分页请求,还有一个信息也很重要,就是总共的记录数。我们可以通过下面的查询很容易的获取总的记录数。

SELECT COUNT(*)
FROM city;

然而,上面的SQL在采用InnoDB为存储引擎时需要耗费9.28sec。一个不正确的优化是采用 SQL_CALC_FOUND_ROWS,SQL_CALC_FOUND_ROWS 可以在能够在分页查询时事先准备好符合条件的记录数,随后只要执行一句 select FOUND_ROWS(); 就能获得总记录数。但是在大多数情况下,查询语句简短并不意味着性能的提高。不幸的是,这种分页查询方式在许多主流框架中都有用到,下面看看这个语句的查询性能。

SELECT SQL_CALC_FOUND_ROWS *
FROM city
ORDER BY id DESC
LIMIT 100000, 15;

这个语句耗时20.02sec,是上一个的两倍。事实证明使用 SQL_CALC_FOUND_ROWS 做分页是很糟糕的想法。
下面来看看到底如何优化。文章分为两部分,第一部分是如何获取记录的总数目,第二部分是获取真正的记录。

高效的计算行数

如果采用的引擎是MyISAM,可以直接执行COUNT(*)去获取行数即可。相似的,在堆表中也会将行数存储到表的元信息中。但如果引擎是InnoDB情况就会复杂一些,因为InnoDB不保存表的具体行数。

我们可以将行数缓存起来,然后可以通过一个守护进程定期更新或者用户的某些操作导致缓存失效时,执行下面的语句:

SELECT COUNT(*)
FROM city
USE INDEX(PRIMARY);

获取记录

下面进入这篇文章最重要的部分,获取分页要展示的记录。上面已经说过了,大的偏移量会影响性能,所以我们要重写查询语句。为了演示,我们创建一个新的表“news”,按照时事性排序(最新发布的在最前面),实现一个高性能的分页。为了简单,我们就假设最新发布的新闻的Id也是最大的。

CREATE TABLE news(
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(128) NOT NULL
) ENGINE=InnoDB;

一个比较高效的方式是基于用户展示的最后一个新闻Id。查询下一页的语句如下,需要传入当前页面展示的最后一个Id。

SELECT *
FROM news WHERE id < $last_id
ORDER BY id DESC
LIMIT $perpage

查询上一页的语句类似,只不过需要传入当前页的第一个Id,并且要逆序。

SELECT *
FROM news WHERE id > $last_id
ORDER BY id ASC
LIMIT $perpage

上面的查询方式适合实现简易的分页,即不显示具体的页数导航,只显示“上一页”和“下一页”,例如博客中页脚显示“上一页”,“下一页”的按钮。但如果要实现真正的页面导航还是很难的,下面看看另一种方式。

SELECT id
FROM (
SELECT id, ((@cnt:= @cnt + 1) + $perpage - 1) % $perpage cnt
FROM news
JOIN (SELECT @cnt:= 0)T
WHERE id < $last_id
ORDER BY id DESC
LIMIT $perpage * $buttons
)C
WHERE cnt = 0;

通过上面的语句可以为每一个分页的按钮计算出一个offset对应的id。这种方法还有一个好处。假设,网站上正在发布一片新的文章,那么所有文章的位置都会往后移一位,所以如果用户在发布文章时换页,那么他会看见一篇文章两次。如果固定了每个按钮的offset Id,这个问题就迎刃而解了。Mark Callaghan发表过一篇类似的博客,利用了组合索引和两个位置变量,但是基本思想是一致的。

如果表中的记录很少被删除、修改,还可以将记录对应的页码存储到表中,并在该列上创建合适的索引。采用这种方式,当新增一个记录的时候,需要执行下面的查询重新生成对应的页号。

SET p:= 0;
UPDATE news SET page=CEIL((p:= p + 1) / $perpage) ORDER BY id DESC;

当然,也可以新增一个专用于分页的表,可以用个后台程序来维护。

UPDATE pagination T
JOIN (
SELECT id, CEIL((p:= p + 1) / $perpage) page
FROM news
ORDER BY id
)C
ON C.id = T.id
SET T.page = C.page;

现在想获取任意一页的元素就很简单了:

SELECT *
FROM news A
JOIN pagination B ON A.id=B.ID
WHERE page=$offset;

还有另外一种与上种方法比较相似的方法来做分页,这种方式比较试用于数据集相对小,并且没有可用的索引的情况下—比如处理搜索结果时。在一个普通的服务器上执行下面的查询,当有2M条记录时,要耗费2sec左右。这种方式比较简单,创建一个用来存储所有Id的临时表即可(这也是最耗费性能的地方)。

CREATE TEMPORARY TABLE _tmp (KEY SORT(random))
SELECT id, FLOOR(RAND() * 0x8000000) random
FROM city;

ALTER TABLE _tmp ADD OFFSET INT UNSIGNED PRIMARY KEY AUTO_INCREMENT, DROP INDEX SORT,ORDER BY random;

接下来就可以向下面一样执行分页查询了。

SELECT *
FROM _tmp
WHERE OFFSET >= $offset
ORDER BY OFFSET
LIMIT $perpage;

简单来说,对于分页的优化就是。。。避免数据量大时扫描过多的记录。

❿ php分页问题。。求助。。。

好好读读代码 这次我把代码写了一遍,你在你本地调试一下!回头在网上下载一个中文手册,这是必备的东西,有用的很!

<?php
require_once 'inc.php'; 数据库链接文件
pagesize = 30;
$url = $_SERVER["REQUEST_URI"];
$url = parse_url($url);
$url = $url[path];
$result = mysql_query("SELECT * FROM `Maillist`");
$num = mysql_num_rows($result);
if ($_GET[page] == null || $_GET[page] == 0) {
$pageval = 1;
} else {
$pageval = $_GET[page];
}
$lastpage = round($num / $pagesize +0.5);

if ($num > $pagesize) {
if ($pageval <= 1)
$pageval = 1;
echo "<a href=$url?page=1> 首页 </a>" . "<a href=$url?page=" . ($pageval -1) . ">上一页</a> <a href=$url?page=" . ($pageval +1) . ">下一页</a>" . "?" . "<a href=$url?page=" . $lastpage . "> 尾 页 </a>" . "共 $num 条记录" . " 30条/页" . "第 $pageval 页";
} else
echo "<a href=$url?page=1> 首页 </a>" . "<a href=$url?page=" . ($pageval -1) . ">上一页</a> <a href=$url?page=" . ($pageval +1) . ">下一页</a>" . "?" . "<a href = $url?page = " . $lastpage . ">尾 页 </a>" . "共 $num 条记录" . " 30条/页" . " 第 $pageval 页";
$sql = "SELECT * FROM Maillist" . ($pageval -1) * $pagesize . ",$pagesize";
$query = mysql_query($sql);

while ($rs = mysql_fetch_array($query)) {
?>

<form action="" method="GET" >
<td width="761" valign="top"><table width="92%" border="0" cellpadding="3" cellspacing="1" bgcolor="#D7D7FF">
<tr>
<td width="18%" align="center" class="tinymenutextblock">编号</td>
<td width="16%" align="center" class="tinymenutextblock">姓名</td>
<td width="66%" align="center" class="tinymenutextblock">邮件地址 </td>
</tr>

<tr>
<td bgcolor="#FFFFFF"><?php echo $rs['ID']?></td>
<td bgcolor="#FFFFFF"><?php echo $rs['UserName']?></td>
<td bgcolor="#FFFFFF"><?php echo $rs['UserMail']?></td>
</tr>
</form>
<?php
}
?>

阅读全文

与php分页器下载相关的资料

热点内容
拍卖程序员 浏览:101
电脑的图片放在哪个文件夹 浏览:274
unsignedintjava 浏览:216
编译器下载地址 浏览:42
什么是面对对象编程 浏览:708
b站服务器什么时候恢复 浏览:721
6p相当于安卓机什么水准 浏览:498
能否给隐藏相册加密 浏览:596
糖心app改什么名 浏览:823
战地1控服务器如何部署 浏览:394
xp还原系统输入命令 浏览:323
mysql命令行版本 浏览:305
如何进入itunes找文件夹 浏览:833
CAD中重复命令使用 浏览:479
心智pdf 浏览:476
网站电台直播间源码 浏览:854
文件夹14c和18c的区别 浏览:36
android隐式调用 浏览:668
plc的编程指令边沿继电器 浏览:724
voc文件夹 浏览:866