デジットさんの生活便利サイトトップへ デジットさんのAmazonECS実用版(PHP)

トップページ > ホームページ作成 > AmazonECS実用版

PHPのPEARを使った「AmazonECS」の実用版です。テンプレートエンジンのSmartyのループ表示を利用して、検索した商品を指定した任意の商品数ずつ表示させることが出来ます

AmazonECS実用版の仕様

SmartyでAmazonECSで、テンプレートエンジンSmartyを使ってアマゾンの商品を検索して表示する方法をお教えしました。今回は、更に進んで検索した商品を指定した商品数まで表示できるようにしました。
表示のデザインなどを整えれば、そのまま応用できるレベルです。以下、サンプルリストと説明を行います。

AmazonECS実用版用テンプレートファイル

SmartyでAmazonECSから、変えたところだけ説明します。ファイル名は、"amazon_loop2.tpl"とします。
{$ttl}にがアマゾンで検索した商品数が表示されます。{$ttl_pg}は、アマゾンの検索結果のページ数です。1ページには10商品のデータがあります。{$item.am_id}は、検索結果の順番を表示します。商品数が1回では表示しきれない場合、{$befr}が前のページ・{$nxt}が次のページへのリンクです。

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>PEAR Amazonウエブサービス(実用版)</title>
</head>
<body>
<div style="text-align:center"><br/>
商品総数:{$ttl}  商品ページ数:{$ttl_pg}<br/>
{$befr}         {$nxt}<br/>

{foreach from=$lines item=item}
{$item.am_id}<br/>
<a href = "{$item.am_url}">
<img src ="{$item.am_img}" width ="{$item.am_wdth}" height="{$item.am_hght}" border="0"/><br/>{$item.am_ttle}</a><br/>
{$item.am_prc}<br/>
{/foreach}
</div>
</body>
</html>

AmazonECS実用版の実行ファイル

SmartyでAmazonECSから、変えたところだけ説明します。ファイル名は、 'amazon_prct.php'とします。
「$lim」は、検索した商品の表示数をセットします。いつつでも大丈夫です。検索結果が表示商品数に足りない場合は、検索数だけ表示できます。「$pg」は、この検索ホームページ(自分)のページ数を表します。表示した数より検索商品数が多い場合は自動的に計算され、次のページ(前のページ)への「url引数」となります。最初は、"0"です。次のページに移行したときは、「 $_GET['pg'] 」で「url引数」が取得されます。「$thispg 」には、自分のページを記載します。
「$i_page 」は、アマゾンの商品10個単位のページ数です。アマゾンの検索結果(2ページ以降)を取得するには、ページ数の指定が必要になります。同じIPアドレスへは、1秒1回コールの決まりがありますので、キャッシュを有効に利用する必要があります。
「 $result['TotalResults']」は、アマゾンで検索した商品の総数が、「$result['TotalPages']」には、アマゾンの商品のページ数が入りますので、自分の表示したい商品数「$lim」から、現在のページより次と前のページのリンク先計算をしてリンクアドレス「$nxt」と「$befr」を計算します。
その次はややこしいですが、自分の現在のページで表示する商品の範囲とアマゾンのページでの商品位置とをあわせこみ、配列「$lines」に格納しています。アマゾンのページ(10商品)をまたがる時は、続けてデータを取得し配列「$lines」に追加していきます。
それと、アマゾンの検索結果を配列「$lines」に格納するところは、カスタム関数「get_data()」に定義して、使いやすくしました。

<?php
//検索のための読み込みページなどの処理
$lim =22;// 取り出して表示する数
$pg = 0 + $_GET['pg'] ;//表示するページの位置(ページ取得の引数)
$thispg = 'amazon_prct.php';//自分のページを記載
//Amazonウエブサービス(Smartyのループ表示)のテスト
$search = 'Books'; //サーチインデックス
$key_w = 'PHP'; //キーワード
$brows_n = 466298 ; //ブラウズノード
$sort_i = 'salesrank'; //ソート条件
$i_page = 1 + floor(($pg*$lim)/10); //取得するページ
//PEAR::Amazon
require_once 'Services/AmazonECS4.php';
//PEAR::Cache キャッシュ
require_once 'Cache.php';
$amazon = new Services_AmazonECS4('自分のAccess Key ID','自分のAssociate ID');
//Access Key ID,Associate ID
$amazon -> setLocale('JP');
$amazon -> setCache('file',array('cache_dir' => '/ここにキャッシュディレクトリへのフルパスを記載/cache/'));
$amazon -> setCacheExpire(3600); //キャッシュの保持時間(秒)
$options = array(
'Keywords'=> $key_w ,
'BrowseNode' => $brows_n,
'Sort' => $sort_i ,
'ResponseGroup'=>'Small,Images,ItemAttributes,//情報種類/画像/価格
'ItemPage' => $i_page ,
);
//Accessに接続しデータを取得
$result = $amazon -> ItemSearch ( $search,$options );
if (PEAR::isError($result)){
die ( $result -> message );
}
//商品数
$ttl = $result['TotalResults']; //商品の総数
$ttl_pg = $result['TotalPages']; //商品のページ数
//次と前のページのリンク先計算
if ($ttl > (($pg+1) * $lim)){
$nxt = "<a href=\"" .$thispg. "?pg=" .($pg+1). "\">次の" .$lim. "件</a>";
} else {
$nxt = "最後のページ";
}
if ($pg > 0){
$befr = "<a href=\"" .$thispg. "?pg=" .($pg-1). "\">前の" .$lim. "件</a>";
} else {
$befr = "最初のページ";
}

