Home > Backend Development > PHP Tutorial > PDO怎样将结果集指针移动到指定的记录位置上啊

PDO怎样将结果集指针移动到指定的记录位置上啊

WBOY
Release: 2016-06-23 14:13:46
Original
2505 people have browsed it

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



 
 
查找留言:请输入关键字 
  



  
      
     
  
     
$Pos=($Page-1)*$PageSize;

  for($i=0;$i   $row=$result->fetch(PDO::FETCH_ASSOC,PDO::FETCH_ORI_ABS,$Pos);
 if($row){
 ?>
   
     
    
   }
  $Pos++;
  } ?>
标题内容作者 email来自
= $row['title'];?>= $row['content'];?> = $row['author'];?>= $row['email'];?> = $row['ip'];?>

// 显示分页链接
if($Page== 1)
        echo  "第一页 ";
else  echo  " 第一页 ";
if($Page==1)   // 设置“上一页”链接
        echo  " 上一页 ";
    else echo  " 上一页 ";
for($i=1;$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() 比较好

source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template