PHPの質問です。


楽天APIのコードを、同じページで2回使いたいと思うのですが、2回目だとページが真っ白になってしまいます。

例えば、「サイドバーではカバンを5つ表示させる(この場合、コードは1つ)」だと普通に表示できるのですが、
「サイドバーにカバンを5つと、フッターに靴を5足(この場合、コードは2つ)」と、
同じコードを使い、キーワードだけ違うものを入力すると、上手く表示されません。

複数同じコードを違い、キーワードだけ変えて出力して表示したい場合の
処理というのは、どうすれば良いのでしょうか?

回答の条件
  • 1人3回まで
  • 13歳以上
  • 登録:2011/03/29 10:44:31
  • 終了:2011/03/29 11:54:44

ベストアンサー

id:y-kawaz No.1

y-kawaz回答回数1421ベストアンサー獲得回数2262011/03/29 11:04:53

ポイント150pt

プログラムのコードがどうなってるか分からないので大雑把なアドバイスになりますが…。

楽天WEBサービスAPIのコトですよね多分。

一番ありそうなのは単純にプログラムのバグですが、次によくあるのは楽天APIの実行頻度制限に引っかかっていることです。

楽天WEBサービスの各APIは1秒間に1回の呼び出ししか出来ません。この頻度を超える間隔でアクセスするとエラー扱いでデータは返って来ないようになってます。

多少は1秒1回を超えてもアクセスできると思いますが、慢性的に制限を越えるようですとデベロッパーIDの停止もあります。

特にここ1年くらいで運用が厳しくなっているようで気を付けないとすぐに止められてしまうようです。

http://webservice.faq.rakuten.co.jp/app/answers/detail/a_id/1426...


まずは1ページの中に2回楽天APIを呼んでいる箇所があるとすると思うので試しに、その呼び出しコードの間に sleep(1); とかを挟んでみたら変化が無いでしょうか?

それで表示されるようになるようであれば呼び出し制限の可能性が高いです。


また、1ページ内でsleep(1)とかを挟んで1秒1回以下に抑えたとしても、複数ユーザが同時にアクセスしてくるることも考えると、それだけでは対策が足りないことになります。

根本的な対策としてはプログラム側でキャッシュを利用して、またロック処理をって1秒に1回以上の呼び出しが発生しないようにするなどの工夫をする必要があります。

id:love-peanut

ご回答ありがとうございます。

コード自体は、「公開API活用ガイド」のサンプルをそのまま使用していて以下のものになります。

http://www.kohgakusha.co.jp/books/detail/978-4-7775-1536-3

初心者で申し訳ないのですが、sleep(1); をどこに入れたら良いのか分からないので、

教えていただけると幸いです。

もしくは、プログラムのバグの指摘(こうすれば、同じコードを2回使用できる)などでも助かります><。



<?php

//楽天から商品を検索してHTMLタグを返す関数
function search_rakuten($keyword,$limit){

  //developerIdを設定する
  $developerId = '取得したデベロッパーID';

  //affiliateIdを設定する
  $affiliateId = '取得したアフィリエイトID';

  //使用するAPIの操作名を設定する
  $operation = 'ItemSearch';

  //バージョンを設定する
  $version = '2009-04-15';

  //取得件数を設定する
  $hits = $limit;

  //検索キーワードをURLエンコードして設定する
  $text = urlencode($keyword);

  //人気の高い順に検索する
  $sort = urlencode("standard");

  //URLを生成する
  $url = 'http://api.rakuten.co.jp/rws/3.0/rest?'.
         'developerId='.$developerId.
         '&affiliateId='.$affiliateId.
         '&operation='.$operation.
         '&version='.$version.
         '&keyword='.$text.
         '&hits='.$hits.
         '&sort='.$sort;

  //RESTで返されるXMLファイルを取得する
  $str = file_get_contents($url);

  //XMLを解析してオブジェクトにセットする
  $xml = simplexml_load_string($str);

  //xpathによって、Item要素だけを取り出す
  $Items = $xml->xpath('//Items/Item');

  //divタグでくくる
  $ret = '<div id="rakuten_item">';

  //Item数だけ繰り返す
  foreach($Items as $Item){
    $ret .= '<a href="'.$Item->affiliateUrl.'">';
    $ret .= '<img src="'.$Item->mediumImageUrl.'" alt="'.$Item->itemName.'">';
    $ret .= "</a>\n";
  }

  //divタグを閉じる
  $ret .= '</div>';

  //作成したHTMLを返す
  return $ret;
}

//検索ワードを設定する
$keyword = "スイーツ";

//取得数を設定する
$limit = 5;

//楽天から商品を検索して表示する
echo search_rakuten($keyword,$limit);

?>
2011/03/29 11:29:05
  • id:y-kawaz
    もしかして2回使うというのはそのコードまるごと全てを2回コピペで記述してるんでしょうか…?
    だとしたら同じ名前の関数の2重定義ってことでphpのエラーで画面が真っ白になってるだけだと思います。

    簡単に説明すると、
    function search_rakuten($keyword,$limit){

    }
    の部分は関数定義をしているだけです。関数は1度定義すれば2回呼べます。逆にこれを2回書いてはいけません。
    echo search_rakuten($keyword,$limit); の部分だけを2箇所に書けばよいですハズ。
    とりあえずこれでまっ白な画面は避けられると思います。

    アクセス頻度制限以前の基本的な話なので、まずはPHPの勉強からちゃんとした方が良いと思います…。
  • id:love-peanut
    はい、丸ごとコピペで使用しておりました・・。


    ご指摘の通り、2回目はecho search_rakuten($keyword,$limit); の
    記述だけで表示されました!夢のようです><。


    これからどんどん勉強していきたいと思います。ありがとうございました!

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

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

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

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません