Posts Tagged ‘页显’

JSP数据库操数据分页显示

星期一, 06月 2nd, 2008

<%@ page contentType=”text/html;charset=8859_1″ %>
<%
//变量声明
java.sql.Connection sqlCon; //数据库连接对象
java.sql.Statement sqlStmt; //SQL语句对象
java.sql.ResultSet sqlRst; //结果集对象
java.lang.String strCon; //数据库连接字符串
java.lang.String strSQL; //SQL语句
int intPageSize; //一页显示de记录数
int intRowCount; //记录总数
int intPageCount; //总页数
int intPage; //待显示页码
java.lang.String strPage;
int i;
//设置一页显示de记录数
intPageSize = 2;
//取得待显示页码
strPage = request.getParameter(”page”);
if(strPage==null){//表明在QueryString中没有page这一个参数,此时显示第一页数据
intPage = 1;
}
else{//将字符串转换成整型
intPage = java.lang.Integer.parseInt(strPage);
if(intPage<1) intPage = 1;
}
//装载JDBC驱动程序
java.sql.DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
//设置数据库连接字符串
strCon = “jdbc:oracle:thin:@linux:1521:ora4cweb”;
//连接数据库
sqlCon = java.sql.DriverManager.getConnection(strCon,”hzq”,”hzq”);
//创建一个可以滚动de只读deSQL语句对象
sqlStmt = sqlCon.createStatement(java.sql.ResultSet.TYPE_SCROLL_INSENSITIVE,java.sql.ResultSet.CONCUR_READ_ONLY);
//准备SQL语句
strSQL = “select name,age from test”;
//执行SQL语句并获取结果集
sqlRst = sqlStmt.executeQuery(strSQL);
//获取记录总数
sqlRst.last();
intRowCount = sqlRst.getRow();
//记算总页数
intPageCount = (intRowCount intPageSize-1) / intPageSize;
//调整待显示de页码
if(intPage>intPageCount) intPage = intPageCount;
%>
<html>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=gb2312″>
<title>JSP数据库操作例程 - 数据分页显示 - JDBC 2.0 - Oracle</title>
</head>
<body>
<table border=”1″ cellspacing=”0″ cellpadding=”0″>
<tr>
<th>姓名</th>
<th>年龄</th>
</tr>
<%
if(intPageCount>0){
//将记录指针定位到待显示页de第一条记录上
sqlRst.absolute((intPage-1) * intPageSize 1);
//显示数据
i = 0;
while(i<intPageSize && !sqlRst.isAfterLast()){
%>
<tr>
<td><%=sqlRst.getString(1)%></td>
<td><%=sqlRst.getString(2)%></td>
</tr>
<%
sqlRst.next();
i ;
}
}
%>
</table>
第<%=intPage%>页 共<%=intPageCount%>页 <%if(intPage<intPageCount){%><a href=”jdbc20-oracle.jsp?page=<%=intPage 1%>”>下一页</a><%}%> <%if(intPage>1){%><a href=”jdbc20-oracle.jsp?page=<%=intPage-1%>”>上一页</a><%}%>
</body>
</html>
<%
//关闭结果集
sqlRst.close();
//关闭SQL语句对象
sqlStmt.close();
//关闭数据库
sqlCon.close();
%>

用PHP实现ODBC数据分页显示一例

星期一, 06月 2nd, 2008

