一个继承自PDO类的自动分页类
来源:互联网 发布:java接口开发书籍推荐 编辑:程序博客网 时间:2024/05/16 08:14
1、新建一个PHP文件,文件名为pdopage_class.php,将以下代码粘贴进去。代码如下: <?php/** * 类名: PdoPage * 作者:谢声涛 shishengsoft@gmail.com * 描述: 继承自PDO类,增加了自动分页功能,类似MS ADO组件的自动分页功能。 *///-------------开始-----------------------------------class PdoPage extends PDO { public $RecordCount = 0; // 记录集的记录总数 public $AutoPage = false; // 启用自动分页功能 public $PageSize = 0; // 每页的记录行数 public $CurrentPage = 0; // 当前页 public $Pages = 0; // 总页数 public $BOF = false; // 游标到记录集之前 public $EOF = false; // 游标到记录集之后 private $RecordSet = null; // 记录集 private $mCurrentRow = -1; // 记录集中当前游标位置 private $Rows = 0; //总记录数 // 关闭连接 public function Close(){unset($this);} // 分页查询 public function QueryEx($SqlString){ // 是否启用自动分页功能 if($this->AutoPage){ // 检查PageSize参数 if ($this->PageSize <=0) die("警告:PageSize不能为负数或零。"); // 计算总记录数 $rs = @parent::query($this->rebuildSqlString($SqlString)); $this->Rows = $rs->fetchColumn(); // 计算总页数 if ($this->Rows < $this->PageSize) {$this->Pages = 1;} elseif ($this->Rows % $this->PageSize) {$this->Pages = intval($this->Rows/$this->PageSize)+1;} else {$this->Pages = intval($this->Rows/$this->PageSize);} // 约束CurrentPage值,使之位于1到Pages之间。 if($this->CurrentPage < 1) {$this->CurrentPage =1;} if($this->CurrentPage > $this->Pages) {$this->CurrentPage = $this->Pages;} //计算偏移量 $Offset = $this->PageSize * ($this->CurrentPage - 1); // 重组SQL语句,SqlString有分号则去掉 $SqlString = str_replace(";","",$SqlString) . " LIMIT $Offset,$this->PageSize;"; } // 查询并返回记录集 $rs = new PDOStatement(); $rs = @parent::query($SqlString); $this->RecordSet = $rs->fetchAll();//returns an array. $this->RecordCount = count($this->RecordSet); if(!$this->AutoPage){$this->Pages = (!$this->RecordCount)?0:1;} return $this->RecordCount; } // 取得字段值 public function FieldValue($FieldName=""){ return ($this->RecordSet[$this->mCurrentRow][$FieldName]); } //--------移动记录集游标--------------------------------------------- public function Move($RowPos){ if ($RowPos<0) $RowPos = 0; if ($RowPos > $this->RecordCount-1) $RowPos = $this->RecordCount-1; $this->mCurrentRow = $RowPos; $this->EOF = false; $this->BOF = false; } public function MoveNext(){ if($this->mCurrentRow < $this->RecordCount-1){ $this->mCurrentRow++; $this->EOF = false; $this->BOF = false; } else{ $this->EOF = true; } } public function MovePrev(){ if($this->mCurrentRow > 0){ $this->mCurrentRow--; $this->EOF = false; $this->BOF = false; }else{ $this->BOF = true; } } public function MoveFirst(){ $this->mCurrentRow = 0; $this->EOF = false; $this->BOF = false; } public function MoveLast(){ $this->mCurrentRow = $this->RecordCount-1; $this->EOF = false; $this->BOF = false; } //-------------------------------------------------- // 用于执行插入、修改、删除等操作 public function Execute($SqlString){ return @parent::query($SqlString); } //-----------------私有函数----------------------------- // 重新构造SQL语句,如将"select * from tb2"改写为"select count(*) from tb2",旨在提高查询效率。 private function rebuildSqlString($SqlString){ if(preg_match("/select[ ,./w+/*]+ from/",$SqlString,$marr)){ $columns = preg_replace("/select|from/","",$marr[0]); $columns = preg_replace("//*/","/*",$columns); $result = preg_replace("/$columns/"," count(*) ",$SqlString); return $result; } } //-------------结束-----------------------------------}//-------------结束-----------------------------------?>2、使用示例:请根据自己的情况修改MySQL用户名、密码、数据库名等信息。<?include_once("./pdopage_class.php");$db = new PdoPage("mysql:host=localhost;dbname=mydb","root","123456");$db->Execute("set character set gbk;");$db->AutoPage = false;$db->PageSize = 6;$db->CurrentPage = 1;$db->QueryEx("select * from tb2;");$db->MoveFirst();while (!$db->EOF) { echo $db->FieldValue("id"),"/t",$db->FieldValue("name"),"/t",$db->FieldValue("age"),"/n"; $db->MoveNext();}$db->Close();?>