• ベストアンサー

ページングの際のページ(データ)生成について

ご教授よろしくお願いいたします。 現在Webサービスからデータを引っ張ってPHPアプリを作成中です。 試行錯誤しながら、なんとかページングも実装して ページ(データ)の表示もうまくいきました。 しかしながら、妙な現象に悩まされております。 Webサービスからのデータをサイト上に10件づつ表示させています。 ある特定のクエリ結果の場合だけサイト上のページ表示がおかしくなってしまうのです。 具体的には、検索結果が「11件、21件、31件...」というような場合です。 http://phero.do-kuchikomi.net/pheromone_goods/pherotica_hawk.html#hikaku 上記の検索結果は、31件で、ページングは1~4のナンバーが生成されています。 この場合、31件目を表示させるために「4」をクリックすると表示がおかしくなってしまうのです。 検索結果が「32件とか33件」とかだと正常に表示されます。 『○1件』の場合だけおかしくなってしまうのです。 原因を解明しようとしたのですが、力尽きてしまいました。 どなたかご教授願えないでしょうか? よろしくお願いいたします。 分かりにくい説明で申し訳ございません。

質問者が選んだベストアンサー

  • ベストアンサー
  • gogo-tea
  • ベストアンサー率75% (25/33)
回答No.3

WEBサービスからのデータを操作することが出来るのかどうかはやったことがないのでわからないのですが、もし操作できるのであれば <?php //$aaaはWEBサービスから受け取る配列名です //この部分は配列を操作する為に定義した模擬配列ですのでそちらの環境では書く必要ないです $aaa['ProductPHP'] = "1111"; $aaa['ImpressionPHP'] = "2222"; $aaa['Details']['ItemID'] = "717223"; $aaa['Details']['ORID'] = "11672"; $aaa['Details']['ProductName'] = "aaaaaaaaa"; //Detailsにkey0がなければ(取得商品が1件だけなら) if(count($aaa['Details'][0]) < 1) { //同じ形式の配列を作成 $bbb['Details'] = array(); //Detailsを展開しながら上記配列の0番目に格納 foreach($aaa['Details'] as $key => $val) { $bbb['Details'][0][$key] = $val; } //一旦初期化 $aaa['Details'] = array(); //格納し直す $aaa['Details'] = $bbb['Details']; } print_r($aaa); ?> 思いつきのベタな方法なのでもっとスマートな方法があるかもしれないですが、 一応上記の方法でデータが2件以上の時と同じ形式になるかと思います^^;

neohiro
質問者

お礼

gogo-tea 様、大変分かりやすくご教授していただきありがとうございました。 お蔭様で「○1件」を表示させることができました。 大変勉強になりました。 この度は、本当にありがとうございました。

その他の回答 (2)

  • gogo-tea
  • ベストアンサー率75% (25/33)
回答No.2

的が外れていたらすみません。。 テスト用を見させていただいたのですが、1件取得の時とそれ以外の時の違いは配列の階層数っぽいですね。 4以外を押した時は   [Details] => Array     (       [0] => Array         (           詳細データ         )       [1] => Array         (           詳細データ         )       [2] => Array         (           詳細データ         )      ) となっていますが4を押した時は   [Details] => Array     (       詳細データ      ) となっているのでこれを   [Details] => Array     (       [0] => Array         (           詳細データ         )      ) といった配列に格納できるように直せたらとりあえずは 1件以外の時と同じ状態になりそうなきがしますが・・・。

neohiro
質問者

補足

gogo-tea 様、ご助言ありがとうございます。 > 1件取得の時とそれ以外の時の違いは配列の階層数っぽいですね。 やはり、そこなんですよね。 Webサービスから返ってくるデータの配列を、こちら側からなんらかのPHPプログラムで変更できるんでしょうか? PHPプログラミングは始めたばかりで、何かおかしなことを言っていたらすいません。

  • mickymac
  • ベストアンサー率37% (90/240)
回答No.1

デバッグ用にクエリーと、変数を画面に表示させ、そこからあやしそうな 部分を修正していくことで原因を絞っていけるかと思います。○1件の場合 のページング処理がおかしいことがわかっているのですから、その際に ページングに利用している変数を追っていけばよいのではないでしょうか。

neohiro
質問者

補足

mickymac 様、お世話になります。 当方、PHPは素人でただいま勉強中の身です。 ページングのコードもこちらで教えていただいたサンプルをもとに 実装させていただきました。 Webサービスから返ってくる変数は変わらないのに、なぜ「○1件」の時だけおかしくなるのか、今ひとつ理解できない状態です。 スキル不足でお恥ずかしいです。 下記はページング処理時のコードです。 //ページング $countRe=$result['TotalResults']; pager($_GET["page"],$countRe); function pager($id,$countRe){ if($id=="") $id=1; $str = urlencode($_GET['sword']); $word = mb_convert_kana($str, "KV"); $maxPage=ceil($countRe/10); if($maxPage==1 or $maxPage<$id) return false; if($id>6){ $startPage=$id-5; $startMore="<a href=\"$PHP_SELF?page=".($startPage -1)."&sword=".$word."\">&lt; 前へ</a>"; }else{ $startPage=1; } if($id+5<$maxPage){ $endPage=$id+5; $endMore=" <a href=\"$PHP_SELF?page=".($endPage+1)."&sword=".$word."\">次へ &gt;</a>"; }else{ $endPage=$maxPage; } $page_footer=""; for($i=$startPage;$i<=$endPage;$i++){ $page_footer.=" ".(($id==$i)?"<span style='font-Size:120%'>$i</span>":"<span class='pageNo'><a href=\"$PHP_SELF?page=$i&sword=".$word."\">$i</a></span>"); } $page_footer=$startMore.$page_footer.$endMore; print "<div class='pageFooter'>".$page_footer."</div>"; } 下記はテスト用のWebアプリです。Webサービスからの戻り値を「print_r ($result)」で表示しています。 //テスト用 http://www.do-kuchikomi.net/PHP/test_new.php?page=4&sword=%E3%83%95%E3%82%A7%E3%83%AD%E3%83%81%E3%82%AB+%E3%83%9B%E3%83%BC%E3%82%AF 大変恐縮ですが、今一度ご教授お願いできないでしょうか? 何卒よろしくお願いいたします。

関連するQ&A