$pagesize = 2; //一页显示记录数
$con = odbc_connect("access_test","","",SQL_CUR_USE_ODBC) or die("无法连接ODBC数据源access_test"); //连接一个ODBC数据源
$sql = "select count(*) as total from test"; //取得记录总数SQL语句
$rst = odbc_exec($con,$sql) or die("$sql查询出错"); //执行取得记录总数SQL语句
$recordcount = odbc_result($rst,1); //取得记录总数,在这里也可以用$recordcount = odbc_result($rst,"total");
odbc_free_result($rst); //释放资源
$pagecount = bcdiv($recordcount $pagesize-1,$pagesize,0); //算出总页数
if(!isset($page)) $page = 1; //如果没有指定显示页码,缺省为显示第一页
if($page<1) $page = 1; //如果页码比1小,则显示第一页
if($page>$pagecount) $page = $pagecount; //如果页码比总页数大,则显示最后一页
if($page>0){ //页码比0大,表示有数据
echo ‘>> 分页 ‘;
echo ‘<a href="’ . $PHP_SELF . ‘?page=1">首页</a> ‘;
if($page>1){
echo ‘<a href="’ . $PHP_SELF . ‘?page=’. ($page-1) . ‘">前页</a> ‘;
}
else{
echo ‘前页 ‘;
}
if($page<$pagecount){
echo ‘<a href="’ . $PHP_SELF . ‘?page=’. ($page 1) . ‘">后页</a> ‘;
}
else{
echo ‘后页 ‘;
}
echo ‘<a href="’ . $PHP_SELF . ‘?page=’ . $pagecount . ‘">尾页</a> ‘;
echo ‘页次: ‘ . $page . ‘/’ . $pagecount . ‘页 ‘;
echo $pagesize . ‘条/页 ‘;
echo ‘共’ . $recordcount . ‘条 ‘;
$sql = "select * from test"; //取得数据SQL语句
$rst = odbc_exec($con,$sql) or die("$sql查询出错"); //执行取得数据SQL语句
$fieldcount = odbc_num_fields($rst); //取得字段总数
echo ‘<table border="1" cellspacing="0" cellpadding="0">’;
echo ‘<tr>’;
for($i=1;$i<=$fieldcount;$i ){
echo ‘<th>’ . odbc_field_name($rst,$i) . ‘</th>’; //显示第$i个字段名
}
echo ‘</tr>’;
$rowi = ($page-1)*$pagesize 1;
for($i=0;$i<$pagesize;$i ){
echo ‘<tr>’;
if($rowi>$recordcount){
for($j=0;$j<$fieldcount;$j ){
echo ‘<td> </td>’;
}
}
else{
odbc_fetch_into($rst,$rowi,&$row);
for($j=0;$j<$fieldcount;$j ){
$field = $row[$j];
if($field==”) $field = ‘ ‘;
echo ‘<td>’ . $field . ‘</td>’;
}
$rowi = $rowi 1;
}
echo ‘</tr>’;
}
echo ‘</table>’;
odbc_free_result($rst); //释放资源
}
else{
echo "无数据";
}
odbc_close($con); //关闭连接并释放资源
?>

用ODBC的分页显示

星期一, 06月 2nd, 2008

<?php

$pagesize = 3;//设置每页显示数目
//计算总记录数
$rs_num = "select count(*) as id from table";
$rs_num = odbc_exec($conn_id,$rs_num);
$rs_num = odbc_result($rs_num,"id");
//计算总页数
$pagecount = $rs_num / $pagesize;
$pagecount1 = intval($pagecount);//将总页数取整
$compare = $pagecount - $pagecount1;
switch ($compare){
case "0":
$pagecount = $pagecount1;//总页数
break;
default :
$pagecount1 ;
$pagecount = $pagecount1;//总页数
break;
};
if ($pagecount == 0)$pagecount ;

$fpages = $pages-1;
$bpages = $pages 1;

?>
<table>
<tr>
<td>
共<?php echo $pagecount ?>页
<?php if($pages != 1)echo "<a href=show.php3?pages=1>";?>首页<?php if($pages != 1)echo "</a>"; ?>
<?php if($pages != 1)echo "<a href=show.php3?pages=".$fpages.">"; ?>前页<?php if($pages != 1)echo "</a>"; ?>
<?php if($pages != $pagecount)echo "<a href=show.php3?pages=".$bpages.">"; ?>后页<?php if($pages != $pagecount)echo "</a>"; ?> <?php if($pages != $pagecount)echo "<a href=show.php3?pages=".$pagecount.">"; ?>
尾页<?php if($pages != $pagecount)echo "</a>"; ?>
</td>
</tr></table>
<?php
$firstshow = ($pages-1)*$pagesize 1;//确定每页de第一条记录
//找出第一条记录de记录号
$query_string = "SELECT * FROM table Order By id DESC";
$query_string = odbc_exec($conn_id,$query_string);
odbc_fetch_into($query_string,$firstshow,&$idarea);
$idsql = $idarea[0];
//定位查找
if ($pages == $pagecount) {
$rs = "SELECT * FROM table where id <= ‘".$idsql."’ Order By id DESC";
}else{
$rs = "SELECT Top ".$pagesize." * FROM table where id <= ‘".$idsql."’ Order By id DESC";
};
$rs = odbc_exec($conn_id,$rs);
//显示记录
while(odbc_fetch_row($rs)){

};
?>
<?php
//关闭连接
odbc_close($conn_id);
?>

【本文版权归作者与奥索网共同拥有,如需转载,请注明作者及出处】

复杂检索数据并分页显示的处理方法

星期一, 06月 2nd, 2008

系统标题:复杂检索数据并分页显示de处理方法
系统功能:利用临时表检索数据库数据,然后分页显示de方法:
处理方法:采用临时表存放数据中间结果,根据中间结果显示数据
数据de显示采用隔行de方式处理
处理优点:对于复杂de查询,特别是涉及到多表de数据查询,如果直接使用查询条件,系统de
开销将很大,利用临时表把数据先保存,然后处理.这样对数据库de查询只要开销一次.
使用方法:只要把连接数据库de用户信息和数据表改变即可使用
<?
//连接数据库
$dbh = mysql_connect(’localhost:3306′,’root’,”);
mysql_select_db(’test’);
//把数据检索de结果保存到临时表中
$ls_sql = ‘ create temporary table temps ‘;
$ls_sql .= ‘ select lk_title,lk_link from lk_t_content ‘;
$ls_sql .= " where lk_title like ‘%".$searchcontent."%’ ";
$res = mysql_query($ls_sql, $dbh);
//得到检索数据de总数
$ls_sql = ’select count(*) as rcnt_con from temps ‘;
$res = mysql_query($ls_sql, $dbh);
$rcon = $row["rcnt_con"];
$pages=ceil($rcon / 20); //$pages变量现在总de页数
if (empty($offset)) {
$offset=1;
$curline = 0;
} else
$curline = ($offset - 1) * 20;
//打印表头
print ‘<table width="100%" border="0">’;
print ‘<tr class="text"> <td width="50%"> <div align="center">’;
if ($offset <> 1) { //如果偏移量是0,不显示前一页de链接
$newoffset=$offset - 1;
print "<a href=’$PHP_SELF?offset=$newoffset’>前一页</a>";
} else {
print "前一页";
print " ";
}
//显示所有de页数
for ($i=1; $i <= $pages; $i ) {
$temps = "<a href=’".$PHP_SELF.’?offset=’.$i."’>".$i."</a>";
print $temps;
print " ";
}
//检查是否是最后一页
if ($pages!=0 && $offset!=$pages) {
$newoffset=$offset 1;
print "<a href=’$PHP_SELF?offset=$newoffset’>下一页</a>";
} else print "下一页";
print ‘</div> </td>’;
print ‘<td width="50%"> <div align="center">’;
print "当前页:".$offset." 共".$pages."页";
print ‘</div> </td>’;
print "</table>";
//显示查询信息
print ‘<table width="100%" border="1">’;
print ‘<tr class="text"> ‘;
print ‘<td width="100%"> <div align="center">查询结果信息</div> </td>’;
print ‘</tr>’;
$query = "select lk_title,lk_link from temps order by lk_title desc LIMIT ".$curline.",20";
$res = mysql_query($query, $dbh);
$li_num = 0;
while ($row = mysql_fetch_array($res)) {
//采用隔行显示de方法显示信息内容
if ($li_number == 0) {
<tr bgcolor="#dedede">
$li_number = 1;
} else {
<tr bgcolor="#ededed">
$li_number = 0;
}
$tempstr = "<a href=’".$row[lk_link]."’>".$row['lk_title']."</a>";
print ‘<td width="100%" height="15" class="text"> ‘.$tempstr.’</td>’;
print ‘</tr>’;
}
print "</table>";
?>
—————————-
欢迎访问:zhangcg.oso.com.cn

Php SqlServer实现分页显示

星期一, 06月 2nd, 2008

<html><body><table border=1>
<?
$id=@mssql_connect("ddy","sa"," ") or die("连接不上");
$db=mssql_select_db("ddy",$id);
$query="select * from lr00 order by lr0012 desc";
$result=mssql_query($query);
if($result):
if($tt==""){
$nopa=0;}
else $nopa=$tt;
$gg=mssql_num_rows($result);
echo $gg;
$k=0;
$i=0;
$dd=mssql_fetch_array($result);
if(!$dd){echo ‘到底了’;}
while($dd&&$nopa<=$gg&&$i<3){
if($nopa>=$gg) $nopa=$gg;
@mssql_data_seek($result,$nopa);
$dd=@mssql_fetch_array($result);
if($dd){$nopa ;$i ;
echo "<br>";
echo $dd[1]; }
}
endif;
?></table>
<?if($nopa<$gg){?>
<a href=fenye2.php?tt=<?echo $nopa 1;?>>下一页</a></body></html><?}?>

