這個類是迫於無奈才寫的 ,有個平朋友才學PHP 不會使用MySQLi 和PDO ,但項目中估計要用到分頁,所以仿照 前面兩個版本才寫了這個類;
說明點,PHP中 mysql_系列方法的效率比較低,就是開發,調試或示例應用中用,正規的產品中不要使用該系列的方法,最好使用pdo,adodb,mysqli和mysqlnd(mysql native driver)這幾個的效率都好於MySQL_系列方法,還有一個 MySQL_pconnect() 方法可以獲取一個持久連接(參看PHP手冊)做為連接句柄傳遞給MySQL_系列方法效率也高於常規連接,這個有人做過測試(性能和Java中的鏈接池相仿)。
其他兩個版本的分頁類可以參考下 MySQLi版的那個 效率還需要優化下(主要在查詢總記錄數那裡),下面就給出該類,用法附於後面:
<?PHP * Description of PageUtil4MySQL
* 用於mysql_系列的分頁類 另外兩個分別用於MySQLi和PDO
* 這個類還可以改用 pconnect 持久連接
* @author yiqing95 class PageUtil4MySQL {
private $pageSize;//每一頁顯示的行數; * 當前頁碼
* @var int public $currPageNum;//頁碼,要顯示那一頁的數據 * 當前頁的記錄數
* @var int public $countOfCurrPage;//當前頁的數據量 * 當前頁的結果集
* @var int private $resultList;//指定頁的結果集 * 總頁數
* @var int public $totalPageNum;//總頁數 * 總記錄數
* @var int public $totalRecordNum;//總共的記錄數 * 當前頁的第一條記錄,是本次查詢的第幾條
* 比如每頁十條記錄 ,那麼第二頁,開始行號邏輯上就是11
* @var int public $startRowNum;//從行開始
public $errorMsg;//錯誤消息
/**構造函數*/
public function __construct($pageSize=10) {
$this->pageSize=$pageSize;//默認每頁顯示10行數據、
}
//設置每頁顯示的數據行數
public function setPageSize($pageSize) {
$this->pageSize=$pageSize;
return $this;
}
* //要獲取第N頁的數據
* @param number $pageNum 第幾頁數據
* @param string $selectStr select查詢語句
* @param int $fetchStyle 取數據的方式,三種,關聯,數字,都可以, MYSQL_NUM MySQLI_BOTH;默認是關聯方式取
* @return array 返回指定頁的數據 public function resultListOfPage($pageNum,$selectStr,$fetchStyle=MySQLI_ASSOC) { if(!empty($this->resultList)) {
unset ($this->resultList);//如果結果不空清除之,防止影響收集 */
$this->resultList = null;
$this->resultList = array();
$this->currPageNum=$pageNum;//當前頁數是
//不知 下面的函數是否會修改傳遞進去的select語句
$totalRowNum = $this->getRowCount($selectStr);//計算出總行數
$this->totalRecordNum=$totalRowNum;//總行數;
if($totalRowNum>0) {
// echo "總行數:$totalRowNum";
$this->totalPageNum=ceil($totalRowNum/$this->pageSize);//計算總頁數
//接下來判斷pageNum是否越界,或者傳遞了一個非數字的東東:
if(!is_numeric($pageNum) or $pageNum<=0 or $pageNum> $this->totalPageNum) {
$pageNum=1;//越界則讓其默認取第一頁數據
$this->currPageNum=$pageNum; //echo "總頁數 $this->totalPageNum"; $this->startRowNum=($pageNum-1)*$this->pageSize; $selectStr .= " limit $this->startRowNum ,$this->pageSize";
//echo "最終生成的select語句是:$selectStr";
try{
$rs = MySQL_query($selectStr);
while($row = MySQL_fetch_array($rs, $fetchStyle)){
$this->resultList[] = $row; MySQL_free_result($rs);//關閉游標
$rs = null;
}catch(Exception $ex){
throw $ex; //當前頁的數據量
$this->countOfCurrPage=count($this->resultList);
} return $this->resultList; //計算總記錄數:
//思路 換掉所有位於select 與 from之間的東西,
//移除order by後的東西 ,出現select 嵌套現象未測試!
private function getRowCount($selectStr) {
$selectStr = trim($selectStr); //緊身以下
$selectStr = preg_replace('~^SELECT\s.*\sFROM~s', 'SELECT COUNT(*) FROM',
$selectStr);
$selectStr = preg_replace('~ORDER\s+BY.*?$~sD', '', $selectStr);
$rs = MySQL_query($selectStr);
$row = mysql_fetch_array($rs,MySQL_NUM);
MySQL_free_result($rs);//釋放結果集
return $row[0]; }
?>
用法說明:如果使用smarty模板用這個類效果很好,如果不使用模板感覺代碼較凌亂:
<?PHP
//查詢用的語句可隨意構造 這裡是以id 降序排列的起始 就等價於 時間降序
$selectStr = "SELECT * FROM users ORDER BY id DESC";
//構造分頁類:
$pageUtil = new PageUtil4MySQL($pageSize); $rsltList = $pageUtil->resultListOfPage($page, $selectStr);
$totalPage = $pageUtil->totalPageNum; //總頁數
$currPageNum = $pageUtil->currPageNum;//當前頁號
$totalRecordNum = $pageUtil->totalRecordNum;//總共的記錄數
$currPageNum = $pageUtil->currPageNum;//當前頁數的大小,這個是用在比如最後一頁,記錄數不足分頁時查看
?>
<?PHP include 'public/header.Html'; ?>
<meta http-equiv="Content-Type" content="text/Html; charset=UTF-8">
<script type="text/Javascript" charset="UTF-8">
function turnToPage(page){
if(page > "<?PHP echo $totalPage;?>"){ alert("first page");return;
}
if(parseInt(page,10) < 1){
/// 自己轉碼alert("這個是第一頁了");return;
alert("last page");return;
}
window.location = "listPage_table.php?pageSize=<?PHP echo $pageSize; ?>&page="+page;
}
//沒有相片時會加載這個的 你隨便給一個圖片路徑:比如暫無照片的gif圖片就行了
function noPicture(img){
img.src = "public/images/bj.jpg"; </script>
<?PHP if($totalPage > 1){
$prePage = $currPageNum-1;
$nextPage = $currPageNum + 1;
$pageHeader = "
<div style=\"width:100%; text-align:center;\">
總共有 {$totalPage} 頁 當前是第 {$currPageNum}頁
共有 {$totalRecordNum} 幅照片
<a href=\"Javascript:turnToPage('1')\">首 頁</a>
<a href=\"Javascript:turnToPage('{$prePage}')\">上一頁</a>
<a href=\"Javascript:turnToPage('{$nextPage}')\">下一頁</a>
<a href=\"Javascript:turnToPage('{$totalPage}')\">尾 頁</a>
</div>";
echo iconv("GBK","UTF-8", $pageHeader);
}?>
<?PHP foreach($rsltList as $userInfor){ echo "
<tr>
<td>
{$userInfor['relationship']}
</td>
<td>
{$userInfor['name']}
</td>
<td>
{$userInfor['telephone']}
</td>
<td>
{$userInfor['relationship']}
</td>
<td>
<img src ='{$userInfor['photo']}s' onerror='noPicture(this)'/>
</td>
</tr> }
?>