<< 式を演算子を使ってまとめたい。 質問一覧 XML形成式 >>
  • キーワードが設定されていません

  • 0P
php メタ検索エンジンのページング処理について

はじめまして。php初心者です。
メタ検索エンジンのオープンソースをいじりながら勉強しているんですが、検索結果のページング処理で手詰まりしています。
本やネットでやり方を探して試してみるものの、よくわかりませんでした。。1ヶ月近く悩んでいます。

参考にしたオープンソースのサイト
http://tools.seobook.com/authority-finder/
オープンソースダウンロードページ
http://tools.seobook.com/authority-finder/index.htm#source

ページのリンク表示まではうまくいったんですが、
1ページ内に検索した結果がすべて出てしまい、うまく分割して表示できません。
また、どのページをクリックしてもすべて同じ検索結果になっています。
うまく表示するにはどうしたらいいでしょうか?
ご教授お願いします。
また、参考になるサイト等ありましたら教えてください。

○拾ってきたソースはmysql等DBは使っていなかったので、
今の段階では使っていません。




○データはyahoo等検索エンジンのAPIを使ってデータを持ってきています。
○10件ずつ表示したいと思っています。
○pear::pagerを使おうと思っています。自らpagerを使おうとしたのですが、思ったようにページング処理ができませんでした。パラメータ"itemData"に対してうまくデータが送れてないみたいなのですが、
下記のfunctionの情報をどのようにしたらうまく値を送れるようになりますか?

○自分のサーバーを使っているので、モジュール等の利用制限は特にありません。

以下、表示処理部分のソースを載せさせていただきます。
これはページング処理等されていません。1ページにすべての検索結果が出ます。
  1. <?php
  2. function show_results() {
  3.  
  4. global $final_results,$result_strengths,$bias,$modes,$num_results,$unique_sites,$engine_site_list,$alexa_ranks;
  5.  
  6. $already_added = array();
  7.  
  8. echo "<div id=\"all-page\" class=\"tabs\"><divstyle=\"position: relative;\">\n";
  9. // Second div is to fix an IE6 bug with relative positioning
  10.  
  11. $result_count = 1;
  12.  
  13. if (is_array($result_strengths)) {
  14. foreach ($result_strengths as $url=>$strength) {
  15.  
  16. $percent_strength = round($strength / count($bias) /$num_results * 100);
  17. $engines = array();
  18. $description = array();
  19. $engine_count = 0;
  20.  
  21. foreach ($final_results as $site) {
  22. if ($site["url"] == $url) {
  23.  
  24. $title = $site["title"];
  25. $engines[$site["engine"]] = $site["engine"] . "(" . $site["position"] . "";
  26. $description[$site["engine"]] = " <div class=\"" . $site["engine"] . "\">" . $site["desc"] . "</div>\n";
  27.  
  28. $engine_count++;
  29. }
  30. }
  31.  
  32. if (isset($_GET['alexa']) && $_GET['alexa'] == 'on') $alexa_ranks[$url] = get_alexa_rank('​http://'​ . $url);
  33. $engine_site_list[$url] = $engines["google"] . $engines["yahoo"] . $engines["msn"] . $engines["jeeves"];
  34.  
  35. $discard = 0;
  36.  
  37. foreach ($modes as $engine=>$required) {
  38. if (($required == 'require') && ($engines[$engine] == '')) { $discard = 1}
  39. }
  40.  
  41. if ($discard == 0) {
  42. echo " <div class=\"result\">\n";
  43. echo " <div class=\"title\"><a href=\"​http://"​ .$url . "\">" . $title . "</a></div>\n";
  44. echo " <div class=\"desc\">\n";
  45. echo $description["google"] . $description["yahoo"] .$description["msn"] . $description["jeeves"];
  46. echo " </div>\n";
  47. echo " <div class=\"url\">" . $url . "</div>\n";
  48. echo " <div class=\"engine\">#$result_count - <span class=\"percent\">$percent_strength%</span> - ";
  49. echo $engine_site_list[$url];
  50. if ($_GET['alexa'] == 'on') echo "<span class=\"alexa\"> - <a href=\"http://www.alexa.com/data/details/?url=$url\">Alexa Rank: " . $alexa_ranks[$url] . "</a></span>";
  51. echo " </div>\n";
  52. echo " </div>\n";
  53. }
  54. $result_count++;
  55. }
  56. }else {echo('Search returned 0 results');
  57. }
  58. echo "</div></div>\n";
  59. }
  60. ?>

長々と見づらくてすみません。
どうかわかる方、ご教授いただけたらとてもうれしいです。
よろしくお願いします。

この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。

Qphp メタ検索エンジンのページング処理について boobydog  [03月08日 21時12分] 
┗満開Re:php メタ検索エンジンのページング処理について magicflute2  [03月09日 10時42分] 
  ┗Re:Re:php メタ検索エンジンのページング処理について boobydog  [03月09日 14時30分] 

コメント一覧

