php+mysql 分页问题

鄙人姓胡 2014-06-08 12:03:19
求教:php+mysql分页 ,先贴代码,再描述问题
代码:




$page=isset($_GET['page'])?intval($_GET['page']):1; //这句就是获取page=18中的page的值,假如不存在page,那么页数就是1。
$searchinfo=isset($_GET['search'])?($_GET['search']):"-1";
$search=($searchinfo=='请输入关键字')?-1:$searchinfo;

$num=1; //每页显示3条数据

/*
首先咱们要获取数据库中到底有多少数据,才能判断具体要分多少页,具体的公式就是
总数据库除以每页显示的条数,有余进一。
也就是说10/3=3.3333=4 有余数就要进一。
*/
if ($config[NEEDDB]) { //if need db
$dbLink = DBPool::getLink($config[DBDRIVER]);
$daoImpl = DAOImpl::getImpl($dbLink, $config[TABLEPRE][BACKEND]);
$config[DBLINK] = $dbLink;
$config[DAOIMPL] = $daoImpl;
}
$adRs = $config[DAOIMPL]->adSearchCount($search);
//$adList = rs2Array($adRs);
$adList=mysql_fetch_array($adRs);
mysql_free_result($adRs);
//DBPool::closeLink($config[DBLINK]);
if(count($adList)>0){
$total=$adList[0]['cn']; //查询所有的数据
}
else{
$total=0;
}

$url='views/adSearchResult.php';//获取本页URL
//页码计算
$pagenum=ceil($total/$num); //获得总页数,也是最后一页
$page=min($pagenum,$page);//获得首页
$prepg=$page-1;//上一页
$nextpg=($page==$pagenum ? 0 : $page+1);//下一页
$offset=($page-1)*$num; //获取limit的第一个参数的值,假如第一页则为(1-1)*10=0,第二页为(2-1)*10=10。
//开始分页导航条代码:
$pagenav="显示第 <B>".($total?($offset+1):0)."</B>-<B>".min($offset+10,$total)."</B> 条记录,共 $total 条记录 ";
//如果只有一页则跳出函数:
//if($pagenum<=1) return false;
$pagenav.=" <a href=javascript:dopage('result','$url?page=1');>首页</a> ";
if($prepg) $pagenav.=" <a href=javascript:dopage('result','$url?page=$prepg');>前页</a> "; else $pagenav.=" 前页 ";
if($nextpg) $pagenav.=" <a href=javascript:dopage('result','$url?page=$nextpg');>后页</a> "; else $pagenav.=" 后页 ";
$pagenav.=" <a href=javascript:dopage('result','$url?page=$pagenum');>尾页</a> ";
$pagenav.="</select> 页,共 $pagenum 页";
//假如传入的页数参数大于总页数,则显示错误信息
If($page>$pagenum){
Echo "Error : Can Not Found The page ".$page;
Exit;
}
$adSearchRs = $config[DAOIMPL]->getADSearchInfo($search,$offset,$page);
$adSearchList = rs2Array($adSearchRs);
//mysql_free_result($adSearchRs);
foreach ( $adSearchList as $it){
//While($it=mysql_fetch_array($adSearchRs)){
Echo '<div class="sylist1">
<input type="checkbox" class="check" name="checkbox" id="checkbox'.$it['id'].'" value="'.$it['id'].'"/>
</div>
<div class="sylist2">'.$it['title'].'</div>
<div class="sylist3">'.$it['subject'].'</div>
<div class="sylist4">'.$it['pic_url'].'</div>
<div class="sylist5">'.$it['advert_url'].'</div>
<div class="sylist6">'.$it['if_valid'].'</div>
</div>';
}//显示数据

echo $pagenav;//输出分页导航





问题描述:分页思路:先计算出查询条件的记录条数,然后根据页码和每页条数计算出分页数据(存在两次分页)。
第一次查询,是ok的,能够返回满足条件的数据条数,($adRs = $config[DAOIMPL]->adSearchCount($search););但是第二次查询执行后就报错了,报错信息是:
对应代码是While($it=mysql_fetch_array($adSearchRs)) 就是获取返回结果的时候。另外打印出的sql copy到数据库是有数据返回的
...全文
354 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
鄙人姓胡 2014-06-12
  • 打赏
  • 举报
