SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

目的に応じて適材適所で使うPHPライブラリ

RSS、XMLをAjax+JSONPで表示するブログパーツを作成

目的に応じて適材適所で使うPHPライブラリ(6)


Service_Amazonによる商品検索

 Service_Amazonには、Product Advertising APIを利用した商品検索結果をキャッシュに保存しておく機能があります。その際にはCacheライブラリを使用しています。Cacheライブラリ内のCacheクラスではキャッシュする形式を「コンテナ」といい、String型の変数で指定します。さらにその際のオプションを「コンテナオプション」として配列で指定します。コンテナの種類にはPEAR/DB、file、PEAR/MDBなどがあります。詳しくはPEARの解説ページで確認できます。

 Service/Amazon.php内でCacheライブラリを使用している部分はsetCacheメソッドで以下のコードになります。

[リスト15]Amazon.php(抜粋)
function setCache($container = 'file', $container_options = array())
{
    if(!class_exists('Cache')){
        @include_once 'Cache.php';
    }
    
    @$cache = new Cache($container, $container_options);

 Amazon_ServiceではCacheライブラリの「file」形式でキャッシュ内容をファイルに出力することが分かります。Cacheライブラリの「Cache_Container_file」では、「$container_options」として指定できる配列の要素に次のようなものがあります。

container_optionsとして指定する要素
配列のキー 概要
cache_dir キャッシュさせるファイルの出力先ディレクトリ
fileLocking キャッシュさせるファイルをロックするかどうか
filename_prefix ファイル名の指定

 詳しくはPEARのCache_Container_fileクラスの解説ページで確認できます。サンプルではAmazon_ServiceのsetCacheメソッドを利用する際に「cache_dir」でキャッシュ先ディレクトリのみ指定します。

 その他のService_Amazonの主なメソッドは次の表のとおりです。

Service_Amazonの主なメソッドの概要
関数名 概要
setLocale(ロケール) Amazon Web Serviceを利用する国を指定します。現在は「US, UK, DE, JP, FR, CA」の指定が可能です
setCacheExpire(秒) キャッシュする時間を秒で指定します
ItemSearch(検索対象, オプション) BooksやDVD等の検索対象を指定してAPIを呼び出してAmazon内で商品検索を行います
TagLookup(タグ, オプション) タグで商品検索を行います
SimilarityLookup(商品ID,オプション) 指定した商品と類似の商品を検索します

 本サンプルで利用するItemSearchメソッドのオプションは、以下のパラメータをキーとして配列で指定します。指定できるパラメータは非常に多いため、代表的なもののみ記載します。詳しくはAmazonのAPIドキュメントページを参照ください。

ItemSearchメソッドで指定できる主なパラメータ
パラメータ名 概要
Keywords 検索するキーワードを指定する
Title 商品のタイトルを指定する
Artist アーティスト名を指定する
Author 作者名を指定する
Actor 俳優名を指定する
ResponseGroup 返されるデータの種類を指定する

 Amazon Web Service登録時に発行された「ACCESS KEY ID」と「SECRET ACCESS KEY」、アフィリエイト機能を利用する場合はAmazonアソシエイト登録時に発行されるアソシエイトIDをconfig.phpに記述します。

[リスト16]config.php
$ACCECSS_KEY_ID    = 'ACCESS KEY ID';
$SECRET_ACCESS_KEY = 'SECRET ACCESS KEY';
$ASSOC_ID          = 'アソシエイトID';

 Amazonでの商品検索実行部分はUtil.class.php内のgetDvdInfoメソッドに実装します。女優名を受け取ってドラマのDVDを検索します。ItemSearchメソッド実行の際にオプションで「Actor」を女優名とすると映画の検索結果が出てくるので、「Keywords」に「女優名+ドラマ」として検索します。

 Product Advertising APIより返却される商品検索のXMLのフォーマットは以下のようになります。

[リスト17]Product Advertising APIより返却される商品検索結果のXMLのフォーマット
<?xml version="1.0" encoding="UTF-8"?>
<ItemSearchResponse xmlns="http://webservices.amazon.com/AWSECommerceService/2009-11-30>
  <OperationRequest>
  <Items>
    <Request>
      <IsValid>True</IsValid>
      <ItemSearchRequest>
        <Keywords>「検索に使用したキーワード」</Keywords>
      </ItemSearchRequest>
    </Request>
    <TotalResults>「検索結果総件数」</TotalResults>
    <TotalPages>「総ページ数」</TotalPages
    <Item>
      <ASIN>「ASINナンバー」</ASIN>
      <DetailPageURL>「Amazon内の商品詳細画面へのURL」</DetailPageURL>
      <SmallImage>
        <URL>「小画像のURL」</URL>
        <Height>「高さ」</Height>
        <Width>「幅」</Width>
      </SmallImage>
      <MediumImage>
        : * SmallImageと同じフォーマット
        :
      </MediumImage>
      <LargeImage>
        : * SmallImageと同じフォーマット
        :
      </LargeImage>
      <ItemAttributes>
        <Author>「著者名」</Author>
        :
        :
        <ProductGroup>「Books, DVDなど商品の種別」</ProductGroup>
        <Title>「商品名」</Title>
      </ItemAttributes>
    </Item>
        :
        :
  </Items>
</ItemSearchResponse>

 Service_AmazonではItemSearchメソッドで受け取った結果は、XMLのタグ名がそのままキーとなった配列となっているので、各要素へのアクセスは配列データを扱う場合と同じ処理で可能です。キーワードを指定してItemSearchメソッドで商品検索を行い、結果を解析するコードは以下のようになります。

[リスト18]Util.class.php(抜粋)
function getDvdInfo($word){
    
    ini_set('error_reporting', 6143);
    require_once 'Services/Amazon.php';
    
    // Service_Amazonをコール
    $amazon = new Services_Amazon(
                            $this->_ACCECSS_KEY_ID,    // アクセスキー
                            $this->_SECRET_ACCESS_KEY, // シークレットアクセスキー
                            $this->_ASSOC_ID           // アソシエイトID
                    );
    // 日本を指定
    $result = $amazon->setLocale('JP');
    // キャッシュ設定  ファイル、ディレクトリを指定
    $result = $amazon->setCache(
        'file', array( 'cache_dir' => 'cache/')
    );
    
    // 検索結果を24時間キャッシュ
    $amazon->setCacheExpire( 24 * 60 * 60 );
    
    // 検索対象
    $search_key = "DVD";
    
    // 検索オプションを指定
    $options = array();
    $options['Keywords'] = $word;
    $options['ResponseGroup'] = 'Medium';
    
    // 検索の実行
    $result = $amazon->ItemSearch($search_key, $options);
    
    // 返却するための配列
    $_return = array();
    // 画像がある検索結果を1件取得して返却する
    foreach ($result['Item'] as $item) {
        if( array_key_exists('MediumImage',$item) ){
            // 商品名
            $_return['dvdTitle'] = $item['ItemAttributes']['Title'];
            // 中サイズ商品画像URL
            $_return['dvdImage'] = $item['MediumImage']['URL'];
            // 商品詳細URL
            $_return['dvdUrl']   = $item['DetailPageURL'];
            break;
        }
    }
    return $_return;
}

 先のXMLフォーマットより商品検索の結果で返却される「Item」要素内の商品名、中サイズ画像のURL、商品詳細URLを1商品分取得して返却します。中サイズの商品画像がないものもあるため、商品が格納されている配列に 'MediumImage' の要素があるか判定して商品情報を取得しています。

 PHP 5.3ではService_Amazonをそのまま呼び出すと「Deprecated: Assigning the return value of new by reference is deprecated・・・」というエラーが出ます。

 このエラーはServices_Amazonが以下のようにオブジェクトを生成するときに「&」をつけてnewしていることに対する警告メッセージです。

[リスト19]Amazon.php(抜粋)
$http = &new HTTP_Request($url);

 この警告はPHPの動作には影響がないと思われますので、Service_Amazonを呼び出す前に「ini_set('error_reporting', 6143);」を記述してエラーメッセージを出力しないようにしています。

次のページ
ブログパーツにDVDの情報を表示する

この記事は参考になりましたか?

目的に応じて適材適所で使うPHPライブラリ連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 片渕 彼富(カタフチ カノトミ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/5065 2010/10/04 10:40

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー