php和mssql 2005,mysql分页
首先说下分页的思路:
单独写一个分页类,只需要根据浏览器地址栏传入的参数输出页码栏即可,一般不把数据查询放在分页类中,便于通用,效果如:
可以根据用户的选择跳转,当然是配合分页类进行的,分页类如:


<?php
/*
*分页导航显示类
*weiyan(2006-12-5)
*/
class page_link{
var $page;//当前页码;
var $firstcount; //(数据库)查询的起始项;
var $total; //数据总数
var $displaypg;//每页显示数据条数
var $get_txt; //页码标示字段
var $url;//页面地址
var $lastpg;////最后页,也是总页数
function page_link($total,$displaypg=30,$get_txt='page',$url=''){
$lastpg=ceil($total/$displaypg);
$this->lastpg=$lastpg;
$this->page=($_GET[$get_txt]=='')?1:min($_GET[$get_txt],$lastpg);
$this->total=$total;
$this->displaypg=$displaypg*$this->page;
$this->get_txt=$get_txt;
$this->url=($url=='')?$_SERVER["REQUEST_URI"]:$url;
$this->firstcount=($this->page-1)*$displaypg;
// echo '当前页'.$this->page.'<br>';
// echo '起始页'.$this->firstcount.'<br>';
// echo '终止'.$this->displaypg.'<br>';
// echo '总数'.$total.'<br>';
}
//url网址处理函数:URL后加页码查询信息待赋值
function get_new_url(){
$url=$this->url;
$parse_url=parse_url($url);
$url_query=$parse_url["query"]; //单独取出URL的查询字串
if($url_query){
//因为URL中可能包含了页码信息,我们要把它去掉,以便加入新的页码信息。
$url_query=ereg_replace("(^|&)".$this->get_txt."=[0-9]+","",$url_query);
//将处理后的URL的查询字串替换原来的URL的查询字串:
$new_url=str_replace($parse_url["query"],$url_query,$url);
//在URL后加page查询信息,但待赋值
if($url_query)$new_url.="&".$this->get_txt; else $new_url.=$this->get_txt;
}else {
$new_url=$url."?".$this->get_txt;
}
return $new_url;
}
////输出分页导航条代码:
function show_link(){
$pagenav="显示第 <B>".($this->total?($this->firstcount+1):0)."</B>-<B>".min($this->firstcount+$this->displaypg,$this->total)."</B> 条记录,共 $this->total 条记录 ";
//如果多于一页:
if($this->lastpg >1){
$prepg=$this->page-1; //上一页
$nextpg=($this->page==$this->lastpg ? 0 : $this->page+1); //下一页
$url=$this->get_new_url();
$pagenav.="<a href='$url=1'>第一页</a> ";
if($prepg) $pagenav.=" <a href='$url=$prepg'>上一页</a> "; else $pagenav.=" 上一页 ";
if($nextpg) $pagenav.=" <a href='$url=$nextpg'>下一页</a> "; else $pagenav.=" 下一页 ";
$pagenav.=" <a href='$url=$this->lastpg'>末页</a> ";
//下拉跳转列表,循环列出所有页码:
$pagenav.=" 到第 <select name='topage' size='1' onchange='javascript:window.location=\"$url=\"+this.value'>\n";
for($i=1;$i<=$this->lastpg;$i++){
if($i==$this->page) $pagenav.="<option value='$i' selected>$i</option>\n";
else $pagenav.="<option value='$i'>$i</option>\n";
}
$pagenav.="</select> 页,共 $this->lastpg 页";
}
return $pagenav;
}
}
?>
界面代码如:


<html>
<head>
<title></title>
</head>
<body>
<table border="1">
<?php
require('mssql.classs.php');
require 'page.php';
$sql = 'select * from TBL_TOPIC';
$result = $dbHelper->exec($sql);
$total = $dbHelper->num_rows($result);//得到总页数
$page=new page_link($total,10);
$sql='select * from (
select ROW_NUMBER()over(order by topicId) as RowNumber,TBL_TOPIC.* from TBL_TOPIC)as t
where RowNumber between '.$page->firstcount.' and '. $page->displaypg;//使用2005自带的行号进行分页,得到分好的结果集
$result = $dbHelper->exec($sql);
//echo $sql;
//echo '<br>';
//echo $page->firstcount;
//echo '<br>';
//$page->firstcount,$page->displaypg
while ($rows=$dbHelper->fetch_array($result))
{
echo '<tr><td>'.$rows['topicId'].'</td>';
echo '<td>'.$rows['title'].'</td></tr>';
}
$str="<table border='0' align='center'><tr><td >".$page->show_link()."</td></tr></table>";//??????????
echo $str;
?>
</table>
</body>
</html>
顺便附上MSSQL的数据库访问类:


