ページングって難しかったですよ。けど、学んだことが多かった!PHP&APIは便利だ!

お粗末なPHP知識で作りましたが、まずはページング版をお試しあれ

下のフォームに入力して『商品検索ボタン』を押すと動作状態を見ることができます。

検索キーワード
価格 円~

アンカーテキストのクリックでも動作させることができます。木村拓哉1000円~5000円の5ページ目をクリックすると、PHPが生成している動的なページが表示されますが、実際にページがあるかのようですね。

ベースとしては使えるページングになったと自己満足?しておりますが、忌憚のないご意見をお待ちしております。基本的なところができたので、今後はフルオプションのAPIパラメータ対応も重要なテーマですね。ウィンドウショッピング形式の対応も忘れてはいけないと思っています。

(2014/07/17追記&訂正)PHPアプリケーション例

従来がらご紹介させていただいておりましたアプリケーションを、最新の楽天商品検索API (version:2014-02-22)や楽天商品ランキングAPI (version:2012-09-27)に対応させました。

全国お取り寄せグルメ(TOPページ),北海道食品全体,食品ランキング,スイーツランキング
渋谷ファッションリアルタイム売れ筋ランキング

※ランキングAPIでは、応答パラメータの仕様上、取得ページ数が不明なため、暫定的に10ページまでページングしています。リアルタイムパラメーターを有効にした場合には、APIの応答が1ページのみ(ベスト20件)に限定されているため、ページング処理はありません。

ページングとはAPIリクエストの仕組みを知るまでは成し得ない技術であった

現在の状態に至るまでの手順をご説明していきましょう。それは、私の為のメモでもある訳です。

APIリクエストURLとパラメーターの構造

http://api.rakuten.co.jp/...?パラメーター1名=パラメータ1&パラメーター2名=パラメータ2&パラメーター3名=パラメータ3...&page=ページ番号

最初の部分がAPIリクエストURL、赤部がパラメーター群です。?がパラメーターの始まりで、&がパラメーターの区切りです。必要なだけパラメーターを渡す訳ですが、重要なのは最後のpage=のところです。それがページングに不可欠なページ番号です。ページ番号が無いと1ページ目(たぶんデフォルトなんでしょう)が応答されますが、1ページ目だけしか応答されないなら、ページングは成り立ちませんね。

APIリクエストURLにパラメーターを渡す方法

テキストボックスやボタンなどのコントロールの値を渡すだけでは、ページングは実現しません。なぜなら、ページング時の操作対象はページ番号や、ページ送りのリンクなのであって、検索ボタンではないのですから。つまり、ページ番号やページ送りのリンクがクリックされた時にパラメーターを渡す仕組みが必須なんです。・・・ここまで辿り着くまでに、私はどれだけ悶々としたことか

http://・・・/search.php?パラメーター1名=パラメータ1&パラメーター2名=パラメータ2&パラメーター3名=パラメータ3...&page=ページ番号

便宜的にPHPファイル名はsearch.phpとしていますが、これはあなたのサーバーにあるファイルと考えてください。そして、APIリクエストURLのパラメーターと全く同じ構造でパラメーターを追加します。実は、このURLをページ番号やページ送りのアンカーテキストのリンク先とすることこそが、ページング実現の全てだったのです。このページのお試しを利用してかまいませんので各ページのURLをエディタに並べて貼りつけて比較解析してみてください。それでページングは理解できると思います。

ではどうやってPHPでパラメータ値を作るのか?

パラメーター名はAPIに規定されていますので、それを守るだけですが、パラメーター値はちょいと資料を見ておしまいという訳にはいきません。

ページ番号

for ($i=1;$i<=$maxpage;$i++) { ・(略) ・ //$pageに指定された全パラメーターとページ番号をセットして渡すリンクを作成 print("<a href='$PHP_SELF?keyword=" . $key . "&minPrice=" . $_GET["minPrice"] . "&maxPrice=" . $_GET["maxPrice"] . "&submit=" . $sub . "&page=" . $i . "'>". $i ."</a>"); ・(略) }

一度リクエストするとページ数も返されてきます(検索ボタンを押した時がそれに相当)ので、そのページ数に基づいた値を「page=値」としてパラメーターにセットします。一般には、ページ数に基づいてforループなどを形成して各ページのリンク先URLを作成するので、ループ用の変数値を用いることができます。

コントロールの値(ページ上のお試しではキーワード,最低価格,最高価格,検索ボタン)

PHPでは、コントロールの値を取得するのはお手の物です。但し、XHTMLの記述に関連して2種類の方法を使い分ける必要があります。

<form action="・・・.php" method="get"> <input type="text" name="keyword" ・・・ ・ ・ </form>

このように、methodにgetを指定した<form>タグでコントロールを設置している場合には、PHPでは $_GET["コントロール名"]で簡単に取得できます。上のリストの例では$_GET["keyword"]ですね。

<form action="・・・.php" method="post"> <input type="text" name="keyword" ・・・ ・ ・ </form>

methodにpostを指定した場合には、$_POST["コントロール名"]です。お手の物ですね。

注意:$_GETや$_POSTで取得した値は、UTF-8にエンコードする必要がある場合があります(楽天検索APIのkeywordパラメーターはそれに該当)。APIをよくご確認の上、UTF-8エンコードが必要な場合には、urlencode("文字列")関数でエンコードしてください。

旧バージョンの楽天APIが廃止になるようです

2014年8月に、楽天商品検索APIを中心に旧バージョンのAPIが廃止になると連絡がありました。

廃止対象は次のとおり

楽天商品検索API
・Version(2010-09-15)
・Version(2010-08-05)
・Version(2010-06-30)
・Version(2009-04-15)
・Version(2009-02-03)
・Version(2008-09-01)
・Version(2007-10-25)
・Version(2007-04-11)
楽天ジャンル検索API
・Version(2007-04-11)

楽天商品検索API (version:2014-02-22)サンプルコードの無償配布について

私の場合、このページでご紹介したサイトなどでVersion(2010-08-05)を使っておりました。そこで、最新のversion(2014-02-22)への対応が必要となりました。ところがversion(2014-02-22)には、機能追加があり便利になった部分もあるのですが、簡単な置き換え作業ですんなりと動いた訳ではありません。(例えば、出力パラメータの振る舞いが異なった部分があることに起因し、結果の表示やページング処理に種々の試行と修正が必要でした)
現在使用のバージョンが来月廃止という時期に通知を受けましたから、かなり焦りました。(サイト数のせいもありますが)丸々5日はかかる作業だったでしょうか。
同様にお困りの方が多いと思いますので、楽天商品検索API (version:2014-02-22)のサンプルコードを配布することに致しました。規約上、有償配布は禁じられていますので勿論無償です。
動作サンプルとしては、木村拓哉1000円~5000円の5ページ目をご確認ください。尚、配布するサンプルコードの$applicationIdと$affiliateIdは、仮のものが入っていますので、あなた様のapplicationIdとaffiliateIdに書き換えてください。(ソース23行、30行)

サンプルコード利用の免責事項・規約

・サンプルコードの使用による如何なる損害に対しても提供者は責任を負わないものとします。
・第3者への再配布を禁止します。
・使用に際しては、楽天アフィリエイトパートナー規約および楽天ウェブサービス規約に準じてください。
お問い合わせページからご一報ください。(任意)

同意してダウンロードする

講座メニュー

テーマを決めよう

ツールを準備しよう

サーバーを準備しよう

ウェブデザイン

検索エンジン最適化

PHP

HP公開:
2011/07/23
最終更新:2014/07/23