- 2007-05-30 (水)
- API × PHP
さて、前回は受け取ったXMLを連想配列に格納するプログラムを説明しましたが、今回は、検索結果を整形して表示させるプログラムを説明したいと思います。いよいよ本講座も大詰めです。
まずは豊富な情報の中から取得するデータを決めます。
今回は簡単に、商品タイトル、画像URL、メーカー、価格情報を表示させることにします。
商品情報の出力には、foreach 関数を用いて item の数だけループして出力させています。
また、総ページ数データを取得して、ページ数が複数ある場合は、現在のページ数と比較して、前後のページへのリンクを出力するようにしてみました。
サンプルコードは以下のようになります。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Amazon Web サービス 商品検索サンプル</title>
</head>
<body>
<p>Amazon Web サービス 商品検索サンプル</p>
<form action="" method="GET">
<input type="text" maxlength="30" name="Keywords" value="" size="20">
<select name="SearchIndex">
<option value="Blended" selected="selected">全ての商品</option>
<option value="Books">和書</option>
<option value="ForeignBooks">洋書</option>
<option value="Electronics">エレクトロニクス</option>
<option value="Kitchen">ホーム&キッチン</option>
<option value="Music">ミュージック</option>
<option value="Classical">クラシック音楽</option>
<option value="DVD">DVD</option>
<option value="Software">ソフトウェア</option>
<option value="VideoGames">ゲーム</option>
<option value="Toys">おもちゃ</option>
<option value="Hobbies">ホビー</option>
<option value="SportingGoods">スポーツ&アウトドア</option>
<option value="HealthPersonalCare">ヘルス & ビューティー</option>
<option value="Watches">時計</option>
</select>
<input type="submit" name="" value="商品検索">
</form>
<?php
// ---------------------------------------------------------------
// Amazon Web サービス 商品検索サンプル(2007/05/30)
// http://www.naminorito.com/
//
// PHP4で動作確認しています
// 文字コードはUTF-8で保存してください
//
/* ---------------- 変更部分(ここから) -------------------------- */
// 自分のアクセスキーID
$AWSACCESSKEYID = "[Your Access Key ID]";
// 自分のアソシエイトID
$ASSOCIATETAG = "[Your Associate ID]";
/* ---------------- 変更部分(ここまで) -------------------------- */
// APIのURL
$API_BASE_URL = "http://webservices.amazon.co.jp/onca/xml";
//--------- パラメータの値入力
$SERVICE = "AWSECommerceService";
$OPERATION = "ItemSearch";
$API_VERSION = "2004-10-04";
$RESPONSEGROUP = Medium;
$KEYWORDS = urlencode($_REQUEST['Keywords']);
$SEARCHINDEX = $_REQUEST['SearchIndex'];
// 検索フォームから商品検索が行われた時は、1ページ目を表示させる
if(empty($_REQUEST['ItemPage'])) {
$ITEMPAGE = "1";
}
else {
$ITEMPAGE = $_REQUEST['ItemPage'];
}
$CONTENTTYPE = "text/xml";
//--------- リクエストURLの生成と出力
// リクエストURL生成
$api_url = sprintf("%s?Service=%s&AWSAccessKeyId=%s&AssociateTag=%s&Operation=%s&Version=%s&ResponseGroup=%s&Keywords=%s&SearchIndex=%s&ItemPage=%s&ContentType=%s" ,
$API_BASE_URL,
$SERVICE,
$AWSACCESSKEYID,
$ASSOCIATETAG,
$OPERATION,
$API_VERSION,
$RESPONSEGROUP,
$KEYWORDS,
$SEARCHINDEX,
$ITEMPAGE,
$CONTENTTYPE
);
// 商品検索ボタンを押された時に、商品検索結果を表示
if(isset($_REQUEST['Keywords'])) {
// 検索ワードが入力されていなければ以下の出力処理を行わない
if(empty($KEYWORDS)) {
}
else {
// XMLデータを取得
$xml_data = file_get_contents($api_url);
// XML パースライブラリーを読み込む
include('xml.php');
// XMLを連想配列に格納する
$array_data = XML_unserialize($xml_data);
// 検索結果が1つの場合は、階層を変化させる
if ($array_data[ItemSearchResponse][Items][Item][0]) {
$item_data = $array_data[ItemSearchResponse][Items][Item];
}
else {
$item_data[0] = $array_data[ItemSearchResponse][Items][Item];
}
// 検索結果数の取得
$total_results = $array_data[ItemSearchResponse][Items][TotalResults];
// 総ページ数の取得
$total_pages = $array_data[ItemSearchResponse][Items][TotalPages];
// 検索ワードのURLデコード処理
$decode_keywords = urldecode($KEYWORDS);
// 検索ワードのエスケープ処理
$escaped_keywords = htmlspecialchars($decode_keywords, ENT_QUOTES);
//--------- 商品検索結果を出力
echo <<<EOM
<hr />
<p><strong>$escaped_keywords</strong>に関する商品が<strong>$total_results</strong>件見つかりました</p>
EOM;
// item の数だけループして出力
foreach ($item_data as $item){
?>
<a href="<?=$item[DetailPageURL]?>"><img src="<?=$item[SmallImage][URL]?>" border=0></a><br >
<a href="<?=$item[DetailPageURL]?>"><?=$item[ItemAttributes][Title]?></a><br />
<?=$item[ItemAttributes][Manufacturer]?><br />
<?=$item[ItemAttributes][ListPrice][FormattedPrice]?><hr />
<?php
}
//--------- 前後のページのリンク作成
// エスケープ処理
$escaped_encoded_keywords = htmlspecialchars($KEYWORDS, ENT_QUOTES);
$escaped_searchindex = htmlspecialchars($SEARCHINDEX, ENT_QUOTES);
$escaped_itempage = htmlspecialchars($ITEMPAGE, ENT_QUOTES);
// 前ページのリンク出力
if($ITEMPAGE > 1){
$prev_page = $ITEMPAGE - 1;
echo "<a href=\"./sample3.php?Keywords=$escaped_encoded_keywords&SearchIndex=$escaped_searchindex&ItemPage=$prev_page\">前のページ</a>"; // phpファイル名に合わせて適宜変更
}
// 現在のページ数を表示
echo " $escaped_itempage ";
// 次ページのリンク出力
if($ITEMPAGE < $total_pages){
$next_page = $ITEMPAGE + 1;
echo "<a href=\"./sample3.php?Keywords=$escaped_encoded_keywords&SearchIndex=$escaped_searchindex&ItemPage=$next_page\">次のページ</a>"; // phpファイル名に合わせて適宜変更
}
}
}
?>
<hr />
<p>サンプルコードの解説は <a href="http://www.naminorito.com/blog/2007/05/30060000.php">Amazon Web サービスの使い方(6) - 検索結果を表示させる</a> を参考にして下さい</p>
<p>Copyright © <a href="http://www.naminorito.com/blog/">ホリデーウェブマスターブログ</a></p>
</body>
</html>
動作サンプルは以下になります。
さて、これで一応 Amazon の商品を検索するPHPプログラムが出来上がったわけですが、非常に幼稚なストレートなプログラムになっています。
というわけで、一見ブラックボックスのような(私の書いた)PHPプログラムが、蓋を開ければこんなに泥臭くて、まどろっこしいプログラムで動いていることがお分かりいただけたかと思います。
スマートなプログラムを書ければそれはそれで素晴らしいのですが、素人でも一行一行確実にプログラムを書いていけば、それなりに動かせるのがPHPです。
Tags :?Amazon?Search?Api?Php?
カテゴリ「API × PHP」の最新記事
-
2007-07-09 08:00 - Amazon Web サービスの使い方(7) - Amazon Review Search を公開します
-
2007-05-30 06:00 - Amazon Web サービスの使い方(6) - 検索結果を表示させる
-
2007-05-29 08:00 - Amazon Web サービスの使い方(5) - XMLを連想配列に格納する
-
2007-05-25 12:00 - Amazon Web サービスの使い方(4) - 取得したXMLの構造
-
2007-05-21 17:20 - Amazon Web サービスの使い方(3) - リクエストURL生成