<?php
CLASS DB{
private $dbhost = 'localhost';
private $dbname = 'myschool';
private $dbuser = 'sa';
private $dbpass = '000';
private $dblink = false;
private $errsql;
public function __construct(){
$this->dblink = @mssql_pconnect($this->dbhost,$this->dbuser,$this->dbpass) or die($this->halt());
@mssql_select_db($this->dbname,$this->dblink);
}
/**
* 执行SQL语句
*
* @param string $sql 语句
* @return 查询结果
*/
public function exec($sql){
$this->errsql = $sql;
$query = mssql_query($sql) or die($this->halt());
return $query;
}
/**
* 返回按列名访问的数组,包含一条数据
*
* @param unknown_type $query 查询结果
* @param unknown_type $result_type
* @return unknown
*/
public function fetch_array($query,$result_type = MSSQL_ASSOC){
$row = mssql_fetch_array($query,$result_type);
return $row;
}
/**
* 返回按索引访问的数组,包含一条数据
*
* @param unknown_type $query 查询结果
* @param unknown_type $result_type
* @return unknown
*/
public function fetch_row($query,$result_type = MSSQL_ASSOC){
$row = mssql_fetch_row($query,$result_type);
return $row;
}
/**
* 返回影响行数
*
* @return 影响行数
*/
public function affected_rows(){
return mssql_rows_affected($this->dblink) or die ($this->halt());
}
/**
* 返回总行数
*
* @param unknown_type $query 查询结果
* @return 总行数
*/
public function num_rows($query){
return mssql_num_rows($query);
}
public function free_result($query) {
return @mssql_free_result($query) or die($this->halt());;
}
/**
* 返回最后一个自增值
*
* @return 自增值
*/
public function Last_id(){
$query = $this->query("SELECT @@IDENTITY as last_insert_id");
$row = $this->fetch($query);
$this->free_result($query);
return $row['last_insert_id'];
}
public function seek($query,$offset){
@mssql_data_seek($query,$offset) or die($this->halt());;
}
public function halt(){
$error = mssql_get_last_message();
return 'MsSQL Error: '.$error."<br>".$this->errsql;
}
public function get_one($sql){
$query = $this->exec($sql);
$row = $this->fetch($query);
$this->free_result($query);
return $row;
}
/**
* 关闭连接
*
*/
public function close() {
mssql_close();
}
}
$dbHelper=new DB;
?>
下面讨论PHP+MYSQL分页
其实和上面的原理一样,仅仅只是使用的函数不同而已,先附上MYSQL数据库访问类:


