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