apiで質問があります。質問というより悩みです。
apiを使ってサイトを構築しようと思い、apiで得た情報をデータベースに貯めるやり方を考えていましたが、そのやり方は出来ないまたはオススメしないと言われました。なぜなら、apiで得た情報を更新できなくなるからです。ですが、apiから得る情報は膨大な為データベースに貯めたいと思っています。また、検索エンジンはページング処理を設けたいのでデータベースを使いたいんです。
データベースを使えないなら、どうすればいいのですか?
※わかりずらい説明なので補足します。
美味しいうどんが食べたいという参考したいサイトがあります。これはapi+mysqliを使っていますか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/07/31 13:37
2016/08/01 01:08
2016/08/01 05:03
回答7件
0
オススメしないと言われました
こちらの質問でお勧めしないと回答した者ですw
私の回答が正しいとは言いませんが、回答内容を理解せずにまたこのような同類の質問をされることにガッカリしました。
他の回答者も言っていましたが、まず基礎をしっかり学んでから今目指しているサイトの構築をした方が良いと思います。
本質を理解せずに今わからないことを質問して得られた回答で解決しても、また新たな疑問にぶつかったら質問するの繰り返しになりますよ。
HTMLだけの静的なサイトを作ってみる。
PHPだけを使って簡易処理をしてみる。
PHPとHTMLを組み合わせて動的なサイトを作ってみる。
MySQLなどでデータベースを学んでみる。
PHPでMySQLを操作してみる。
PHP+MySQL+HTMLで動的なサイトを作ってみる。
APIとは何かを学ぶ。
あなたはいつも簡単にAPI、APIと言いますが、どこのサービスのAPIなのか、サービスごとに違うということを理解していますか?
あなたがなぜそこまでしてそのグルメ情報サイトを早急に作りたいのかはわかりませんが、いきなり大規模なものを作ろうとせず、基礎を積み上げていってください。
そうして基礎がしっかりできれば、もっと質の高い質問ができるようになると思います。
投稿2016/08/01 00:48
総合スコア16996
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/08/01 04:21
2016/08/01 04:36
2016/08/01 05:28
2016/08/01 05:36
2016/08/01 05:45
退会済みユーザー
2016/08/01 11:17
2016/08/01 12:19
2016/08/01 12:31
退会済みユーザー
2016/08/01 12:37
2016/08/01 12:39
2016/08/01 12:42
2016/08/01 13:06
0
以下のソースを書くために参照したページ
http://api.gnavi.co.jp/api/manual/
http://api.gnavi.co.jp/api/manual/prefmaster/
http://api.gnavi.co.jp/api/manual/restsearch/
上記のページを参照するだけで以下の機能は実装可能。
設置さえすれば動く。以上。
php
1<?php 2 3/** 4 * global_functions.php 5 * 6 * @since 2016/08/01 7 */ 8 9/** 10 * エスケープ 11 * @param string $string 12 * @return string 13 */ 14function h($string) 15{ 16 return htmlspecialchars($string, ENT_QUOTES, 'utf-8'); 17} 18 19/** 20 * ページネーション 21 * @param int $page 22 * @param int $total 23 * @return string 24 */ 25function pagination($page, $total) 26{ 27 $delta = 3; 28 if ($total < 1) { 29 return; 30 } 31 $query = (is_array(filter_input_array(INPUT_GET))) ? 32 filter_input_array(INPUT_GET) : []; 33 if (isset($query['offset_page'])) { 34 unset($query['offset_page']); 35 } 36 $querystring = http_build_query($query); 37 $limit = 10; 38 $placeholder = "<span%s><a href=\"?offset_page=%d&%s\">%s</a></span> "; 39 40 // 最大ページ数 41 $maxPage = ceil($total / $limit); 42 43 $min = max([$page - $delta, 1]); 44 $max = min([$page + $delta, $maxPage]); 45 46 $html = ''; 47 if ($page > 1) { 48 $html .= sprintf($placeholder, '', 1, $querystring, '«'); 49 $html .= sprintf($placeholder, '', $page, $querystring, '前へ'); 50 } 51 for ($i = $max - 6; $i < $min + 7; $i++) { 52 if ($i > -1 && $i < $maxPage) { 53 $html .= sprintf($placeholder 54 , ($i == $page) ? ' class="active"' : '' 55 , $i + 1 56 , $querystring 57 , $i + 1 58 ); 59 } 60 } 61 if ($page < $maxPage) { 62 $html .= sprintf($placeholder, '', $page + 1, $querystring, '次へ'); 63 $html .= sprintf($placeholder, '', $maxPage, $querystring, '»'); 64 } 65 return $html; 66}
php
1<?php 2 3/** 4 * Gnavi.class.php 5 * 6 * @since 2016/08/01 7 */ 8class Gnavi 9{ 10 11 /** 12 * アクセスキー 13 * @var string 14 */ 15 private static $token = 'アクセスキー'; 16 17 /** 18 * 都道府県リストを取得 19 * @return object 20 */ 21 public static function getPref() 22 { 23 $uri = "http://api.gnavi.co.jp/master/PrefSearchAPI/20150630/"; 24 $acckey = self::$token; 25 $format = "json"; 26 27 $url = sprintf("%s?format=%s&keyid=%s", $uri, $format, $acckey); 28 $json = file_get_contents($url); 29 $obj = json_decode($json); 30 return $obj; 31 } 32 33 /** 34 * レストラン検索 35 * @return object 36 */ 37 public static function getRestaurants() 38 { 39 $uri = "http://api.gnavi.co.jp/RestSearchAPI/20150630/"; 40 $acckey = self::$token; 41 $format = "json"; 42 43 $get = [ 44 'format' => $format 45 , 'keyid' => $acckey 46 , 'hit_per_page' => 10 47 ]; 48 if (!is_null(filter_input_array(INPUT_GET))) { 49 $get += filter_input_array(INPUT_GET); 50 } 51 $url = sprintf("%s?%s", $uri, http_build_query($get)); 52 53 $json = file_get_contents($url); 54 $obj = json_decode($json); 55 return $obj; 56 } 57 58}
php
1<?php 2/** 3 * index.php 4 * 5 * @since 2016/08/01 6 */ 7require_once './global_functions.php'; 8require_once './Gnavi.class.php'; 9 10// 都道府県取得 11$prefs = Gnavi::getPref(); 12 13// レストラン検索 14$restaurants = Gnavi::getRestaurants(); 15?> 16<!DOCTYPE HTML> 17<html lang="ja"> 18 <head> 19 <meta charset="UTF-8"> 20 <title>ぐるなびAPIテスト(アホでも設置するだけで動く)</title> 21 </head> 22 <body> 23 <form action="" method="get"> 24 <p> 25 <label for="pref">都道府県</label> 26 <select name="pref" id="pref"> 27 <option value="">都道府県</option> 28 <?php foreach ($prefs->pref as $pref) : ?> 29 <?php if ($pref->pref_code == filter_input(INPUT_GET, 'pref')): ?> 30 <option value="<?= h($pref->pref_code); ?>" selected="selected"><?= h($pref->pref_name); ?></option> 31 <?php else: ?> 32 <option value="<?= h($pref->pref_code); ?>"><?= h($pref->pref_name); ?></option> 33 <?php endif; ?> 34 <?php endforeach; ?> 35 </select> 36 </p> 37 <p> 38 <label for="freeword">フリーワード</label> 39 <input type="text" name="freeword" id="freeword" value="<?= h(filter_input(INPUT_GET, 'freeword')); ?>" /> 40 </p> 41 <p> 42 <button type="submit">検索</button> 43 </p> 44 </form> 45 46 <div> 47 48 <table> 49 <thead> 50 <tr> 51 <th>id</th> 52 <th>name</th> 53 <th>category</th> 54 <th>address</th> 55 </tr> 56 </thead> 57 <tbody> 58 <?php foreach ($restaurants->rest as $rest) : ?> 59 <tr> 60 <td><?= h($rest->id); ?></td> 61 <td> 62 <a href="<?= h($rest->url); ?>"><?= h($rest->name); ?></a> 63 </td> 64 <td><?= h($rest->category); ?></td> 65 <td><?= h($rest->address); ?></td> 66 </tr> 67 <?php endforeach; ?> 68 </tbody> 69 </table> 70 71 <div class="pagination"> 72 <?= pagination($restaurants->page_offset, $restaurants->total_hit_count); ?> 73 </div> 74 </div> 75 </body> 76</html> 77
投稿2016/07/31 16:14
編集2016/08/01 07:32退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/08/01 03:27
退会済みユーザー
2016/08/01 03:44
2016/08/01 04:59
2016/08/01 05:31
退会済みユーザー
2016/08/01 07:04 編集
2016/08/01 10:13
退会済みユーザー
2016/08/01 11:14
退会済みユーザー
2016/08/01 12:23
2016/08/03 09:48
退会済みユーザー
2016/08/03 09:51
2016/08/03 10:04
2016/08/03 10:05
退会済みユーザー
2016/08/03 10:07
退会済みユーザー
2016/08/03 10:08
2016/08/03 10:12
退会済みユーザー
2016/08/03 10:15
退会済みユーザー
2016/08/03 10:16
2016/08/03 10:25
退会済みユーザー
2016/08/03 10:52
0
ベストアンサー
たしかにAPIだけで可能です。
しかし、あなたはその作るサイトに口コミや、コメントフォームなどAPIにないことを入れようとしていますね
それにはDBがいるまた会員登録するのならそれを保存するDBがいる
後結局外側が無いから回答者側誰もイメージできないと思う
先に内側を作るより外側を作ってしまう方が作りやすくなっていくと思います。
美味しいうどんとかいうサイトは置いといてあなたが作りたいのを作っていった方がいいです
※いつのまにかぐるなびのAPIを扱えるようになってしまった。新しい技術を学ばせて頂きありがとうございました。
投稿2016/08/01 05:31
総合スコア1820
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/08/01 06:07
2016/08/01 06:22
2016/08/01 07:39
0
ぐるなびAPIで質問されていた方ですよね?
突然APIときても初見の方は何の事かわからないと思います。
apiから得る情報は膨大な為データベースに貯めたいと思っています。
なぜ手元におきたいのでしょう?
データをすべて集めて自前でDBとシステムを構築するまでもなく、このAPI自体がぐるなびのDBに対するアクセス窓口です。
SQLではなく、APIのパラメータを使ってぐるなびのデータベースにアクセスしていると考えましょう。
当然自前で設計したDBにSQLでアクセスするほどの自由度はありませんが、それは仕方の無い事です。
ユーザにできる事は、(窓口があるなら)せいぜい開発者に必要な機能の追加を要望することくらいです。
検索エンジンはページング処理を設けたい
ページを遷移する都度APIにそのページで表示するデータを要求すればよろしいかと
apiで得た情報を更新できなくなるからです。
確か膨大なデータ全てをDBに格納しようとしていたと思います。
データを得るためには時間が掛かると思いますが、保存したデータが利用時点で最新だとどうやって保障できるでしょう?
毎時全データを得て更新し続けるのでしょうか?
データ転送やそのための処理リソースは有限で費用が掛かりますし、サービス提供側の持ち出しです。
短時間に大量のデータ要求を繰り返し延々と行うと、それは迷惑アクセスと受け取られるでしょう。
というわけで全て保存しようという仕様が情報を更新できない原因です。
サービス提供側は、間違った店舗データが掲載されてしまった場合、店舗(ユーザ)側のアクションで即修正できるようにしているはずです。
しかし、あなたがDBに格納したデータはどうでしょうか?
仮に店舗の営業に害を与えるようなデータが誤って掲載されていた場合、あなたのDBのデータが更新されないと何時までもそれがあなたのサイト(つまりインターネット上)に表示されてしまいます。
ぐるなびは店舗側から苦情をもらい損害賠償を請求されるかも知れません。
これはapi+mysqliを使っていますか?
外から見ただけでは正確な事はわかりませんよ。
そのサイトの開発者本人に確認するしかないと思います。
投稿2016/07/31 14:28
総合スコア2068
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/07/31 14:45
2016/07/31 15:04 編集
2016/08/01 05:00
2016/08/01 05:07 編集
2016/08/01 05:17 編集
2016/08/01 05:22 編集
2016/08/01 05:29
2016/08/01 05:35 編集
2016/08/01 05:41
0
あなたはニュースや雑誌を見ますか?
大抵の人は最新データを得たいですよね、ニュースや雑誌は発売前の時点で最新のデータを使いますよね。
では、一か月後に同じニュースや雑誌を見なおしたときにこれらのデータは古い状態ですよね。
ニュースや雑誌がデータベースで、最新のデータをそろえることがWebAPIです。
保存した時点での最新データを表示するだけならいいそれでいいですが、いつ保存したかわからないデータをユーザーは見たいでしょうか?
そんなわけで、口コミサイトを作るのにWebAPIから取得したデータを保存するのはよくないといわれたんですよ。
投稿2016/07/31 13:42
総合スコア18155
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/07/31 14:20
2016/07/31 14:47
2016/07/31 14:48
2016/07/31 15:05
2016/08/01 05:00
2016/08/01 05:46
0
データベースを使って構いません。
ユーザーからアクセスがあるたびに API を叩いてもいいですが、人気サイトになるとそれでは反応が遅くなるのでキャッシュが必要でしょう。相手のサーバーが落ちていたりすることもあります。
そのようなデータをキャッシュするならデータベースが最善だと思います。
特定のサイトのことはソースを見るかその管理者に聞いてください。
データベースを扱えるスキルがあるならソースを見ればわかるはずです。
投稿2016/07/31 13:41
編集2016/07/31 13:48総合スコア28656
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/08/01 05:01
2016/08/01 05:04
2016/08/01 05:06
2016/08/01 05:10
2016/08/01 05:31
2016/08/01 06:17
2016/08/01 06:22
0
技術について言いたいことは他の方が言い尽くしているので、ルールについてだけ。
APIから取得した情報をデータベースに保持してよいかは各APIの規約によります。
たとえば「ぐるなびWebサービス利用規約」には
APIユーザーは、本APIを通して取得した情報を、外部からはアクセスできない社内システム等の環境で利用することはできません。
(中略)
APIユーザーは、弊社の知的財産の全部または一部を、販売、編集、加工、翻案、翻訳その他の変更、再配信、サブライセンスまたは譲渡することはできません。
などの条項があります。
あなたがやろうとしていることは規約違反になりませんか?
[参考] ぐるなびWebサービス利用規約
投稿2016/08/01 03:02
総合スコア925
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/08/01 04:57
2016/08/01 05:21
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。