php+mysqlのページングの問題

WBOY
WBOYオリジナル
2016-06-23 13:55:23858ブラウズ

アドバイスを求める: 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;//输出分页导航



問題の説明: ページングのアイデア: 最初にクエリ条件内のレコード数を計算し、次にクエリ条件内のレコード数を計算します。ページ番号とページごとのレコード数に基づく数値 ページ分割されたデータ (2 つのページ分割があります)。
最初のクエリは問題なく、条件 ($adRs = $config[DAOIMPL]->adSearchCount($search);) を満たすデータ項目の数を返すことができますが、2 番目のクエリが実行されるとエラーが報告されます。エラー メッセージは次のとおりです:
対応するコードは While($it=mysql_fetch_array($adSearchRs)) で、返された結果を取得するときのものです。さらに、データベースに出力された SQL コピーはデータを返します


ディスカッションへの返信 (解決策)

補足: コード内に画像のコードを追加すると、返される情報は次のとおりです

つまり、$adSearchRs = $config[DAOIMPL]->getADSearchInfo($search,$offset,$page); 問題が発生しました。
SQL コマンドは audioconver.p_advert_qry('-1',0,1) を呼び出していますか?
正しいですか?結果は誰に返されますか?

コマンドが同期していません: このコマンドを新規実行することはできません
これが「コマンドが同期していない」原因です。このエラーが発生した場合は、クライアント関数が間違った順序で呼び出されていることを意味します。 call コマンドを実行しています。 select
がないため、2 つの結果セットが生成されます
1 つ目は select コマンドがないため、無効であり、php によってリソースに処理できません
2 つ目1 つは呼び出しの結果セットです

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 関数は最初の結果セットのみをクリアできます。この方法では、呼び出しの結果セットをクリアできないため、エラーが発生します。


このコマンドを実行できません。 これが発生した場合、これが原因です。エラーは、クライアント関数を呼び出す順序が間違っていることを意味します

select なしで call コマンドを実行しています
したがって、2 つの結果セットが生成されます
1 つ目は、select がないため、select の結果セットです。コマンドは無効であり、PHP によってリソースに処理できません
2 番目の個別は呼び出しの結果セットです

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_close();

違います。
$adRs = $config[DAOIMPL]->adSearchCount($search);
$adList=mysql_fetch_array($adRs); です。 mysql_free_result ($adRs);
mysql_close();

接続を閉じてデータを再接続しても、ページ内の 2 つのストアド プロシージャのいずれかを変更することで、この問題を間接的に解決する方法はありますか? SQLに質問しますか?
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。