PHPでAmazonを利用して新刊書籍を検索

(1/1)
PHPでAmazon Web Serviceを利用して書籍検索」で作った書籍検索プログラムを利用し、新刊書籍を検索するPHPプログラムを作ってみることにする。
あらかじめ登録した条件で検索を行い、結果をデータベースに登録してゆく。再検索の応答時間短縮を図るためである。データベースとしては、「PHPとデータベース」で解説している SQLite を利用する。

サンプル・プログラムの実行例

PHPで新刊書籍を検索

サンプル・プログラムのダウンロード

準備

0033: class searchNewBooks {
0034:     var $config;     //設定値
0035:     var $finish;     //検索終了日
0036:     var $items;          //書籍情報
0037:     var $error;          //エラーフラグ
0038:     var $errmmsg;        //エラーメッセージ
0039:     var $pdo;            //PDO
0040:     var $paws;           //Amazon Web Service
0041: 
0042:     const CONFIG_FILE  = './searchNewBooks.xml';       //設定ファイル
0043:     const DB_FILE      = './searchNewBooks.sqlite3';   //DBファイル

Amazon Web Service(AWS)はクラス pahooAWS を利用しており、各種設定は「PHPでAmazon Web Serviceを利用して書籍検索」で述べたとおりである。

新刊書籍検索プログラムでは、主要処理をクラス searchNewBooks におさめている。
検索条件などを記述する設定ファイル名は CONFIG_FILE に、書籍カタログを格納するデータベース・ファイル名は DB_FILE に記述する。

データベース:書籍カタログの構造

テーブル:catalog
項目名 フィールド名 内  容
ASINコード ASIN string ASIN(Amazon商品コード)。
ISBNコード ISBN string ISBNコード。
タイトル Title string 書籍タイトルなど。
作者 Author string 作者。
出版社 Publisher string 出版社。
発行年月日 PublicationDate string 発行年月日(YYYY-MM-DD形式)。
価格 Price integer 価格(単位:円)。
商品URL Url string 商品URL。
画像(大)URL LargeImage string 画像(大)URL。
画像(中)URL MediumImage string 画像(中)URL
画像(小)URL SmallImage string 画像(小)URL
処理状況 status string 0:未処理,1:処理済
登録日時 premiere string 登録日時。
更新日時 latest string 更新日時。
削除フラグ delflag string 0:未処理,1:削除済

解説:DBの初期化

初回起動時にはデータベース・ファイル DB_FILE は存在しない。SQLite は、特別なDBMSを必要としない。PHP5があれば銅っする。
起動の都度、ユーザー関数 initDB が呼び出され、もしテーブルがなければ(IF NOT EXISTS)、CREATE文を使ってテーブルを生成する。

0145: /**
0146:  * DB初期化
0147:  * @paramなし
0148:  * @returnなし
0149: */
0150: function initDB() {
0151: static $sql_catalog_create =<<< EOD
0152: CREATE TABLE IF NOT EXISTS 'catalog' (
0153:     'ASIN' varchar(15) NOT NULL PRIMARY KEY,
0154:     'ISBN' varchar(15),
0155:     'Title' tinytext NOT NULL,
0156:     'Author' tinytext,
0157:     'Publisher' tinytext,
0158:     'PublicationDate' tinytext,
0159:     'Price' int(11) DEFAULT NULL,
0160:     'Url' tinytext,
0161:     'LargeImage' tinytext,
0162:     'MediumImage' tinytext,
0163:     'SmallImage' tinytext,
0164:     'status' tinyint,
0165:     'premiere' tinytext NOT NULL,
0166:     'latest' tinytext NOT NULL,
0167:     'delflag' int(2) NOT NULL
0168: );
0169: 
0170: EOD;
0171: 
0172: static $sql_finish_create =<<< EOD
0173: CREATE TABLE IF NOT EXISTS 'finish_date' (
0174:     'finish' tinytext NOT NULL
0175: );
0176: 
0177: EOD;
0178: 
0179:     $stmt_catalog = $this->pdo->prepare($sql_catalog_create);
0180:     $stmt_catalog->execute();
0181:     $stmt_finish = $this->pdo->prepare($sql_finish_create);
0182:     $stmt_finish->execute();
0183: }
0184: 
0185: /**
0186:  * DBオープン
0187:  * @paramなし
0188:  * @return bool TRUE:成功/FALSE:失敗
0189: */
0190: function openDB() {
0191:     try {
0192:         $this->pdo = new PDO('sqlite:' . self::DB_FILE);
0193:         $this->pdo->setAttribute(PDO::ATTR_ERRMODEPDO::ERRMODE_EXCEPTION);
0194:     } catch (PDOException $e) {
0195:         $this->errmsg['valid'] = 'SQLite : ' . $e->getMessage();
0196:         $this->error = TRUE;
0197:         return FALSE;
0198:     }
0199:     //DB初期化
0200:     $this->initDB();
0201: 
0202:     return TRUE;
0203: }
0204: 
0205: /**
0206:  * DBクローズ
0207:  * @paramなし
0208:  * @returnなし
0209: */
0210: function closeDB() {
0211:     $this->pdo = NULL;
0212: }

解説:設定ファイルの読み込み

設定ファイルの構造(xml) database queries query 検索値
検索条件は、設定ファイル CONFIG_FILE に記載する。
たとえば、安部真弘さんの書籍を検索したいのなら、

<query key="Author">安部真弘</query>


のように記述する。
検索条件は "<queries>" にいくつでも記載できる。ただし、"<queries>" ごとにAWSを呼び出しているので、数が多ければ、その分、応答時間が遅くなる。
そこで、一度検索した結果はローカル・データベースに記録し、応答時間を稼ぐようにしている。

0097: /**
0098:  * 設定ファイルを読み込む
0099:  * @paramなし
0100:  * @return bool TRUE:読み込み成功/FALSE:失敗
0101: */
0102: function readConfig() {
0103:     $xml = @simplexml_load_file(self::CONFIG_FILE);
0104: 
0105:     //読み込みエラー
0106:     if ($xml == FALSE) {
0107:         $his->error = TRUE;
0108:         $this->errmsg = '設定ファイル "' . self::CONFIG_FILE . '" の読み込みに失敗しました';
0109:         return FALSE;
0110:     }
0111:     //読み込み
0112:     foreach ($xml->queries as $queries) {
0113:         unset($qrr);
0114:         $arr = array();
0115:         if (count($queries) == 1) {
0116:             $arr[(string)$queries->query['key']] = (string)$queries->query;
0117:         } else {
0118:             foreach ($queries as $query) {
0119:                 $arr[(string)$query['key']] = (string)$query;
0120:             }
0121:         }
0122:         $this->config[] = $arr;
0123:     }
0124:     return TRUE;
0125: }

設定ファイル CONFIG_FILE は、プログラムの冒頭で readConfig を使って読み込み、クラス内の配列変数 $config に格納しておく。

解説:新刊書籍検索

0127: /**
0128:  * 新刊書籍の検索と書籍カタログへの登録
0129:  * @paramなし
0130:  * @return bool TRUE:読み込み成功/FALSE:失敗
0131: */
0132: function searchBook() {
0133:     foreach ($this->config as $queries) {
0134:         unset($items);
0135:         $items = array();        //一時的な読み込み用配列
0136:         $finish = $this->getUpdate();
0137:         //AWSを呼び出して検索
0138:         $this->paws->searchItemsDaterank('Books', $queries$finish$items);
0139:         //一時的な読み込み用配列の内容をカタログへ登録
0140:         $this->items = array_merge($this->items$items);
0141:     }
0142:     return TRUE;
0143: }

Amazon Web Service を利用して書籍検索を行うのがユーザー関数 searchBook である。

検索条件 $config をひとつひとつ取りだし、searchItemsDaterank を経由して Amazon Web Service をコールする。
検索結果は、いったん関数内の配列 $items に格納してから、クラス配列 $items へ格納する。ここで、組み込み関数  array_merge  を利用している。

解説:カタログ登録

カタログ登録の流れ - PHPで新刊書籍を検索
検索結果をカタログとしてデータベースへ登録するのは、ユーザー関数 addCatalog である。カタログはテーブル catalog に登録される。

流れ図のように、Amazonの商品コードであるASINでデータベース検索を行い、存在していなければ新規登録(INSERT文)、存在していれば更新登録(UPDATE文)を行う。
最後に、、ユーザー関数 setUpdate によって、catalog更新年月日を本日の日付にする。更新根月日はテーブル finish_date に記録される。

解説:メイン・プログラム

最後に、メイン・プログラムの流れとソース・コードを紹介する。各々のボタンに対応する関数が呼び出される流れになっている。
PHPで新刊書籍を検索

0590: $snb  = new searchNewBooks();
0591: $snb->readConfig();
0592: $snb->openDB();
0593: $update = $snb->getUpdate();
0594: 
0595: //全チェック
0596: if (isButton('check'))  $snb->checkCatalog();
0597: 
0598: //カタログに追加
0599: if (isButton('search')) {
0600:     $snb->searchBook();
0601:     $snb->addCatalog();
0602: }
0603: 
0604: //カタログの内容取得
0605: $items = array();
0606: if (isButton('search') && ($snb->getCatalog($items) <= 0)) {
0607:     $snb->error = TRUE;
0608:     $snb->errmsg = $update . '以降の新刊書籍はない';
0609: else if (isButton('select1') && ($snb->selectCatalog(-7, +7, $items) <= 0)) {
0610:     $snb->error = TRUE;
0611:     $snb->errmsg = '±1週間の書籍はない';
0612: else if (isButton('select4') && ($snb->selectCatalog(-28, +28, $items) <= 0)) {
0613:     $snb->error = TRUE;
0614:     $snb->errmsg = '±4週間の書籍はない';
0615: }
0616: 
0617: //リスト作成
0618: if (isButton('list') && isset($_POST['status'])) {
0619:     $snb->getCatalog($items);
0620:     $list = $snb->makeList($_POST['status'], $items);
0621: }
0622: 
0623: $snb->closeDB();
0624: 
0625: $HtmlBody = makeCommonBody($items$list$snb->errmsg);
0626: 
0627: // 表示処理
0628: echo $HtmlHeader;
0629: echo $HtmlBody;
0630: echo $HtmlFooter;
0631: 

参考サイト

(この項おわり)
header