PHPの初心者で、商品検索APIを作っています。


ここでも質問したのですが、回答が分かりにくかったので、もう一度質問してみます。
http://q.hatena.ne.jp/1298919367

誰かのサイトですけど、こんな感じで商品一覧があって、クリックしたら詳細ページに飛びたいのです。
http://party-dress.jp/dress/dress?genre=dress&page=1
(セッションで受け取れば?という感じの回答ありましてセッションも調べてますが、
初心者ならセキュリティ面は何を使っても見られるのであまり変わらないみたいですね)

最初の一覧ページがforeachで並べられているとすれば、
次の詳細ページがどうやって受け取ればいいのか分かりません。

イメージとしては、一覧ページでForeachを並べておいて、
その中の商品がクリックされたら、商品IDだけを受け取って、次のページで更に詳細な情報をAPIで受け取って並べようかと思ったりしています。
こんな感じのイメージで、実現出来るのでしょうか?

良く分かっていないので、何か、ヒントとか、参考になりそうな事を宜しくお願いいたします。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2011/03/05 14:12:13
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:tdoi No.1

回答回数174ベストアンサー獲得回数75

ポイント300pt

大きく3つくらい方針を上げてみました。擬似コードのようなものを載せてみましたが、動作確認していないので、おかしかったらごめんなさい。

大雑把に言うと、詳細ページに対して、

1.表示すべき必要なデータをすべて渡す

2.表示すべき必要なデータを取得するための情報を渡す。

の2種類があります。

その上で、詳細ページでは

A.データを楽天APIを使って取得しなおす。

B.一覧ページで取得したものを流用する。

という2種類のデータの取得の方法があります。

これらの組み合わせ方で方針が変わってきます。

(※1-Aは意味がないので、3種類になります。)

・方法1 (1-B方式)

一番泥臭く、美しくない気はしますが、動きは分かりやすい方法です。おススメはしません。

詳細ページで表示したい情報をすべて、渡してしまう方法です。以下のサンプルではフォームで記述していますが、タグのURLパラメタに全部押し込んでもありだとは思います。

//一覧表示スクリプト

foreach ($xml->Body->itemsearch->Items->Item as $item) {

    // 一覧の中の1商品の情報を表示
    print <<< HTML
    <div>
        <div>商品名:{$item->itemName}</div>
        <div>価格:{$item->itemPrice}</div>
        <form action="詳細表示スクリプト">
             <input type="hidden" name="itemName" value="{$item->itemName}"/>
             ・・・同様に詳細ページで掲載するための情報をhiddenで指定・・・
             <input type=submit"/>
        </form>
    </div>
HTML;
}

// 詳細表示スクリプト

$itemName = $_GET['itemName'];
・・・同様に詳細ページ掲載するための情報を取り出す・・・

print <<< HTML
    <h1>商品名:{$itemName}</h1>
  ・・・その他詳細情報・・・
HTML;

・方法2 (2-A方式)

多分、一番シンプルな方法

詳細ページには商品コードだけを渡して、詳細ページでは商品コードから該当商品の情報を再度取り出して表示する。商品コードから商品情報を取得するAPIも提供されているようなので、それを用います。ただし、詳しく見ていないので、見落としがあったらごめんなさい。

参考:http://webservice.rakuten.co.jp/api/itemcodesearch/

また、データ通信などの無駄があるのも事実ではあるので、必ずしも最適解ではないかもしれないですが、一番無難だと思っています。


//一覧表示スクリプト

foreach ($xml->Body->itemsearch->Items->Item as $item) {
    // 一覧の中の1商品の情報を表示
    print <<< HTML
    <div>
        <div>商品名:{$item->itemName}</div>
        <div>価格:{$item->itemPrice}</div>
        <a href="詳細表示スクリプト?itemCode={$item->itemCode}">詳細</a>
    </div>
HTML;
}

// 詳細表示スクリプト

$itemCode = $_GET['itemCode'];

$url = "http://api.rakuten.co.jp/rws/3.0/rest?developerId=[YOUR_developerID]&operation=ItemCodeSearch&version=2010-08-05&itemCode={$itemCode}"
$data = file_get_contents($url);

・・・$dataを解析して表示する・・・

・方法3 (2-B方式)

セッションを使うのであれば、こんな感じでしょうか。

一覧表示の際に表示した一覧情報をセッション中に格納しておく。その際にそれぞれの商品情報には識別子をつけておき、その識別しのみを詳細表示スクリプトに渡す。詳細表示スクリプトでは、受け取った識別子をもとにセッション情報から該当商品を取得して表示する。

セッションについて理解すると簡単そうですが、ページ遷移が絡んだり、ブラウザで戻ったりした際に正しく実装しないと予想外の表示になるので、あまりおススメはしないです。

//一覧表示スクリプト

$items = $xml->Body->itemsearch->Items->Item;
$_SESSION['item_list'] = $items;
for ($i = 0; $i < count($items); ++$i) {
    // 一覧の中の1商品の情報を表示
    print <<< HTML
    <div>
        <div>商品名:{$items[$i]->itemName}</div>
        <div>価格:{$item[$i]->itemPrice}</div>
        <a href="詳細表示スクリプト?index={$i}">詳細</a>
    </div>
HTML;
}

// 詳細表示スクリプト

$index = $_GET['index'];
$item = $_SESSION['item_list'][$index];

・・・$itemをもとに詳細表示・・・

