php+oracle 分页类
whxbb 于 10/12/2001 3:17:21 PM 加贴在 PHP编程
下面是分页示例程序,看起来可能比较繁琐,但其实你只要用一下就会发现,"一切原来如此简单" :)
example.php
<?php
$conn = ociplogon("test","123456","test123");
include_once "pager.inc.php";
?> <?php
/** 分页测试开始 */ // {{{ 初始分页对象
$pager = new pager();
/** 将 select id,name,age from test where age>20 order by id desc 拆分 */
$sqlArr = array('conn' => $conn, // 数据库连结
'fields' => " id,name,age ", // 查询主语句
'table' => "test", // 表名
'condition' => " age>20 ", // 查询条件
'order' => " order by id desc " // 排序方式
);
if (!$pager->listn($sqlArr,10,$page)) // 每页显示10条
{
$pager->errno = 10;
die($pager->errmsg());
}
//}}} // {{{ 数据显示
for( $i = 0; $i < count($pager->result); $i++)
{
$tmp = $pager->result[$i];
echo " id:".$tmp['ID']."<br>";
echo " name:".$tmp['NAME']."<br>";
echo " age:".$tmp['AGE']."<hr>"
}
// }}} // {{{ 显示翻页链结
echo $pager->page. " / ".$pager->totalpage." 共 ".$pager->total. "条记录 ";
if ($pager->prev != 0)
echo " <a href=$PHP_SELF?page=".$pager->prev.">上一页</a> ";
else
echo " 上一页 "; if ($pager->next != 0)
echo " <a href=$PHP_SELF?page=".$pager->next.">下一页</a> ";
else
echo " 下一页 ";
// }}}
?>
whxbb 于 10/12/2001 3:17:21 PM 加贴在 PHP编程
下面是分页示例程序,看起来可能比较繁琐,但其实你只要用一下就会发现,"一切原来如此简单" :)
example.php
<?php
$conn = ociplogon("test","123456","test123");
include_once "pager.inc.php";
?> <?php
/** 分页测试开始 */ // {{{ 初始分页对象
$pager = new pager();
/** 将 select id,name,age from test where age>20 order by id desc 拆分 */
$sqlArr = array('conn' => $conn, // 数据库连结
'fields' => " id,name,age ", // 查询主语句
'table' => "test", // 表名
'condition' => " age>20 ", // 查询条件
'order' => " order by id desc " // 排序方式
);
if (!$pager->listn($sqlArr,10,$page)) // 每页显示10条
{
$pager->errno = 10;
die($pager->errmsg());
}
//}}} // {{{ 数据显示
for( $i = 0; $i < count($pager->result); $i++)
{
$tmp = $pager->result[$i];
echo " id:".$tmp['ID']."<br>";
echo " name:".$tmp['NAME']."<br>";
echo " age:".$tmp['AGE']."<hr>"
}
// }}} // {{{ 显示翻页链结
echo $pager->page. " / ".$pager->totalpage." 共 ".$pager->total. "条记录 ";
if ($pager->prev != 0)
echo " <a href=$PHP_SELF?page=".$pager->prev.">上一页</a> ";
else
echo " 上一页 "; if ($pager->next != 0)
echo " <a href=$PHP_SELF?page=".$pager->next.">下一页</a> ";
else
echo " 下一页 ";
// }}}
?>
解决方案 »
- PHP的生命周期 opcode缓存 什么是php的词典扫描?
- 求如何终止ignore_user_abort()
- apache rewrite 重写 字符串
- 有关header函数的问题
- 奇怪的问题,在phpmyadmin里却没错的sql语句,在自己写的php代码里执行就出错了。
- 我问一个问题: Discuz! 1.03 提示只能有13个注册用户同时在线,这是怎么回事?要改哪里才不会提示?谢谢!
- 服务器上运行PHP程序
- 请问: 关于提交列表框.
- 连接异地ORACLE?
- 如果register_globals = off~~~~~~??
- PHP中有多线程方面的对象或者函数吗?
- oracle数据库记录指针定位问题!(高分求解)
whxbb 发表于 2001-10-12 15:20 PHP编程 ←返回版面 <?php
//
// +----------------------------------------------------------------------+
// | 分页 |
// | Authors: whxbb([email protected]) |
// +----------------------------------------------------------------------+
//
// $Id: pager.class.php,v 1.0 2001/10/10 13:31:57 whxbb Exp $
// /** 出错信息 */
$PAGE_CLASS_ERROR = array( 1 => '3001:获取总纪录数失败',
2 => '3002:获取总纪录数失败',
5 => '3005:列表失败',
6 => '3006:列表失败',
7 => '3007:记录为空'
);
/**
* Purpose
* 分页
* @author:whxbb([email protected])
* @version 0.1
* @access public
*/ class pager
{
/** 总纪录数 */
var $total;
/** 总页数 */
var $totalpage;
/** 当前页 */
var $page ;
/** 前页 */
var $prev = 0;
/** 后页 */
var $next = 0;
/** 每页显示 */
var $items;
/** 错误号 */
var $errno = 0;
/** 结果集 */
var $result;
function page()
{
} function nextpage()
{
$this->next = $this->page + 1;
if ($this->next > $this->totalpage)
$this->next = 0;
} function prevpage()
{
$this->prev = $this->page - 1;
if ($this->prev <= 0)
$this->prev = 0;
} /**
* 列出纪录
* @param $sqlArr sql语句数组
* conn 数据库连结
* fields 主语句 id, name, age
* table 表名 clients
* condition 查询条件 id >50 and name like '%y%'
* order 排序方式 order by age desc
* @param $items 每页显示的条数
* @param $page 当前页码
* @return 出错或没有纪录 false
* 成功 关联数据,存贮纪录结果
*/
function listn($sqlArr,$items,$page)
{
$this->items = $items;
/** 得到总纪录数 */
$this->getTotal($sqlArr);
/** 得到总页数 */
$this->totalpage = ceil($this->total / $this->items); if ($page == 0 || $page == '')
$page = 1;
if ($page > $this->totalpage)
$page = $this->totalpage;
$this->page = $page; $this->nextpage();
$this->prevpage(); /** 获取分页查询语句 */
$query = $this->gensql($sqlArr); $stmt = @OCIParse($sqlArr['conn'], $query);
if (!$stmt)
{
$this->errno = 5;
return false;
}
if (!@OCIExecute($stmt))
{
$this->errno = 6;
return false;
}
$i = 0;
while(@OCIFetchInto($stmt, &$tmpArr[$i], OCI_ASSOC))
{
$arr[$i] = $tmpArr[$i];
$i++;
} if ($i == 0)
{
$this->errno = 7;
return false;
}
$this->result = $arr;
@OCIFreeStatement($stmt);
return true;
} /**
* 得到纪录总数
* @param $sqlArr
* @see listn()
* @access public
*/
function getTotal($sqlArr)
{
$condition = $sqlArr['condition']; if ($condition != ''){
$condition = " where ".$condition.' ';
} $query = "select count(*) from " .$sqlArr['table'].$condition;
$stmt = @OCIParse($sqlArr['conn'], $query);
if (!$stmt)
{
$this->errno = 1;
return false;
}
if(!@OCIExecute($stmt))
{
$this->errno = 2;
return false;
}
@OCIFetch($stmt);
$this->total = @OCIResult($stmt, 1);
@OCIFreeStatement($stmt);
return true;
}
/**
* 生成分页查询语句
* @param $sqlArr 查询语句
* @return string $query
* @see listn()
*/
function gensql($sqlArr) {
$condition = $sqlArr['condition'];
if ($condition != '') {
$condition = " where ".$condition.' ';
} $start = ($this->page - 1) * $this->items + 1;
$end = $start + $this->items; $query = " select ".$sqlArr['fields']." from ";
$tmpQuery = $query.$sqlArr['table'].$condition.$order;
$query = $query." (".$tmpQuery.") where rownum < $end "." minus ".$query." (".$tmpQuery.") where rownum < $start ";
return $query;
} /**
* 得到错误信息
* @access public
* @return error msg string or false
*/
function errmsg()
{
global $PRIZE_CLASS_ERROR;
if ($this->errno == 0)
return false;
else
return $PRIZE_CLASS_ERROR[$this->errno];
}
}
?>
php+oracle 分页类
whxbb 发表于 2001-10-12 15:17 PHP编程 ←返回版面
下面是分页示例程序,看起来可能比较繁琐,但其实你只要用一下就会发现,"一切原来如此简单" :)
example.php
<?php
$conn = ociplogon("test","123456","test123");
include_once "pager.inc.php";
?> <?php
/** 分页测试开始 */ // {{{ 初始分页对象
$pager = new pager();
/** 将 select id,name,age from test where age>20 order by id desc 拆分 */
$sqlArr = array('conn' => $conn, // 数据库连结
'fields' => " id,name,age ", // 查询主语句
'table' => "test", // 表名
'condition' => " age>20 ", // 查询条件
'order' => " order by id desc " // 排序方式
);
if (!$pager->listn($sqlArr,10,$page)) // 每页显示10条
{
$pager->errno = 10;
die($pager->errmsg());
}
//}}} // {{{ 数据显示
for( $i = 0; $i < count($pager->result); $i++)
{
$tmp = $pager->result[$i];
echo " id:".$tmp['ID']."<br>";
echo " name:".$tmp['NAME']."<br>";
echo " age:".$tmp['AGE']."<hr>"
}
// }}} // {{{ 显示翻页链结
echo $pager->page. " / ".$pager->totalpage." 共 ".$pager->total. "条记录 ";
if ($pager->prev != 0)
echo " <a href=$PHP_SELF?page=".$pager->prev.">上一页</a> ";
else
echo " 上一页 "; if ($pager->next != 0)
echo " <a href=$PHP_SELF?page=".$pager->next.">下一页</a> ";
else
echo " 下一页 ";
// }}}
?> <?@OCILogoff($conn)?> 一些问题
whxbb 发表于 2001-10-12 15:36 PHP编程 ←返回版面 1 缺少一个sql语法拆析函数 parse()
自动将 "select id, name, age from test where age>20 order by id desc" 拆开,这样初始化 pager 时就用不着那么麻烦了 理想情况应该是这样:
$query = "select id, name, age from test where age>20 order by id desc";
$pager->listn($query,10,$page); 2 执行效率
本分页程序使用的查询方式如下:
"select id,name,age from (select id, name, age from test where age>20 order by id desc) where rownu<10 minus select id,name,age from (select id, name, age from test where age>20 order by id desc) where rownu<1)"
效率似乎不是很高,谁能提供别的好些的分页方式?