"select id,name,email,oicq from class limit $offset,$pagesize"
这就是PHP分页的核心ASP的SQL不能这样做,但它有记录集对象,也可以实现,不过总的来说还是PHP的方法够节省资源
这就是PHP分页的核心ASP的SQL不能这样做,但它有记录集对象,也可以实现,不过总的来说还是PHP的方法够节省资源
解决方案 »
- 求助:mysql查询后翻页问题
- 如图,如何取指定时间段里面的数据?
- $_GET(name) 不加分号老报错,怎么屏蔽掉错误(服务器配置改,不要代码内的屏蔽)。
- html点击一个按钮给PHP赋值 除了 get post ajax cookie 还有什么办法
- 如何将mysql中的enum类型中全部项列出来
- 紧急求助:wampserver中80端口被占用,改为82也不行,怎么办??
- 如何将特殊字符串转化为HTML实体
- discuz 如何调用【用户登陆】提示框
- 请问session问题!!!
- 求助:开发PHP程序要用什么开发工具最好呢。
- 我做错了什么?我的phpmyadmin总说”数据库中没有数据表“ 左面明明有表.
- 连接MySql的问题,入行菜问.
//-------------------函数:LIST_PAGES()--------------------------------------------------//
//
//
// 功能:通用的分页函数
// 形参:
// $type: 分类,
// $setpage: 显示的页数,
// $setid: 显示的ID,
// $table: 处理的表名,
// $htmlname: 调用分页显示的网页名
// $index: 索引
// $classid: 分类ID;
// GLOBAL:
// $dbhost,$dbuser,$dbpasswd,$dbname; 数据库连接变量
// $list_num: 每页显示的数量
// $list_page_num:每页显示的分页
// 返回:
// 无
// 调用方法:
// list_pages($type,$setpage,$setid,$table,$htmlname,$classid,$index);
//
//------------------------------------------------------------------------------------------------------------//
function list_pages($type,$setpage,$setid,$table,$htmlname,$classid,$index)
{
global $dbhost,$dbuser,$dbpasswd,$dbname;
global $list_num,$list_page_num; if (empty($type) || $type==0)
{
$type = 0;
$istype = "";
}
else{
$istype = "WHERE $classid=".$type;
}
$sql = "SELECT COUNT(*) AS rcnt FROM $table $istype ORDER BY $index DESC";
mysql_select_db($dbname);
$result = mysql_query($sql);
$row = mysql_fetch_array($result); $num = $row['rcnt'];
if (empty($setid))
{
$setid = 0;
} $sql = "SELECT * FROM $table $istype ORDER BY $index DESC LIMIT $setid, $list_num";
mysql_select_db($dbname);
$result = mysql_query($sql);
// 计算页数
$pages = ceil($num/$list_num);
$page = ceil($pages/$list_page_num); if ($setid > 0)
{
$setpage1 = ceil($setid/$list_num);
$setpage = ceil(($setpage1+1)/$list_page_num);
}
else{
$setpage = 1;
} if ($pages > $list_page_num)
{
$pagenum = $list_page_num;
}
else{
$pagenum = $pages;
} $issetid = ceil(($setid+1)/$list_num);
$issetpage = $issetid % $list_page_num;
// 第一页
if ($setpage > 1)
{
echo "<a title='第一页' href='$htmlname?type=".$type."&setpage=1&setid=0'>[1]</a>...\n";
} // 上一列
if ($setpage>1)
{
$lastpage = $setpage-1;
$lastsetid = ($setpage-2)*$list_page_num*$list_num;
echo "<a title='上一列' href='$htmlname?type=".$type."&setpage=".$lastpage."&setid=".$lastsetid."'>[<<]</a> - \n";
} // 上一页
if ($setid > 0)
{ if ($issetpage == 1)
{
$newsetpage = $setpage-1;
}
else{
$newsetpage = $setpage;
} $presetid = $setid-$list_num;
echo "<a title='上一页' href='$htmlname?type=".$type."&setpage=".$newsetpage."&setid=".$presetid."'>[<]</a> \n";
} // 列出页
$i1 = ($setpage-1)*$list_page_num;
for ($i=$i1; $i<($i1+$pagenum) && $i<$pages; $i++)
{
$newsetid=$list_num*$i;
if (($setid/$list_num) == $i)
{
echo "<b><font color=red>[".($i+1)."]</font></b> \n";
}
else{
echo "<a href='$htmlname?type=".$type."&setpage=".$setpage."&setid=".$newsetid."'>[".($i+1)."]</a> \n";
} } // 下一页
if ($pages!=0 && ($setid/$list_num+1)!=$pages && ($setid/$list_num+1)<=$pages||$setid==1)
{
if ($list_page_num-$issetpage == 0 || $issetpage == 0)
{
$newsetpage = $setpage+1;
}
else{
$newsetpage = $setpage;
} $newsetid = $setid+$list_num;
echo "<a title='下一页' href='$htmlname?type=".$type."&setpage=".$newsetpage."&setid=".$newsetid."'>[>]</a> \n";
} // 下一列
if ($pages!=0 && $pages>$list_page_num && $setpage<$page)
{
$nextpage = $setpage+1;
$nextsetid = $setpage*$list_page_num*$list_num;
echo "- <a title='下一列' href='$htmlname?type=".$type."&setpage=".$nextpage."&setid=".$nextsetid."'>[>>]</a>\n";
} // 最后一页
if ($pages>$list_page_num && $setpage<$page)
{
$lastpage = $list_num*($pages-1);
echo "...<a title='最后一页' href='$htmlname?type=".$type."&setpage=".$page."&setid=".$lastpage."'>[".$pages."]</a>\n";
}}
//------------------------------------------ end list_pages------------------------------------------------//
如果非要我说点看法的话,我觉得在读取总记录数以取得总页数时,不要用select *,而用一个具体的最小的字段,如id。
还有,在后面的滚页的地方,不如多加一个<select></select>,这样,在页面少时可以直接跳到任何一页,而在页在多时,仅列出与当前页相邻的前后各N页就可以了。
<?
/*********************************************
以下是此分页类的所有方法:
***********************************************/
/*
构造函数 Page($SQL,$ML,$MP,$TS,$TC,$INBDRC,$INBGC)
参数:查询的SQL语句、最大行数、每次输出的页码数、输出的文本大小、文本颜色、输入框边框原色、输入框背景原
色 设置传递参数 SetPageQuery($key,$value)
参数:参数名称,参数值 读取记录,显示输出 ShowList($startpage,$t,$OF,$phpscript)
参数:输出页码的最小值、何种方式跳转的标志,数据记录集的偏移量,当前文件名
此部分参数无须给定值,调用时只需延用以下变量名称即可
*/
/*********************************************
分页显示Mysql数据库记录的类
本类需在外部打开相应的数据库。
***********************************************/
class Page {
var $MaxLine; //每页显示行数
var $MaxPage; //每次显示分页数
var $Offset; //记录偏移量
var $Total; //记录总数
var $Result; //读出的结果
var $TPages; //总页数
var $CPages; //当前页数
var $Sql;//将要执行的SQL语句
var $PageQuery; //分页显示要传递的参数
var $OutPut; //输出内容
var $TextSize;//输出文字的大小
var $TextColor;//输出文字的颜色
var $TTextColor;//当前页输出文字的颜色
var $InBdrColor;//输出文本框的边框颜色
var $InBgColor;//输出文本框的背景颜色 /******构造函数*************
参数:查询的SQL语句、最大行数、每次输出的页码数、输出的文本大小、文本颜色、输入框边框原色、输入框背景原
色
***************************/ function Page($SQL,$ML,$MP,$TS,$TC,$TTC,$INBDRC,$INBGC){
$this->Sql=urldecode($SQL);
$this->Sql=StripSlashes($this->Sql);
$this->MaxLine=$ML;
$this->MaxPage=$MP;
$this->TextSize=$TS;
$this->TextColor=$TC;
$this->TTextColor=$TTC;
$this->InBdrColor=$INBDRC;
$this->InBgColor=$INBGC;
}
//******设置传递参数************
function SetPagePara($key,$value){
$tmp[key]=$key; $tmp[value]=$value;
$this->PageQuery[]=$tmp;
}
/********读取记录,显示输出***************
参数:输出页码的最小值、何种方式跳转的标志,数据记录集的偏移量,当前文件名
此部分参数无须给定值,调用时只需延用以下变量名称即可
****************************************/
function ShowList($startpage,$t,$OF,$phpscript) {
if ($OF=="") $OF=0;
$this->Offset=$OF; //确定此次的偏移量
$querysql=$this->Sql; //分情况确定输出页码的起始值
if ($t==1) {$startpage=$startpage+$this->MaxPage;$this->Offset=($startpage-1)*$this->MaxLine;}
if ($t==2) {$startpage=$startpage-$this->MaxPage;if ($startpage<1)
{$startpage=1;}$this->Offset=($startpage-1)*$this->MaxLine;}
if ($t==3) {$this->Offset=($startpage-1)*$this->MaxLine;}
if ($startpage<1 or $startpage=="") $startpage=1; //计算此次查询结果的记录条数
$result=mysql_query($querysql);
$this->Total = mysql_num_rows($result); //把当前页的数据付给本类的对应属性,便于调用时直接使用
$sqllimit =" LIMIT ".$this->Offset." , ".$this->MaxLine;$this->Result = mysql_query($querysql.$sqllimit); $this->Tpages=ceil($this->Total/$this->MaxLine);
$this->CPages=$this->Offset/$this->MaxLine+1;
$querysql = urlencode($this->Sql); //确定输出内容,并付给本类的相应属性。
$this->OutPut="<table><form name=\"pageform\" action=$phpscript&offset=$this->Offset&querysql=$querysql><tbody><font
style=\"font-size:$this->TextSize;color:$this->TextColor\">共<b> ".$this->Tpages."</b>
页/第</font><input type=\"text\" name=\"startpage\" size=\"3\" maxlength=\"4\"
value=\"".$this->CPages."\" style=\"border:$this->InBdrColor 1pt
solid;background-color:$this->InBgColor;height:12pt;text-align: center;color:$this->TextColor\"><font
style=\"font-size:$this->TextSize;color:$this->TextColor\">页</font> \n";
$this->OutPut.="<input type=\"hidden\" name=\"t\" value=3>";
$k=count($this->PageQuery); //生成需传递的参数字符串或隐藏文本域
$strQuery="";
for($i=0;$i<$k;$i++){
$strQuery.="&".$this->PageQuery[$i][key]."=".$this->PageQuery[$i][value];
$this->OutPut.="<input type=\"hidden\" name=\"".$this->PageQuery[$i][key]."\"
value=".$this->PageQuery[$i][value].">";
}
if ($startpage>1) //若起始页大于一,则显示 [<<]
{ $this->OutPut.="<font style=\"font-size:$this->TextSize;color:$this->TextColor\">[<a
href=$phpscript&offset=$this->Offset&querysql=$querysql&startpage=$startpage&t=2$strQuery
style=\"color:$this->TextColor;text-decoration:none\"><<</a>]</font>";
}
for ($i=$startpage;$i<=$this->Tpages;$i++)
{ $offset=($i-1)*$this->MaxLine;
$ii=$i<10?'0'.$i:$i;
if($this->CPages != $i) $this->OutPut.="<font
style=\"font-size:$this->TextSize;color:$this->TextColor\">[<a
href=$phpscript&offset=$offset&querysql=$querysql&startpage=$startpage$strQuery
style=\"color:$this->TextColor;text-decoration:none\">".$ii."</a>]</font>";
else $this->OutPut.="<font style=\"color:$this->TTextColor;font-size:$this->TextSize;\">[$ii]</font>";
if ($i-$startpage>$this->MaxPage-2 and $i!=$this->Tpages) //显示 [>>]
{ $this->OutPut.="<font style=\"font-size:$this->TextSize;color:$this->TextColor\">[<a
href=$phpscript&offset=$this->Offset&querysql=$querysql&startpage=$startpage&t=1$strQuery
style=\"color:$this->TextColor;text-decoration:none\">>></a>]</font>";break;
}
}
$this->OutPut.='</tbody></form></table>';
} // end class
}
$MaxLine = 2; //每页显示行数
$MaxPage = 5; //每次显示分页数
mysql_connect('localhost','ck','ok');
mysql_select_db('nukesky');
$query = urlencode('select * from nukesky_post');
$pclass=new Page($query,$MaxLine,$MaxPage,'10pt','blue','red','black','#aaaaaa');
$phpscript=$PHP_SELF.'?name=ck';
$pclass->ShowList($startpage,$t,$offset,$phpscript);//生成输出内容,并付给相应属性
echo 'a'.$pclass -> OutPut.'b';
while($data=mysql_fetch_row($pclass->Result)){
echo"$data[1]$data[2]$data[3]";
}
?>
在原代码中在<form>的前后并没有<table>和<tbody>标签
但当输出时(不加以上两标签时,代码的倒数第5行输出),形式如下:
a共 53 页/第页 [01][02][03][04][05][>>] ba b 与输出内容之间空格太大(我对html代码不是很在行),不知有没有另外的解决方法,望哪位高手指教指教
5000行,一个 class .
//*********************************************
// 名称: 数据操作程序 v 1.2
// 脚本: php 4.2.0RC4
// 数据库: mysql 3.23.49
// 制作: [email protected]
// 完成: 2002-4-15 22:05
// 备注: 此程序中的翻页算法通用于所有数据库
// 更换数据库只需更换php数据库函数
// 需要自己定制的变量注释后面有" * "
// Copyright By 开花石头 ◎ 2001
//*********************************************
mysql_connect('localhost','root','');
mysql_select_db('myferly');//所操作的表名*
$table_name = "user_info";//处理删除程序
if(isset($cngift[0])){
for($i = 0;$i<sizeof($cngift);$i++){ $Del_Sql = "Delete from ".$table_name." where ".$sign_value."='$cngift[$i]'";
mysql_query($Del_Sql);
}
echo "<script>alert('共删除了".$i."条数据!')</script>";
}
//显示列表数目*
$PAGESIZE = 10;
//定义列表的表头(注:$table_title和table_value的顺序一定不能错)*
$table_title = array("编号","品名","单价");//定义列表显示内容的数据库字段名(注:select的值不一定都要显示)*
$table_value = array("id","username","password");//定义显示列表的sql语句的返回值*
//列表显示的值一定要写在返回值的最前面*
$return = "id,username,password";//当需要倒叙显示数据时请填写倒叙的数据库字段*
$flashback = "id";//定义sql语句中where后面的条件语句,字串中不需要写where*
//当需要id='$id'时,直接写$where = "id='$id'"*
$where = "";//定义select中的条件变量作为计算翻页时的传递变量*
//如果$where = "id='$id' and name='$name'"*
//则$impress = "id='$id'&&name='$name'";*
$impress = "";//定义进行数据操作中的参数值,一定是sql中取到的有唯一值的字段*
$sign_value = "id";$sql = "select ".$return." from ".$table_name;//处理一般列表
if($where != ""){
$sql = "select ".$return." from ".$table_name." where ".$where;
}//处理搜索
if($search_select != ""&&$search_value != ""){
$sql = "select ".$return." from ".$table_name." where ".$search_select." like '%".$search_value."%'";
if($where != ""){
$sql = "select ".$return." from ".$table_name." where ".$where." and ".$search_select." like '%".$search_value."%'";
}}//处理sql语句倒叙
if($flashback != ""){
$sql.= " order by ".$flashback." desc";
}
$query = mysql_query($sql);//翻页处理程序
//-- 总页数
$number = mysql_num_rows($query);
$sum = ceil($number / $PAGESIZE);
if (($num == "") || ($num <= 0) || ($num > $sum)){ $num = 1;}
//--开始和结束的位置
$start = $num * $PAGESIZE - $PAGESIZE + 1;
$end = $num * $PAGESIZE;
$j = 1;$table_title_num = sizeof($table_title);
$table_value_num = sizeof($table_value);
?><html>
<head>
<title>数据操作程序 v 1.2</title>
<meta content="text/html; charset=gb2312">
<script language="JavaScript">
function SelectAll(){
var items = document.cngift.elements[0];
for(var i=0;i<document.cngift.elements.length;i++){
if(document.cngift.elements[i].type != "checkbox"){
continue;}
items = document.cngift.elements[i];
if(items.name = 'cngift[]')
items.checked = true;
}
}
</Script>
</head><body bgcolor="#FFFFFF">
<form method="post" action=<?=$PHP_SELF?> name="cngift">
<table width="350" border="1" bordercolorlight="#000000" bordercolordark="#FFFFFF" cellpadding="0" cellspacing="0">
<tr>
<?php
//表头处理
for($i=0;$i<$table_title_num;$i++){
?>
<td height="20">
<div align="center"><font size="2"><?=$table_title[$i]?></font></div>
</td>
<?}?>
<td height="20">
<div align="center"><font size="2">维护操作</font></div>
</td>
<tr>
<?php while(($rs = mysql_fetch_array($query)) && ($j<=$end)){
if($j >= $start){
//内容列表
for($i=0;$i<$table_value_num;$i++){
?>
<td height="20">
<div align="center"><font size="2"><?=$rs[$i]?></font></div>
</td>
<?php
}//for end
?>
<td>
<div align="center"> <font size="2">
<input type="checkbox" name="cngift[]" value=<?=$rs[$sign_value]?>>
</font></div>
</td>
</tr>
<?php
}
$j++;
}//while end
?> <tr>
<td colspan="4">
<div align="center">
<input type="hidden" name="start_num" value=<?=$start_num?>>
<input type="hidden" name="sign_value" value=<?=$sign_value?>>
<input type="hidden" name="search_value" value=<?=$search_value?>>
<input type="hidden" name="search_select" value=<?=$search_select?>>
<input type="submit" name="Submit" value="删除" onClick="return confirm('你真的要删除所选信息?!');">
<input type=button value=全选 onClick='SelectAll()'>
<input type=reset value=全不选>
<input type=button value=版权信息 onClick="return confirm('数据操作程序 v 1.2\n\nCopyright By 开花石头 ◎ 2002\n\nEmail:[email protected]');">
</div>
</td>
</tr>
<tr>
<td colspan="4">
<div align="center"><font size="2">
<?
if($num==1){
echo "[首页] \n";
}else{
echo " <a href=?num=1&&search_select=$search_select&&search_value=$search_value&&$impress>[首页]</a> \n";
}
if($num>1){
$num--;
echo " <a href=?num=$num&&search_select=$search_select&&search_value=$search_value&&$impress>[前页]</a> \n";
$num++;
}else{
echo "[前页] \n";
}
echo " ";
if($num<$sum && $sum != 0){
$num++;
echo " <a href=?num=$num&&search_select=$search_select&&search_value=$search_value&&$impress>[后页]</a> \n";
$num--;
}else{
echo "[后页] \n";
}
if($num != $sum && $sum != 0){
echo "<a href=?num=$sum&&search_select=$search_select&&search_value=$search_value&&$impress>[末页]</a> \n";
}else{
echo "[末页] \n ";
}
echo "[当前".$num."/".$sum."页]";
?></font></div>
</td>
</tr>
</table>
</form>
<form method="post" action="">
<input type="text" name="search_value" size="15">
<select name="search_select" >
<option value="">选择检索类</option>
<?php
for($i=0;$i<$table_title_num;$i++){
//显示检索条件
echo"<option value=$table_value[$i]>$table_title[$i]</option>";
}
?>
</select>
<input type="hidden" name="start_num" value="">
<input type="submit" name="Submit" value="检索">
</form>
</html><!--
本程序为1.2版本,在1.1版本中使用了数据库的游标进行分页,有一定的局限性
在此版本中使用循环来控制分页显示,对速度与应用性有大幅提升,减少了大约70%
的代码计算量,在10万以上的数据量下测试效果很好版权信息在转载的时候必须保留,但在使用中悉听尊便,包括个人与企业
如果您发现了本程序功能与设计中的bug,请及时通知
-->