回复
引用 11 楼 xuzuning 的回复:
不对,应该是 $adRs = $config[DAOIMPL]->adSearchCount($search); //$adList = rs2Array($adRs); $adList=mysql_fetch_array($adRs); //mysql_free_result($adRs); mysql_close();
关闭连接,重新连接数据庫还是不能解决这个问题,最有没有办法就好将页面中两个存储过程中的一个改成sql,才间接解决这个问题。
xuzuning 2014-06-08
  • 打赏
  • 举报
回复
刚才说的不够准确,但意思是到了 应该是 mysql 扩展会自动选择非空结果集,但 mysql_free_result 函数只能清空第一个结果集。这样 call 的结果集得不到清空,所以出错了
xuzuning 2014-06-08
  • 打赏
  • 举报
回复
commands out sync: you can't run this command new 这是“命令不同步”的原因,如果遇到该错误,说明正在以错误顺序调用客户端函数 你执行的是 call 命令,没有 select 所以会产生两个结果集 第一个是 select 的结果集,由于没有 select 命令,所以是无效的不能 php 处理成资源 第二个才是 call 的结果集 虽然 mysql 提供了 C 函数 mysql_next_result 用于移动结果集 但 php 的 mysql 扩展并没有提供该函数,所以可认为php 的 mysql 不能很好的支持存储过程(因为 mysql4 并不支持存储过程) mysqli 扩展提供了 mysqli_next_result 函数,所以如果使用了存储过程,最好是用 mysqli 驱动 附上解决该问题的 C 代码
 do
    {
         result=mysql_store_result(&conn);
          mysql_free_result(result);
    }while(!mysql_next_result(&conn)); // to solve the "2014:Commands out of sync; " problem
    凡是在执行多查询时,每个查询后都需调用以上这段代码才行。
xuzuning 2014-06-08
  • 打赏
  • 举报
回复
那就是 $adSearchRs = $config[DAOIMPL]->getADSearchInfo($search,$offset,$page); 已经出错了! 你的 sql 指令是 call audioconver.p_advert_qry('-1',0,1) 吗? 正确吗?结果返回给谁了?
鄙人姓胡 2014-06-08
  • 打赏
  • 举报
回复
补充信息: 在代码中补充如图中代码后,返回的信息如下
鄙人姓胡 2014-06-08
  • 打赏
  • 举报
回复
求大神,求帮顶,求解答
鄙人姓胡 2014-06-08
  • 打赏
  • 举报
回复
求大神,求帮顶,求解答
xuzuning 2014-06-08
  • 打赏
  • 举报
回复
不对,应该是 $adRs = $config[DAOIMPL]->adSearchCount($search); //$adList = rs2Array($adRs); $adList=mysql_fetch_array($adRs); //mysql_free_result($adRs); mysql_close();
xuzuning 2014-06-08
  • 打赏
  • 举报
回复
对,在每次执行存储过程并读取数据之后 $adSearchRs = $config[DAOIMPL]->getADSearchInfo($search,$offset,$page); $adSearchList = rs2Array($adSearchRs); mysql_close(); 所以你可能需要修改数据库类
鄙人姓胡 2014-06-08
  • 打赏
  • 举报
回复
引用 8 楼 xuzuning 的回复:
mysql_close() 一下就可以了
在第一个查询后将数据庫连接断掉?每次查询都创建一次连接?
xuzuning 2014-06-08
  • 打赏
  • 举报
回复
mysql_close() 一下就可以了
鄙人姓胡 2014-06-08
  • 打赏
  • 举报
回复
引用 5 楼 xuzuning 的回复:
commands out sync: you can't run this command new 这是“命令不同步”的原因,如果遇到该错误,说明正在以错误顺序调用客户端函数 你执行的是 call 命令,没有 select 所以会产生两个结果集 第一个是 select 的结果集,由于没有 select 命令,所以是无效的不能 php 处理成资源 第二个才是 call 的结果集 虽然 mysql 提供了 C 函数 mysql_next_result 用于移动结果集 但 php 的 mysql 扩展并没有提供该函数,所以可认为php 的 mysql 不能很好的支持存储过程(因为 mysql4 并不支持存储过程) mysqli 扩展提供了 mysqli_next_result 函数,所以如果使用了存储过程,最好是用 mysqli 驱动 附上解决该问题的 C 代码
 do
    {
         result=mysql_store_result(&conn);
          mysql_free_result(result);
    }while(!mysql_next_result(&conn)); // to solve the "2014:Commands out of sync; " problem
    凡是在执行多查询时,每个查询后都需调用以上这段代码才行。
网上也是这么说,但mysql 没有这个方法,应该是mysqli_store_result 吧

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