PHP分页显示制作详细讲解

星期一, 06月 2nd, 2008

1、前言

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

2、原理

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

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

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

前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=10de时候取表内每一页数据desql语句,我可以总结出这样一个模板:

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

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

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

<?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 ){ //取总数据量除以每页数de余数
$page_count = (int)($amount / $page_size) 1; //如果有余数,则页数等于总数据量除以每页数de结果取整再加一
}else{
$page_count = $amount / $page_size; //如果没有余数,则页数等于总数据量除以每页数de结果
}
}
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();
}
// 没有包含显示结果de相关代码,那不在讨论范围,只要用foreach就可以很简单de用得到de二维数组来显示结果
?>

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

<?php
// FileName: Pager.class.php
// 分页类,这个类仅仅用于处理数据结构,不负责处理显示de工作
Class Pager
{
var $PageSize; //每页de数量
var $CurrentPageID; //当前de页数
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;
}
/***
*
* 返回结果集de数据库连接
* 在结果集比较大de时候可以直接使用这个方法获得数据库连接,然后在类之外遍历,这样开销较小
* 如果结果集不是很大,可以直接使用getPageDatade方式获取二维数组格式de结果
* getPageData方法也是调用本方法来获取结果de
*
***/
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;
}
}
/***
*
* 以二维数组de格式返回结果集
*
***/
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
// 这是一段简单de示例相关代码,前边省略了使用pear db类建立数据库连接de相关代码
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>”;
}
?>

需要说明de地方有两个:

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

<?php
Class MemberPager extends Pager
{
function showMemberList()
{
global $db;
$data = $this->getPageData();
// 显示结果de相关代码
// ……
}
}
/// 调用
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();
?>

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

ok,写完收功,希望花时间看完这些文字de您不觉得是浪费了时间.

分页显示Oracle数据库记录的类之二

星期一, 06月 2nd, 2008

