stylecn
- UID
- 15643
- 帖子
- 1
- 积分
- 0
- 在线时间
- 1小时
- 注册时间
- 2007-04-17
- 最后登录
- 2008-04-23
|
1#
stylecn 发表于2007-04-17
PHP MySQL数据库操作-分页链接通用类
<?php
/*************************************
类名:CDb()
PHP MySQL数据库操作通用完全类
作者:月影 2006-11于海南大学完成 技术支持:Email:[email protected] QQ:41096834
没有版权,欢迎转发 但请保留此说明 谢谢 有什么问题,欢迎一起交流 进步
说明 凡是本人写的PHP类,都以MFC的类的命名方式为参照 即以大写C开头
第二个字母也大写 其它字母小写 如CUpload,CDb,CImage等,且均以UTF-8编码保存,如果你的网页使用其它编码,请自行转化编码
转化方法:用记事本打开本文件,选择“文件--->另存为”,在“编码”中选择 "UTF-8" 保存即可.]
欢迎广大外语爱好者提供此版本的外语翻译版,表示感谢
**************************************
此类有什么特殊之处:
1.集成数据库查询
2.智能化Select查询语句处理,用户不必再在SQL语句中加入limit指令,让你彻底忘却分页带来的痛苦
3.此类取得总记录数的原理是当你在执行select查询时,将查询语句转化为 select count(*) from TB...来查询,所以,效率,相当高
3.集成分页链接生成
可以说,此数据库类是我自从2006从事PHP编写为至,最为满意的类,同时,也感谢网友提供大量建议及测试
××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
使用范例:
//构造一个数据库类,并连连接到info数据库,MySQL服务器的IP为10.0.0.254,用户名为 root,密码为test
$db=new CDb("info","10.0.0.254","root","test");
$db->page_size=20; //设置每页显示20条记录
$db->page_str='page'; //设置分页符为 'page',比方show.php?offset=12,那么请设置为'offset'
$sql='select * from TB where id<125'; //你要执行的查询语句,注意,这里不用加入limit来达到分页!!!
$db->query($sql); //执行查询,当然,如果是删除记录,添加记录,修改记录,也可以这样执行.
while($rs=$db->get_rs())
{
echo $rs['id'],$rs['user_name'];
}
echo '当前页',$db->get_current_page('page');
echo '总记录数',$db->rs_count;
echo '总页数',$db->page_count
$db->link(10,'sort=new'); //自动生成分页链接
//上面的10意思是每页最多显示10个数字链接,后面的sort=new 就称为GET的附加URL字符串
//比如,你的URL可能是这样的:
//http://xxx/show.php?page=12&sort=new&area_id=45
//那么分页链接就可以这样生成
$db->link(10,'sort=new&area_id=45');
*************************************************************************
接口函数说明:
void __construct(string $database,string $host,string $user,string $passwd)
功能 CDb类的构造函数 构造一个数据库类
参数:
$database 要连接的数据库
$hos M ySQL服务器IP地址或主机名
$user MySQL服务器用户名
$passwd MySQL服务器密码
void select_db (string $database)
功能: 切换要使用的数据库
参数 : $database 要使用的数据库名
resource id query(string $sql)
功能 :根据传入的查询语句,返回一个查询结果资源号
参数: $sql 查询语句 如 $sql="select * from Table"
Array CDb::get_rs(void)
功能: 根据CDb::query(string $sql)的查询结果 得到一个记录集合关联数组
int get_current_page($page_str="page")
功能:返回当前页号
参数:$page_str: 分页符字符串
接口数据成员:
page_size : 每页显示的记录数
rs_count : 查询总记录数
*/
class CDb
{
private $host; //MySQL服务器
private $result; //一个查询结果集合
private $row; //查询结果对象
private $sql; //查询语句
private $rs; //查询结果记录关联数组
private $conn; //数据库连接结果资源
private $user; //MySQL服务器用户名
private $passwd; //MySQL服务器密码
public $rs_count=0;
public $page_size=30;
public $page_str='page';
public $page_count;
public function __construct($database="ly",$host="127.0.0.1",$user="root",$passwd="key2000"){
$this->host=$host;
$this->usr=$user;
$this->psd=$passwd;
$this->database=$database;
$this->sql="";
$this->conn=mysql_connect($host,$user,$passwd) or die("<h3>Can not connect to MySQL Server.</h3>");
$this->select_db($database);
//$this->query("set NAMES 'utf8'");
return $this->conn;
}
//切换数据库
function select_db($database){
$this->database=$database;
mysql_select_db($this->database);
}
public function query($sql){
$this->sql=$sql;
if(stripos(trim($sql),'select')==0) //如果是select 查询
{
$pattern = '/select\s(.+)\sfrom/im';
$tmp_sql=preg_replace($pattern,'select count(*) from',$sql);
$this->result=mysql_query($tmp_sql);
$rs=$this->get_rs();
$this->rs_count=$rs['count(*)']; //取得记录总数
$this->page_count=ceil($this->rs_count/$this->page_size);
//处理分页查询
$current_page=$this->get_current_page($this->page_str);
if ($current_page>$this->page_count) { $current_page=$this->page_count; }
$current_page=$current_page<1?1:$current_page;
$this->absolute_page=$current_page;
$this->page_count=ceil($this->rs_count/$this->page_size);
$sql=$sql.sprintf(" limit %d,%d",($current_page-1)*$this->page_size,$this->page_size);
}
else
{
$this->rs_count=0;
}
$this->result=mysql_query($sql,$this->conn);
return $this->result;
}
public function get_rs(){
$this->errdb("Array CDb::get_rs(void)");
$this->rs=mysql_fetch_array($this->result);
return $this->rs;
}
public function get_current_page($page_str="page")
{
if(isset($_GET[$page_str]))
{
$page_str=$_GET[$page_str];
if(!is_numeric($page_str))
return 1;
return ($page_str);
}
else
return 1;
}
public function __destruct(){
//mysql_close($this->conn);
}
//分页链接
public function link($num_per_page=10,$extra_str='')
{
GLOBAL $PHP_SELF;
$page_str=$this->page_str;
$prefix=$PHP_SELF.'?'.$extra_str.'&&'.$page_str.'=';
$current_page=$this->absolute_page;
$page_count=$this->page_count;
if($page_count<=1)
{
return ;
}
if($page_count>1)
{
echo("<a href=$prefix 1><首页></a> ");
}
if(floor($current_page/$num_per_page))
{
printf(" <a title=\"上%d页\" href=\"%s%d\">%s</a>\n",$num_per_page,$prefix,floor($current_page/$num_per_page)*$num_per_page-1,"<<");//
}
$tmp=floor($current_page/$num_per_page)*$num_per_page+1;
$s2=ceil($tmp/$num_per_page)*$num_per_page;
for($i=$tmp;($i<=$s2&&$i<=$this->page_count);$i++)
{
if($i==$current_page)
{
echo("$i ");
continue;
}
echo(" <a href=\"$prefix$i\">$i</a>\n");
}
if((floor($current_page/$num_per_page)*$num_per_page+$num_per_page)<$page_count)
{
printf("<a title=\"下%d页\" href=\"%s%d\">%s</a>",$num_per_page,$prefix,ceil($current_page/$num_per_page)*$num_per_page+1,">>");
}
if($current_page<$page_count)
{
echo(" <a href=$prefix$page_count><末页></a>");
}
printf(" <INPUT TYPE=text NAME=jump size=2 value=%s>",$current_page<$page_count?$current_page+1:1);
printf(" <input type=button value=GO onclick=window.location='%s'+document.all.jump.value>",$prefix);
printf("\n页次 $current_page/$page_count\n");
}
private function errdb($str){
if(!$this->result){
echo "At Line :", __LINE__;
echo(" The CDb::query(\$sql) Return an Unvalid Resource,so Can't contiune.\n");
echo($this->sql);
exit;
}
}
}
?> ;
|