mysql內建函數mysql_data_seek可以將指標移到指定的記錄位置,PDO有沒有提供類似功能的函數呢,因為我想用這個做分頁程式,我查了一下PDO中有個FETCH_ORI_ABS的函數,好像說它也能移動指標,但我不知道具體怎樣用哦。
回複討論(解決方案)
http://www.sitepoint.com/forums/showthread.php?709890-Equivalent-of-mysqli_data_seek-in-PDO
鬱悶,這篇文章說這是不可能的。
難道我下面的分頁程式就真的沒法實現了
$dsn="mysql:host=localhost;dbname=guestbook";
$db=new PDO($dsn,'root','111'); //串連資料庫
$db->query('set names gb2312'); //設定字元集
if(isset($_GET['page']) && (int)$_GET['page']>0) //擷取頁碼
$Page=$_GET['page'];
else
$Page=1;
//設定每頁顯示記錄數
$PageSize=4;
$keyword=trim($_GET['keyword']);
if ($keyword <> "")
{
$sql="select * from lyb where title like '%?%'";
$result=$db_prepare($sql); //建立結果集
$result->bindParam(1,$keyword);
}
else $result=$db->prepare("select * from lyb",array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL));
$result->execute();
$RecordCount=$result->rowCount();
$PageCount =ceil($RecordCount/$PageSize);
?>
標題 |
內容 |
作者 |
email |
來自 |
$Pos=($Page-1)*$PageSize; for($i=0;$i<$PageSize;$i++){ $row=$result->fetch(PDO::FETCH_ASSOC,PDO::FETCH_ORI_ABS,$Pos); if($row){ ?>
|
|
|
|
|
$Pos++; } ?>
if($Page== 1)
echo "第一頁 ";
else echo " 第一頁 ";
if($Page==1) // 設定“上一頁”連結
echo " 上一頁 ";
else echo " 上一頁 ";
for($i=1;$i<= $PageCount;$i++) { // 設定每頁的連結
if ($i==$Page) echo "$i ";
else echo " $i ";}
if($Page== $PageCount) // 設定“下一頁”連結
echo " 下一頁 ";
else echo " 下一頁 ";
if($Page == $PageCount) //設定“最後一頁”連結
echo " 末頁 ";
else echo " 末頁 ";
echo " 共".$RecordCount. "條記錄 "; //共多少條記錄
echo " $Page/$PageCount 頁"; //當前頁的位置
?>
對於支援 LIMIT 子句的資料庫,比如 mysql、sqlite 等可用 limit 起始,長度 分頁
對於不支援 LIMIT 子句的資料庫,比如 mssql、oracle 等可結合 ROWNUM、RN 完成分頁
據說高版本的 mysql 也支援 ROWNUM、RN 了,那麼分頁代碼就可簡化許多了
就你的代碼而言
$result->execute(); 是查詢所有合格記錄
$row=$result->fetch(PDO::FETCH_ASSOC,PDO::FETCH_ORI_ABS,$Pos); 是擷取其中一條,於是就要在迴圈裡執行
你完全可以
$rows = $result->fetchall(PDO::FETCH_ASSOC,PDO::FETCH_ORI_ABS,$Pos);
全部取出,並
$rows = array_chunk($rows, $PageSize);
按每頁行數切割成數組 ,再
foreach($rows[$Page-1] as $row) {
//輸出內容
}
問題是這句擷取不到其中一條,獲得的總是第一條,也就是說PDO::FETCH_ORI_ABS,$Pos根本沒起作用。
$row=$result->fetch(PDO::FETCH_ASSOC,PDO::FETCH_ORI_ABS,$Pos);
我知道用limit子句進行分頁了,但我想換種方法分頁,我喜歡把所有記錄都讀入結果集中再分頁,這樣對小的結果集來說速度快些。
同一頁你的 $Pos 一直沒變。
$row=$result->fetch(PDO::FETCH_ASSOC,PDO::FETCH_ORI_ABS,$Pos+$i);
同一頁你的 $Pos 一直沒變。
$row=$result->fetch(PDO::FETCH_ASSOC,PDO::FETCH_ORI_ABS,$Pos+$i);
您看錯了,我輸出完一條後有一個$Pos++;
的
問題是 我把 $row=$result->fetch(PDO::FETCH_ASSOC,PDO::FETCH_ORI_ABS,$Pos);
改成
$row=$result->fetch();
結果完全是一樣的,FETCH_ORI_ABS,$Pos完全沒起作用
PDO::FETCH_ORI_ABS,$Pos 生效是有條件的
$result->fetchall() 比較好