//——————————–
// 工作函数
//——————————–
//读取记录
//主要工作函数,根据所给de条件从表中读取相应de记录
//返回值是一个二维数组,Result[记录号][字段名]
function ReadList() {
$SQL=”SELECT * FROM “.$this->Table.” “.$this->Condition.” ORDER BY “.$this->Id.” DESC”;
$stmt = OCIParse($this->LinkId,$SQL);
$bool = OCIExecute($stmt);
if (!$bool) {
echo “连接失败!”;
OCILogoff($this->LinkId);
exit;
}
else {
$ncols = OCINumCols($stmt);
for ( $i = 1; $i <= $ncols; $i )
$column_name[$i] = OCIColumnName($stmt,$i);
$k=0;
for($j=0;$j<$this->StartRec $this->Offset;$j ) OCIFetch($stmt);
for($j=0;$j<$this->MaxLine;$j ){
if(OCIFetch($stmt)){
$k ;
for($i=1;$i<=$ncols;$i )
$temp[$column_name[$i]]=OCIResult($stmt,$i);
$this->Result[]=$temp;
}
else break;
}
$this->Number=$k;
}
OCIFreeStatement($stmt);
return $this->Result;
}
//读最新de记录
//topnum指定要读出de记录数
function ReadTopList($topnum){
$SQL=”SELECT * FROM “.$this->Table.” “.$this->Condition.” ORDER BY “.$this->Id.” DESC”;
$stmt = OCIParse($this->LinkId,$SQL);
$bool = OCIExecute($stmt);
if (!$bool) {
echo “连接失败!”;
OCILogoff($this->LinkId);
exit;
}
else {
$ncols = OCINumCols($stmt);
for ( $i = 1; $i <= $ncols; $i )
$column_name[$i] = OCIColumnName($stmt,$i);
$k=0;
for($j=0;$j<$topnum;$j ){
if(OCIFetch($stmt)){
$k ;
for($i=1;$i<=$ncols;$i )
$temp[$column_name[$i]]=OCIResult($stmt,$i);
$this->TopResult[]=$temp;
}
else break;
}
$this->TopNumber=$k;
}
OCIFreeStatement($stmt);
return $this->TopResult;

}
//—————————
// 分页相关
//—————————
//显示当前页及总页数
//本函数在GetPage()后调用.
function ThePage() {
echo “第”.$this->CPages.”页/共”.$this->TPages.”页”;
}
//显示翻页按钮
//此函数要在GetPage()函数之后调用
//显示下页、上页,并加上要传递de参数
function Page() {
$k=count($this->PageQuery);
$strQuery=”"; //生成一个要传递参数字串
for($i=0;$i<$k;$i ){
$strQuery.=”&”.$this->PageQuery[$i][key].”=”.$this->PageQuery[$i][value];
}
return $strQuery;
}
function PrePage($strQuery){
$prev=$this->Offset-$this->MaxLine;
if($prev>=0)
echo “<A href=$PHP_SELF?offset=”.$prev.$strQuery.” class=newslink>上一页</A>”;
else if($this->TheFirstPage!=NULL)
echo “<A href=”.$this->TheFirstPage.” class=newslink>上一页</A>”;
else echo “上一页”;
}
function NexPage($strQuery){
$next=$this->Offset $this->MaxLine;
$k=$this->Total-$this->StartRec;
if($next<$k)
echo “<A href=$PHP_SELF?offset=”.$next.$strQuery.” class=newslink>下一页</A>”;
else
echo “下一页”;
}
//————————————
// 记录分组
//———————————-
//显示分组
function NumPage() {
$first=($this->CGroup-1)*($this->PGroup) 1;
$last=($first $this->PGroup > $this->TPages)? ($this->TPages 1):($first $this->PGroup);
$pr=($this->CGroup-2>=0)?( ($this->CGroup-2)*($this->PGroup) 1 ):(-1);
$prev=($pr!=-1)?( ($pr-1)*$this->MaxLine):(0);
$ne=($this->CGroup*$this->PGroup 1<=$this->TPages)?($this->CGroup*$this->PGroup 1):(-1);
$next=($ne!=-1)?( ($ne-1)*$this->MaxLine):(0);
$k=count($this->PageQuery);
$strQuery=”"; //生成一个要传递参数字串
for($i=0;$i<$k;$i ){
$strQuery.=”&”.$this->PageQuery[$i][key].”=”.$this->PageQuery[$i][value];
}
if($first!=1)
echo “<A href=$PHP_SELF?offset=”.$prev.$strQuery.” > << </a>”;
for($i=$first;$i<$last;$i ) {
if($this->CPages!=$i){
$current=($i-1)*$this->MaxLine;
echo “<A href=$PHP_SELF?offset=”.$current.$strQuery.” >”.$i.”</a> “;
}
else echo “<font color=#e00729>”.$i.”</font> “;
}
if($ne!=-1)
echo “<A href=$PHP_SELF?offset=”.$next.$strQuery.” > >> </a>”;
}
//******end class
}
?>

分页显示Oracle数据库记录的类之一

星期一, 06月 2nd, 2008

