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

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

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

PHPで新刊書籍を検索

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

準備

  33: class searchNewBooks {
  34:     var $config;        //設定値
  35:     var $finish;        //検索終了日
  36:     var $items;         //書籍情報
  37:     var $error;         //エラーフラグ
  38:     var $errmmsg;       //エラーメッセージ
  39:     var $pdo;           //PDO
  40:     var $paws;          //Amazon Web Service
  41: 
  42:     const CONFIG_FILE  = './searchNewBooks.xml';        //設定ファイル
  43:     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文を使ってテーブルを生成する。

 145: /**
 146:  * DB初期化
 147:  * @param   なし
 148:  * @return  なし
 149: */
 150: function initDB() {
 151:     static $sql_catalog_create =<<< EOD
 152: CREATE TABLE IF NOT EXISTS 'catalog' (
 153:     'ASIN' varchar(15) NOT NULL PRIMARY KEY,
 154:     'ISBN' varchar(15),
 155:     'Title' tinytext NOT NULL,
 156:     'Author' tinytext,
 157:     'Publisher' tinytext,
 158:     'PublicationDate' tinytext,
 159:     'Price' int(11) DEFAULT NULL,
 160:     'Url' tinytext,
 161:     'LargeImage' tinytext,
 162:     'MediumImage' tinytext,
 163:     'SmallImage' tinytext,
 164:     'status' tinyint,
 165:     'premiere' tinytext NOT NULL,
 166:     'latest' tinytext NOT NULL,
 167:     'delflag' int(2) NOT NULL
 168: );
 169: 
 170: EOD;
 171: 
 172:     static $sql_finish_create =<<< EOD
 173: CREATE TABLE IF NOT EXISTS 'finish_date' (
 174:     'finish' tinytext NOT NULL
 175: );
 176: 
 177: EOD;
 178: 
 179:     $stmt_catalog = $this->pdo->prepare($sql_catalog_create);
 180:     $stmt_catalog->execute();
 181:     $stmt_finish = $this->pdo->prepare($sql_finish_create);
 182:     $stmt_finish->execute();
 183: }
 184: 
 185: /**
 186:  * DBオープン
 187:  * @param   なし
 188:  * @return  bool TRUE:成功/FALSE:失敗
 189: */
 190: function openDB() {
 191:     try {
 192:         $this->pdo = new PDO('sqlite:' . self::DB_FILE);
 193:         $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
 194:     } catch (PDOException $e) {
 195:         $this->errmsg['valid'] = 'SQLite : ' . $e->getMessage();
 196:         $this->error = TRUE;
 197:         return FALSE;
 198:     }
 199:     //DB初期化
 200:     $this->initDB();
 201: 
 202:     return TRUE;
 203: }
 204: 
 205: /**
 206:  * DBクローズ
 207:  * @param   なし
 208:  * @return  なし
 209: */
 210: function closeDB() {
 211:     $this->pdo = NULL;
 212: }

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

設定ファイルの構造(xml) database queries query 検索値
検索条件は、設定ファイル CONFIG_FILE に記載する。
たとえば、安部真弘さんの書籍を検索したいのなら、
<query key="Author">安部真弘</query>
のように記述する。
検索条件は "<queries>" にいくつでも記載できる。ただし、"<queries>" ごとにAWSを呼び出しているので、数が多ければ、その分、応答時間が遅くなる。
そこで、一度検索した結果はローカル・データベースに記録し、応答時間を稼ぐようにしている。

  97: /**
  98:  * 設定ファイルを読み込む
  99:  * @param   なし
 100:  * @return  bool TRUE:読み込み成功/FALSE:失敗
 101: */
 102: function readConfig() {
 103:     $xml = @simplexml_load_file(self::CONFIG_FILE);
 104: 
 105:     //読み込みエラー
 106:     if ($xml == FALSE) {
 107:         $his->error = TRUE;
 108:         $this->errmsg = '設定ファイル "' . self::CONFIG_FILE . '" の読み込みに失敗しました';
 109:         return FALSE;
 110:     }
 111:     //読み込み
 112:     foreach ($xml->queries as $queries) {
 113:         unset($qrr);
 114:         $arr = array();
 115:         if (count($queries) == 1) {
 116:             $arr[(string)$queries->query['key']] = (string)$queries->query;
 117:         } else {
 118:             foreach ($queries as $query) {
 119:                 $arr[(string)$query['key']] = (string)$query;
 120:             }
 121:         }
 122:         $this->config[] = $arr;
 123:     }
 124:     return TRUE;
 125: }

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

解説:新刊書籍検索

 127: /**
 128:  * 新刊書籍の検索と書籍カタログへの登録
 129:  * @param   なし
 130:  * @return  bool TRUE:読み込み成功/FALSE:失敗
 131: */
 132: function searchBook() {
 133:     foreach ($this->config as $queries) {
 134:         unset($items);
 135:         $items = array();       //一時的な読み込み用配列
 136:         $finish = $this->getUpdate();
 137:         //AWSを呼び出して検索
 138:         $this->paws->searchItemsDaterank('Books', $queries, $finish, $items);
 139:         //一時的な読み込み用配列の内容をカタログへ登録
 140:         $this->items = array_merge($this->items, $items);
 141:     }
 142:     return TRUE;
 143: }

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で新刊書籍を検索

 590: $snb  = new searchNewBooks();
 591: $snb->readConfig();
 592: $snb->openDB();
 593: $update = $snb->getUpdate();
 594: 
 595: //全チェック
 596: if (isButton('check'))  $snb->checkCatalog();
 597: 
 598: //カタログに追加
 599: if (isButton('search')) {
 600:     $snb->searchBook();
 601:     $snb->addCatalog();
 602: }
 603: 
 604: //カタログの内容取得
 605: $items = array();
 606: if (isButton('search'&& ($snb->getCatalog($items<0)) {
 607:     $snb->error = TRUE;
 608:     $snb->errmsg = $update . '以降の新刊書籍はない';
 609: else if (isButton('select1'&& ($snb->selectCatalog(-7, +7, $items<0)) {
 610:     $snb->error = TRUE;
 611:     $snb->errmsg = '±1週間の書籍はない';
 612: else if (isButton('select4'&& ($snb->selectCatalog(-28, +28, $items<0)) {
 613:     $snb->error = TRUE;
 614:     $snb->errmsg = '±4週間の書籍はない';
 615: }
 616: 
 617: //リスト作成
 618: if (isButton('list'&& isset($_POST['status'])) {
 619:     $snb->getCatalog($items);
 620:     $list = $snb->makeList($_POST['status'], $items);
 621: }
 622: 
 623: $snb->closeDB();
 624: 
 625: $HtmlBody = makeCommonBody($items, $list, $snb->errmsg);
 626: 
 627: // 表示処理
 628: echo $HtmlHeader;
 629: echo $HtmlBody;
 630: echo $HtmlFooter;
 631: 

参考サイト

(この項おわり)
header