<?php
/**
* mysql查询类
*
*/
class dbQuery {
/**
* 查询总次数
*
* @var int
*/
var $querynum = 0;
/**
* 连接句柄
*
* @var object
*/
var $link;
// private $dbhost='localhost';
// private $dbuser = 'root';
// private $dbpw = 'mysql';
// private $dbname='guestbook';
/**
* 构造函数
*
* @param string $dbhost 主机名
* @param string $dbuser 用户
* @param string $dbpw 密码
* @param string $dbname 数据库名
* @param int $pconnect 是否持续连接
*/
function dbQuery($dbhost, $dbuser, $dbpw, $dbname = '', $pconnect = 0) {
if($pconnect) {
if(!$this->link = @mysql_pconnect($dbhost, $dbuser, $dbpw)) {
$this->halt('Can not connect to MySQL server');
}
} else {
if(!$this->link = @mysql_connect($dbhost, $dbuser, $dbpw)) {
$this->halt('Can not connect to MySQL server');
}
}
if($this->version() > '4.1') {
global $dbcharset;
if($dbcharset) {
mysql_query("SET character_set_connection=$dbcharset, character_set_results=$dbcharset, character_set_client=binary", $this->link);
}
if($this->version() > '5.0.1') {
mysql_query("SET sql_mode=''", $this->link);
}
}
if($dbname) {
mysql_select_db($dbname, $this->link);
}
}
/**
* 选择数据库
*
* @param string $dbname
* @return
*/
function select_db($dbname) {
return mysql_select_db($dbname, $this->link);
}
/**
* 取出结果集中一条记录
*
* @param object $query
* @param int $result_type
* @return array
*/
function fetch_array($query, $result_type = MYSQL_ASSOC) {
return mysql_fetch_array($query, $result_type);
}
/**
* 查询SQL
*
* @param string $sql
* @param string $type
* @return object
*/
function query($sql, $type = '') {
$func = $type == 'UNBUFFERED' && @function_exists('mysql_unbuffered_query') ?
'mysql_unbuffered_query' : 'mysql_query';
if(!($query = $func($sql, $this->link)) && $type != 'SILENT') {
$this->halt('MySQL Query Error', $sql);
}
$this->querynum++;
return $query;
}
/**
* 取影响条数
*
* @return int
*/
function affected_rows() {
return mysql_affected_rows($this->link);
}
/**
* 返回错误信息
*
* @return array
*/
function error() {
return (($this->link) ? mysql_error($this->link) : mysql_error());
}
/**
* 返回错误代码
*
* @return int
*/
function errno() {
return intval(($this->link) ? mysql_errno($this->link) : mysql_errno());
}
/**
* 返回查询结果
*
* @param object $query
* @param string $row
* @return mixed
*/
function result($query, $row) {
$query = @mysql_result($query, $row);
return $query;
}
/**
* 结果条数
*
* @param object $query
* @return int
*/
function num_rows($query) {
$query = mysql_num_rows($query);
return $query;
}
/**
* 取字段总数
*
* @param object $query
* @return int
*/
function num_fields($query) {
return mysql_num_fields($query);
}
/**
* 释放结果集
*
* @param object $query
* @return bool
*/
function free_result($query) {
return mysql_free_result($query);
}
/**
* 返回自增ID
*
* @return int
*/
function insert_id() {
return ($id = mysql_insert_id($this->link)) >= 0 ? $id : $this->result($this->query("SELECT last_insert_id()"), 0);
}
/**
* 从结果集中取得一行作为枚举数组
*
* @param object $query
* @return array
*/
function fetch_row($query) {
$query = mysql_fetch_row($query);
return $query;
}
/**
* 从结果集中取得列信息并作为对象返回
*
* @param object $query
* @return object
*/
function fetch_fields($query) {
return mysql_fetch_field($query);
}
/**
* 返回mysql版本
*
* @return string
*/
function version() {
return mysql_get_server_info($this->link);
}
/**
* 关闭连接
*
* @return bool
*/
function close() {
return mysql_close($this->link);
}
/**
* 输出错误信息
*
* @param string $message
* @param string $sql
*/
function halt($message = '', $sql = '') {
echo $message . ' ' . $sql;
exit;
}
}
?>
然后是界面代码,他们用的分页类基本是一样的,唯一的区别在于MYSQL的limit 两个参数分别是:开始行号,偏移量,而MSSQL的ROW_NUMBER()是从哪里到哪里


<html>
<head><title></title></head>
<body>
<table border="1">
<?php
require('mysql.php');
require('mysql.page.php');
$dbHelper = new dbQuery('localhost', 'root', 'mysql','guestbook');
$sqlstr='select * from gb_content';
$result = $dbHelper->query($sqlstr);
$total = $dbHelper->affected_rows();//总条数
$page=new page_link($total,10);
$sqlstr.=" limit $page->firstcount,$page->displaypg";
$result = $dbHelper->query($sqlstr);
while ($rows=$dbHelper->fetch_array($result))
{
echo '<tr><td>'.$rows['id'].'</td>';
echo '<td>'.$rows['username'].'</td></tr>';
}
$str="<table border='0' align='center'><tr><td >".$page->show_link()."</td></tr></table>";//显示分页导航
echo $str;
?>
</table>
</body>
</html>
XP + MSSQL2005+MYSQL+PHP5下测试通过
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端