//Amazonデータ読み出し位置計算(1ページ10商品)
$st_i = $pg* $lim - 10*floor(($pg*$lim)/10); //$pg* $lim:そのページの何商品目
$end_i = (($ttl-($pg*$lim+$lim)) >= 0) ? ($st_i+$lim) : ($st_i+$ttl-($pg*$lim));//商品数まで表示
//ページをまたがるかどうか
$nxt_pg = ($end_i <=10) ? (0) : ($end_i-10); //ページ(10)を超えた数
$end_i = ($end_i <=10) ? ($end_i) : (10); //ページ(10)を超えたら10
//指定ページのデータを配列に格納
$lines = get_data($result,$st_i,$end_i,$i_page);//アマゾンで取得したデータを表示用に変換
//ページをまたがる時の処理
while ( $nxt_pg >= 1 ){
$i_page = $i_page + 1;
$options2 = array('ItemPage' => $i_page ); //次のページに置き換え
$options = array_merge( $options,$options2 );
//もう一度アマゾンに接続
$result = $amazon -> ItemSearch ( $search,$options );
if (PEAR::isError($result)){
die ( $result -> message );
}
//次のページ取得
$st_i = 0;
$end_i = ($nxt_pg <=10) ? ($nxt_pg) : (10); //ページ(10)を超えたら10
$lines = array_merge($lines,get_data($result,$st_i,$end_i,$i_page));//配列を結合
$nxt_pg = $nxt_pg - 10;//次のページの商品数
}


//Smartyで結果表示
require_once("smarty_setup.php");//Smartyのカスタムセット
$smarty = new Smarty_GuestBook();
$smarty -> assign("ttl",$ttl);
$smarty -> assign("ttl_pg",$ttl_pg);
$smarty -> assign("befr",$befr);
$smarty -> assign("nxt",$nxt);

$smarty -> assign("lines",$lines);
$smarty -> display("amazon_loop2.tpl");
//カスタム関数
//アマゾンのデータを配列に格納
function get_data($result,$st_i,$end_i,$i_page){
for ( $i = $st_i ; $i <= ($end_i-1) ; $i++ ){
//画像取得
$img = null;
if (isset($result['Item'][$i]['SmallImage'])){
$img = $result['Item'][$i]['SmallImage'];
}
$src = $img ? $img['URL'] : null ;
$width = $img ? $img['Width'] ['_content']: 100;
$height = $img ? $img['Height'] ['_content']: 100;
//結果を配列に格納
$lines[] = array(
"am_id" => (($i_page-1)*10 + $i + 1),
"am_url" => htmlspecialchars($result['Item'][$i]['DetailPageURL']),
"am_img" => htmlspecialchars($src),
"am_wdth" => htmlspecialchars($width),
"am_hght" => htmlspecialchars($height),
"am_ttle" => htmlspecialchars($result['Item'][$i]['ItemAttributes']['Title']),
"am_prc" => htmlspecialchars($result['Item'][$i]['ItemAttributes']['ListPrice']['FormattedPrice'])
);
}
return $lines;
}
?>

これで、Services_AmazonのECS4のデータ使った実用版が出来ました。応用してみてください。
レンタルサーバーのロリポップでは、動作確認できています。

AmazonECSの参考サイト

「AmazonECS」の詳しい情報は、次が参考になります。

  1. WebサービスをAmazonで知る――ECS 4.0でアフィリエイト(前編)
  2. WebサービスをAmazonで知る――ECS 4.0でアフィリエイト(後編)
  3. Amazon Web Services Developer Connection Japanese

ホームページを公開するレンタルサーバーは、 ロリポップ! がお薦め、 PHP5を使うならPHP5から選ぼう。

関連ページ

ホームページ作成

アフィリエイト

デジットさんのホームページ入門に移行中

スポンサード リンク

Amazon.co.jpアソシエイト:
PHP&プログラミング

売れている順 新刊順

:%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%20php :php2_  :5

とことん!ホームページホームページ入門役立つサイトデジットさんのリストラ日記仮福真琴の精神科医はうそだらけ

2005-2010 Copyright © Digit-01 All Rights Reserved.