何かの参考になれば。

id:hiroponta

夜中にも関わらず、非常に丁寧なご回答に大変感激いたしました!

まさに書いて頂いたような形の事を知りたいと思っておりました。

本当にありがとうございます!

お気持ちのポイントも受け取って頂けましたら嬉しいです。

これからも少しずつ勉強していきたいと思います★

2011/03/05 03:57:28

その他の回答1件)

id:tdoi No.1

回答回数174ベストアンサー獲得回数75ここでベストアンサー

ポイント300pt

大きく3つくらい方針を上げてみました。擬似コードのようなものを載せてみましたが、動作確認していないので、おかしかったらごめんなさい。

大雑把に言うと、詳細ページに対して、

1.表示すべき必要なデータをすべて渡す

2.表示すべき必要なデータを取得するための情報を渡す。

の2種類があります。

その上で、詳細ページでは

A.データを楽天APIを使って取得しなおす。

B.一覧ページで取得したものを流用する。

という2種類のデータの取得の方法があります。

これらの組み合わせ方で方針が変わってきます。

(※1-Aは意味がないので、3種類になります。)

・方法1 (1-B方式)

一番泥臭く、美しくない気はしますが、動きは分かりやすい方法です。おススメはしません。

詳細ページで表示したい情報をすべて、渡してしまう方法です。以下のサンプルではフォームで記述していますが、タグのURLパラメタに全部押し込んでもありだとは思います。

//一覧表示スクリプト

foreach ($xml->Body->itemsearch->Items->Item as $item) {

    // 一覧の中の1商品の情報を表示
    print <<< HTML
    <div>
        <div>商品名:{$item->itemName}</div>
        <div>価格:{$item->itemPrice}</div>
        <form action="詳細表示スクリプト">
             <input type="hidden" name="itemName" value="{$item->itemName}"/>
             ・・・同様に詳細ページで掲載するための情報をhiddenで指定・・・
             <input type=submit"/>
        </form>
    </div>
HTML;
}

// 詳細表示スクリプト

$itemName = $_GET['itemName'];
・・・同様に詳細ページ掲載するための情報を取り出す・・・

print <<< HTML
    <h1>商品名:{$itemName}</h1>
  ・・・その他詳細情報・・・
HTML;

・方法2 (2-A方式)

多分、一番シンプルな方法

詳細ページには商品コードだけを渡して、詳細ページでは商品コードから該当商品の情報を再度取り出して表示する。商品コードから商品情報を取得するAPIも提供されているようなので、それを用います。ただし、詳しく見ていないので、見落としがあったらごめんなさい。

参考:http://webservice.rakuten.co.jp/api/itemcodesearch/

また、データ通信などの無駄があるのも事実ではあるので、必ずしも最適解ではないかもしれないですが、一番無難だと思っています。


//一覧表示スクリプト

foreach ($xml->Body->itemsearch->Items->Item as $item) {
    // 一覧の中の1商品の情報を表示
    print <<< HTML
    <div>
        <div>商品名:{$item->itemName}</div>
        <div>価格:{$item->itemPrice}</div>
        <a href="詳細表示スクリプト?itemCode={$item->itemCode}">詳細</a>
    </div>
HTML;
}

// 詳細表示スクリプト

$itemCode = $_GET['itemCode'];

$url = "http://api.rakuten.co.jp/rws/3.0/rest?developerId=[YOUR_developerID]&operation=ItemCodeSearch&version=2010-08-05&itemCode={$itemCode}"
$data = file_get_contents($url);

・・・$dataを解析して表示する・・・

・方法3 (2-B方式)

セッションを使うのであれば、こんな感じでしょうか。

一覧表示の際に表示した一覧情報をセッション中に格納しておく。その際にそれぞれの商品情報には識別子をつけておき、その識別しのみを詳細表示スクリプトに渡す。詳細表示スクリプトでは、受け取った識別子をもとにセッション情報から該当商品を取得して表示する。

セッションについて理解すると簡単そうですが、ページ遷移が絡んだり、ブラウザで戻ったりした際に正しく実装しないと予想外の表示になるので、あまりおススメはしないです。

//一覧表示スクリプト

$items = $xml->Body->itemsearch->Items->Item;
$_SESSION['item_list'] = $items;
for ($i = 0; $i < count($items); ++$i) {
    // 一覧の中の1商品の情報を表示
    print <<< HTML
    <div>
        <div>商品名:{$items[$i]->itemName}</div>
        <div>価格:{$item[$i]->itemPrice}</div>
        <a href="詳細表示スクリプト?index={$i}">詳細</a>
    </div>
HTML;
}

// 詳細表示スクリプト

$index = $_GET['index'];
$item = $_SESSION['item_list'][$index];

・・・$itemをもとに詳細表示・・・

何かの参考になれば。

id:hiroponta

夜中にも関わらず、非常に丁寧なご回答に大変感激いたしました!

まさに書いて頂いたような形の事を知りたいと思っておりました。

本当にありがとうございます!

お気持ちのポイントも受け取って頂けましたら嬉しいです。

これからも少しずつ勉強していきたいと思います★

2011/03/05 03:57:28
id:toki-2131 No.2

回答回数138ベストアンサー獲得回数1

ポイント1pt

↑すすげー

id:hiroponta

久しぶりに見た丁寧な回答ですよね。

2011/03/05 14:11:05

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません