php +mysql 分页,php+mysql 分页问题

博客内容主要讲述了在PHP中实现MySQL分页时遇到的问题,包括如何计算总页数和获取分页数据。在执行存储过程后,出现了'Commands out of sync'错误,原因是PHP的MySQL扩展不支持存储过程的多结果集。解决方案是使用mysqli扩展或者在每次执行存储过程后关闭并重新连接数据库。作者最终通过将其中一个存储过程替换为SQL查询来间接解决问题。
摘要由CSDN通过智能技术生成

求教: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="显示第 ".($total?($offset+1):0)."-".min($offset+10,$total)." 条记录,共 $total 条记录 ";//如果只有一页则跳出函数://if($pagenum<=1) return="" false;$pagenav.=" 首页 " ;if($prepg)="" $pagenav.=" 前页 " ;="" else="" ;if($nextpg)="" ;$pagenav.=" 尾页 " 假如传入的页数参数大于总页数,则显示错误信息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 '

'.$it['title'].'

'.$it['subject'].'

'.$it['pic_url'].'

'.$it['advert_url'].'

'.$it['if_valid'].'

';}//显示数据echo $pagenav;//输出分页导航

问题描述:分页思路:先计算出查询条件的记录条数,然后根据页码和每页条数计算出分页数据(存在两次分页)。

第一次查询,是ok的,能够返回满足条件的数据条数,($adRs = $config[DAOIMPL]->adSearchCount($search););但是第二次查询执行后就报错了,报错信息是:

对应代码是While($it=mysql_fetch_array($adSearchRs)) 就是获取返回结果的时候。另外打印出的sql copy到数据库是有数据返回的

回复讨论(解决方案)

补充信息: 在代码中补充如图中代码后,返回的信息如下

那就是 $adSearchRs = $config[DAOIMPL]->getADSearchInfo($search,$offset,$page); 已经出错了!

你的 sql 指令是 call audioconver.p_advert_qry(‘-1’,0,1) 吗?

正确吗?结果返回给谁了?

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 扩展会自动选择非空结果集,但 mysql_free_result 函数只能清空第一个结果集。这样 call 的结果集得不到清空,所以出错了

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 吧

mysql_close() 一下就可以了

mysql_close() 一下就可以了

在第一个查询后将数据?连接断掉?每次查询都创建一次连接?

对,在每次执行存储过程并读取数据之后

$adSearchRs = $config[DAOIMPL]->getADSearchInfo($search,$offset,$page);

$adSearchList = rs2Array($adSearchRs);

mysql_close();

所以你可能需要修改数据库类

不对,应该是

$adRs = $config[DAOIMPL]->adSearchCount($search);

//$adList = rs2Array($adRs);

$adList=mysql_fetch_array($adRs);

//mysql_free_result($adRs);

mysql_close();

不对,应该是

$adRs = $config[DAOIMPL]->adSearchCount($search);

//$adList = rs2Array($adRs);

$adList=mysql_fetch_array($adRs);

//mysql_free_result($adRs);

mysql_close();

关闭连接,重新连接数据?还是不能解决这个问题,最有没有办法就好将页面中两个存储过程中的一个改成sql,才间接解决这个问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值