並び替え( ツリー順 / 投稿順[降順] / 投稿順[昇順]

Re:php メタ検索エンジンのページング処理について

Authority-Finder、各種API、PEAR_Pager
いずれにも慣れていないとすれば、一度に覚えるのは非常に大変です。
PEAR_Pagerの代替案として、以下の様にするのはいかがでしょう。
  1. <?php
  2. /**
  3.  * HTML出力結果例
  4.  * Google | MSN
  5.  * あいうえお
  6.  * かきくけこ
  7.  * さしすせそ
  8.  * 1 2
  9.  */
  10. // まずは、検索結果をこういう状態にする
  11. $search_results = array( array( '*****' => 'あいうえお' ),
  12.                          array( '*****' => 'かきくけこ' ),
  13.                          array( '*****' => 'さしすせそ' ),
  14.                          array( '*****' => 'たちつてと' ),
  15.                          array( '*****' => 'なにぬねの' ),
  16.                          array( '*****' => 'はひふへほ' ),
  17.                          array( '*****' => 'まみむめも' )
  18.                        );
  19.  
  20. // 検索エンジン毎に、検索結果の配列を返す様に関数化する
  21. // 毎回アクセスせず、将来的にキャッシュを使用する
  22. function Google() { return $search_result}
  23. function MSN() { return $search_result}
  24. // 
  25. ?>
  26. <a href="?engine=google">Google</a> <a href="?engine=msn">MSN</a>
  27. <?php
  28. // 検索エンジンを切り替える
  29. if (isset($_GET['engine'])) {
  30.   $engine = $_GET['engine'];
  31.   switch ($engine) {
  32.     case 'google':
  33.       $search_results = Google();
  34.       break;
  35.     case 'msn':
  36.       $search_results = MSN();
  37.       break;
  38.     default:
  39.   }
  40. }
  41.  
  42. // 検索結果を10件なので、m、nの初期値は0、9
  43. $search_results[mn]['*****'];
  44. // ページリンクには、?start=0&end=9の様に指定する
  45. // ページリンクが増える毎に、10~19・・・の範囲をとる
  46. $start  = (isset($_GET['start']))?
  47.             htmlspecialchars($_GET['start'],ENT_QUOTES):0;
  48. $end    = (isset($_GET['end']))?
  49.             htmlspecialchars($_GET['end'],ENT_QUOTES)  :9;
  50. $engine = htmlspecialchars($engineENT_QUOTES);
  51. $query  = '?start='.$start.'&end='.$end.'&engine='.$engine;
  52. ?>
  53. <a href="<?php echo $query?>">1</a>
余談:
本当は、クラス化して、Strategyパターンが使えるケース。

Re:Re:php メタ検索エンジンのページング処理について

ご返信ありがとうございます。
使わない方法でこんなに短い表記で表示できるんですね。
驚きました!

しかし、昨日いじっていたら独自解決してしまいました。
せっかく案を頂いたのにすみません。。。

結局 pear::pager を使ってできました。
単純なことに大きな時間を使ってしまっていたことが恥ずかしい・・・。

先日載せさせて頂いたコードの中の14行目

  1. foreach ($result_strengths as $url=>$strength) {

これの前にpear::pager を何とか組み合わせることが出来ました。

  1. <?php
  2.     
  3. if (is_array($result_strengths)) {
  4.  
  5.       //上で説明したforeach構文の上(if構文と、foreach構文の間)に新しく以下の文を追加 
  6.       //ページング処理を追加 pear::pager挿入 はじまり
  7.         
  8.         $itemData = $result_strengths;
  9.        $totalItems = count($result_strengths);
  10.  
  11.        $options = array(
  12.          "itemData"   => $itemData,
  13.          "totalItems" => $totalItems,
  14.          "delta"      => 10,
  15.          "perPage"    => 10,
  16.          "mode"       => "sliding",
  17.          );
  18.  
  19.        $pager         =& Pager::factory($options);
  20.        $navi          = $pager -> getLinks();
  21.        $currentPageID = $pager -> getCurrentPageID();
  22.        $offset        = $pager -> getOffsetByPageId();
  23.       
  24.     //ページング処理を追加 pear::pagerライブラリ挿入 おわり
  25.  
  26. /*
  27. また、上であげた
  28. foreach ($result_strengths as $url=>$strength) {
  29.  
  30. 構文内の 「$result_strengths」 を 「$pager->getPageData()」 にしました。
  31.  
  32. $result_strengths はページング処理追加部分で $itemData=$result_strengths;
  33. としてpager に一度dataを通しています。
  34. あとはそのまま基の文と同じです。
  35. */
  36.  
  37. //最後58行目の上にページングのリンク表示 「print($navi["all"]);」を貼り付けて処理はおわりました。
  38.     print($navi["all"]);
  39.     echo "</div></div>\n";
  40. }
  41. ?>

$result_countの表記が10以降の表示がループしていてできないんですが、
自力で直せるよう努力します。

せっかく教えてくださったのに本当にすいませんでした。

まだページ処理しなくてはいけない箇所があるので、
教えて頂いたソースはそのとき困った場合にまた参考にさせていただきます。

magicflute2さん。
本当にありがとうございました。

同じような悩みの方もこのページを是非参考にしていただけるとうれしいです。
式を演算子を使ってまとめたい。 質問一覧 XML形成式