关于PHP中的数据访问

最近刚刚做完一个PHP的项目,对方要求使用Pear中的DB包,一开始觉得还不错,但到了后来渐渐发现这个家伙真的是廉颇老矣,Pear中的数据抽象访问层的目标是做一个共通的数据访问,也就是说,代码不需要很多修改,就可以拿到别的数据库上使用,这一点在基本上达到了,像DB,MDB2都是很不错的选择,但在一些特殊情况下,却有点小问题了:

1 :当出现以下代码时,DB会将?号替换为空,还有一种是同样的就是当SQL语句中出现全角字符时也是同样的情况呵呵,可笑吧,但MDB2就不会,所以推荐大家使用MDB2

SELECT  ×   FROM   TABLE   WHERE  user_check  &   2   =   0   AND   user_id = ?

2:关于分页的小BUG,大家用过Pear的Pager就知道,Pager会提供一套与DB,MDb和MDB2结合使用的方法

Pager_wrapper_ DB | MDB2 | MDB 这个方法的使用相当简单,但在具体分页的实现上,各个类却有着很大的差异先说DB:

         function   &  Pager_Wrapper_DB( & $db ,   $query , $dbparams   =   null ,&   $pager_options )
        {
            
            
            
$temp = array ( ' mode '    => ' Jumping ' ,
                      
' perPage '    =>   5 ,
                         
' delta '      =>   1 );
             
if  (( ! array_key_exists ( ' prevImg ' , $pager_options )))
             {
                 
if  ( array_key_exists ( ' perPage ' , $pager_options ))
                 {
                     
$pager_options [ ' prevImg ' ] = " ←前 " . $pager_options [ ' perPage ' ] . " " ;
                    
$pager_options [ ' nextImg ' ] = " " . $pager_options [ ' perPage ' ] . " 件→ " ;
                 }
                 
else
                 {
                     
$pager_options [ ' prevImg ' ] = " ←前 " . $temp [ ' perPage ' ] . " " ;
                    
$pager_options [ ' nextImg ' ] = " " . $temp [ ' perPage ' ] . " 件→ " ;
                         
                 }    
             }
            
$res   =&   $db -> query( $query ,   $dbparams );
            
if  (PEAR :: isError( $res )) 
            {
                 
throw   new   Exception ( " Query Error! " );
            }
            
$totalItems   =  (int) $res -> numRows();
            
$res -> free();
            
$pager_options [ ' totalItems ' ] =   $totalItems ;    
            
$pager_options = array_merge ( $temp , $pager_options );
            
require_once   ' Pager/Pager.php ' ;
            
$pager   =  Pager :: factory( $pager_options );
            
$this -> page  =   array ();
            
$this -> page[ ' totalItems ' =   $pager_options [ ' totalItems ' ];
            
$this -> page[ ' back ' =   $pager -> _getBackLink();
            
$this -> page[ ' next ' ] = $pager -> _getNextLink();
            
$this -> page[ ' page_numbers ' =   array (
                
' current '   =>   $pager -> getCurrentPageID() ,
                
' total '     =>   $pager -> numPages()
            );
            
list ( $this -> page[ ' from ' ] ,   $this -> page[ ' to ' ])  =   $pager -> getOffsetByPageId();
            
$num =   $this -> page[ ' totalItems ' -  ( $this -> page[ ' page_numbers ' ][ ' current ' ] * $pager_options [ ' perPage ' ]);
            
$num = $num > 0 ? $pager_options [ ' perPage ' ] : $num + $pager_options [ ' perPage ' ];
            
if  ( $totalItems == 0 )
            {
                
$num = 0 ;    
            }
            
$res   = $db -> limitQuery( $query ,   $this -> page[ ' from ' ] - 1 ,   $num ,   $dbparams );
            
if  (PEAR :: isError( $res )) {
                
throw   new   Exception ( $res -> getUserInfo());
            }
            
$data   =   array  ();
            
while  ( $res -> fetchInto( $row ,  DB_FETCHMODE_ASSOC)) {
               
$data []  =   $row ;
            }
            
$res -> free();
            
return   $data ;
        }

看完这段程序都知道了,其实这个函数很简单,DB的分页实现就是靠拿个limitquery,不过令我想不到的是,当num数大于数据库中当前页记录条数时,居然会报错,这让我很奇怪,于是看了下源码,才发现这家伙居然在底层是使用游标循环完成的分页,这才恍然大悟,可怕吧,嘿嘿,但MDB2就不愧为DB的替代者,它采用的是添加Top|limit限制,所以综上所述大家都知道谁好用了吧,哈哈,完了吗,还没,还有PHP的未来数据访问新贵PDO,这玩意是我见过的PHP中访问数据库最快的东东了,具体使用就不多说了,只是暂时版本还不够成熟,要想和Pager结合,需要自己手动写PDO访问数据分页的代码。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值