サンプル・プログラムの実行例
サンプル・プログラムのダウンロード
準備
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ファイル
新刊書籍検索プログラムでは、主要処理をクラス 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の初期化
起動の都度、ユーザー関数 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_ERRMODE, PDO::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: }
解説:設定ファイルの読み込み
たとえば、安部真弘さんの書籍を検索したいのなら、
<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: }
解説:新刊書籍検索
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: }
検索条件 $config をひとつひとつ取りだし、searchItemsDaterank を経由して Amazon Web Service をコールする。
検索結果は、いったん関数内の配列 $items に格納してから、クラス配列 $items へ格納する。ここで、組み込み関数 array_merge を利用している。
解説:カタログ登録
流れ図のように、Amazonの商品コードであるASINでデータベース検索を行い、存在していなければ新規登録(INSERT文)、存在していれば更新登録(UPDATE文)を行う。
最後に、、ユーザー関数 setUpdate によって、catalog更新年月日を本日の日付にする。更新根月日はテーブル finish_date に記録される。
解説:メイン・プログラム
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:
参考サイト
- PHPでAmazon Web Serviceを利用して書籍検索:ぱふぅ家のホームページ
- Amazon Web Service(AWS)
- 作家名や題名でコミックなどの発売日を調べる新刊情報アプリで最強検索:アレコレあるあるショップ
- 読みたい本だけ新刊チェックできるコミックダッシュ:ジャムミックス
あらかじめ登録した条件で検索を行い、結果をデータベースに登録してゆく。再検索の応答時間短縮を図るためである。データベースとしては、「PHPとデータベース」で解説している SQLite を利用する。