<?php
/*********************************************
TOracleViewPagev 2.0
日期:2000-9-23
分页显示Oracle数据库记录de类

更新日期:2000-10-19
增加显示TopRecordde功能,允许第一页显示de记录数与其它页不同.
作者:sharetop
email:ycshowtop@21cn.com
***********************************************/
class TOracleViewPage {
var $Table; //表名
var $MaxLine; //每页显示行数
var $LinkId; //数据库连接号
var $Id; //排序参考字段
var $Offset; //记录偏移量
var $Total; //记录总数
var $Number; //本页读取de记录数
var $TopNumber;//读新记录时实际取出de记录数
var $Result; //读出de结果
var $TopResult;//读新记录时de结果
var $TheFirstPage;//特殊指定第一页de链接
var $StartRec; //指定第二页de起始记录号
var $TPages; //总页数
var $CPages; //当前页数
var $TGroup;
var $PGroup; //每页显示de页号个数
var $CGroup;
var $Condition; //显示条件 如:where id=’$id’ order by id desc
var $PageQuery; //分页显示要传递de参数
//————————————-
// 以下构造函数、析构函数及初始化函数
//————————————-
//构造函数
//参数:表名、最大行数、分页参考de字段、每页显示de页号数
function TOracleViewPage($TB,$ML,$id){
global $offset;
$this->Table=$TB;
$this->MaxLine=$ML;
$this->Id=$id;
$this->StartRec=0;
if(isset($offset)) $this->Offset=$offset;
else $this->Offset=0;
$this->Condition=”";
$this->TheFirstPage=NULL;
$this->PageQury=NULL;
}
//初始化
//参数:用户名、密码、数据库
function InitDB($user,$password,$db){
if (PHP_OS == “WINNT”) $dllid=dl(”php3_oci80.dll”);
$this->LinkId = OCILogon($user,$password,$db);
}
//断开
function Destroy(){
OCILogoff($this->LinkId);
}
//————————-
// Set 函数
//————————-
//设置显示条件
//如:where id=’$id’ order by id desc
//要求是字串,符合SQL语法(本字串将加在SQL语句后)
function SetCondition($s){
$this->Condition=$s;
}
//设置每组de显示个数
function SetNumGroup($pg){
$this->PGroup=$pg;
}
//设置首页,如无则为NULL
function SetFirstPage($fn){
$this->TheFirstPage=$fn;
}
//设置起始记录,如无则取默认0
function SetStartRecord($org){
$this->StartRec=$org;
}
//设置传递参数
// key参数名 value参数值
// 如:setpagequery(”id”,$id);如有多个参数要传递,可多次调用本函数.
function SetPageQuery($key,$value){
$tmp[key]=$key; $tmp[value]=$value;
$this->PageQuery[]=$tmp;
}
//——————————–
// Get 函数
//——————————–
//取记录总数
function GetTotalRec(){
$SQL=”SELECT Count(*) AS total FROM “.$this->Table.” “.$this->Condition;
$stmt = OCIParse($this->LinkId,$SQL);
$bool = OCIExecute($stmt);
if (!$bool) {
echo “连接失败!”;
OCILogoff($this->LinkId);
exit;
}
else {
OCIFetch($stmt);
$this->Total=OCIResult($stmt,1);
}
OCIFreeStatement($stmt);
}
//取总页数、当前页
function GetPage(){
$this->TPages=ceil($this->Total/$this->MaxLine);
$this->CPages=ceil($this->Offset/$this->MaxLine) 1;
}
//取总组数、当前组
function GetGroup() {
$this->TGroup=ceil($this->TPages/$this->PGroup);
$this->CGroup=ceil($this->CPages/$this->PGroup);
}

PHP应用分页显示制作详细讲解

星期一, 06月 2nd, 2008

  1、前言

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

  2、原理

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

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

  现在只要再给我一个结果集,我就可以显示某段特定de结果出来.

  至于其他de参数,比如:上一页($PreviousPageID)、下一页($NextPageID)、总页数($numPages)等等,都可以根据前边这几个东西得到.

  以mysql数据库为例,如果要从表内截取某段内容,sql语句可以用:select * from table limit offset, rows.看看下面一组sql语句,尝试一下发现其中de规率.

  前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=10de时候取表内每一页数据desql语句,我可以总结出这样一个模板:

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

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

  3、简单相关代码

  请详细阅读以下相关代码,自己调试运行一次,最好把它修改一次,加上自己de功能,比如搜索等等.

<?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 ){ //取总数据量除以每页数de余数
   $page_count = (int)($amount / $page_size) 1; //如果有余数,则页数等于总数据量除以每页数de结果取整再加一
  }else{
   $page_count = $amount / $page_size; //如果没有余数,则页数等于总数据量除以每页数de结果
  }
 }
 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();
 }
 // 没有包含显示结果de相关代码,那不在讨论范围,只要用foreach就可以很简单de用得到de二维数组来显示结果
?>

  4、OO风格相关代码

  以下相关代码中de数据库连接是使用depear db类进行处理

<?php
 // FileName: Pager.class.php
 // 分页类,这个类仅仅用于处理数据结构,不负责处理显示de工作
 Class Pager
 {
  var $PageSize; //每页de数量
  var $CurrentPageID; //当前de页数
  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;
  }

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

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

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

  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
// 这是一段简单de示例相关代码,前边省略了使用pear db类建立数据库连接de相关代码
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>”;
}
?>

  需要说明de地方有两个:

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

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

  $data = $this->getPageData();
  // 显示结果de相关代码
  // ……
 }
}
/// 调用
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();
?>

  第二个需要说明de地方就是不同数据库de兼容性,在不同de数据库里截获一段结果de写法是不一样de.

mysql: select * from table limit offset, rows
pgsql: select * from table limit m offset n
……

  所以要在类里边获取结果de时候需要使用pear db类delimitQuery方法.