サイト上のデータからデータベースを更新する方法

このQ&Aのポイント
  • サイト上のデータからデータベースを自動更新する方法を探しています。現在は手動で更新していますが、少しでも自動化したいです。
  • 初心者のため、簡単な方法を探しています。過去のデータを保持しながら、新しいデータをデータベースに追加したいです。
  • サイト上のデータが更新されるたびに、データベースも更新されるようにしたいです。PHPとMySQLを使用しています。
回答を見る
  • ベストアンサー

サイト上のデータからデータベースを更新する方法

サイト上のデータから構築したデータベースがあります。 サイト上のデータが更新された場合に、連動してデータベースが更新したいと思っています。 現状は、ChromeのPage Monitorに更新が上がってきたら、目視で確認して、SQL文を叩いてinsertするという流れでやっています。 更新を少しでも自動化できればと思います。 とはいえ、当方はPHPとMySQLが少しできる程度の初心者なので、あまり複雑なことはできませんが。。。 初めにデータベースを構築した時は、Simple HTML DOM Parserを使ったので、これを使って更新を少しでも自動化できればと思いますが、勿論これを使わなくても構いません。 なお、サイト上のデータは、新しいものが下に来るとは限りません。 【更新前】 hoge1 hoge2 hoge3 【更新後】 hoge1 hoge4 New! hoge2 hoge3 上記のように追加されたものが途中に来る場合もあります。 一方、データベースの方では、ID管理しており、追加されたものは次のIDになるようにしたいです。 id     name 1     hoge1 2     hoge2 3     hoge3 4     hoge4 なお、マルチプライマリーキーを使っている関係で、idカラムにはauto_incrementは使っていません。 以上、情報が不足しているかもしれませんが、アドバイスいただければ幸いでございます。 (不足があればおっしゃってください。補足いたします。) また、サイト管理者には手間をかけない約束になっているので、APIで提供してもらうとかFTPで送ってもらうとか、そういうのはナシでお願いします。

  • MySQL
  • 回答数5
  • ありがとう数5

質問者が選んだベストアンサー

  • ベストアンサー
  • ki073
  • ベストアンサー率77% (491/634)
回答No.5

書き忘れましたが、 >これは、バッチ処理で行うようなかたちになろうかと存じますが、 バッチ処理は基本的には行いません。Windowsのバッチ処理やUNIIXのshellスクリプトも含めて、書くのが結構大変です。質問者さんは、PHPなどのスクリプト言語を書けるのですので、そこから命令を実行させて結果を受け取るのがずっと楽ですし、高機能なものができます。 実行環境としてLinuxも考えているのであれば、互換性の関係からPHPだけで書くのが良いと思います。 PHPの場合はshell_exec()などを使うようですね。

mic_goto
質問者

お礼

ありがとうございます。

その他の回答 (4)

  • ki073
  • ベストアンサー率77% (491/634)
回答No.4

diffというのはUNIX系のOSに備わっている命令です。 >PHPにもxdiff_file_diff 詳しいことは分かりませんが、同じ様なものかもしれません。どっちみちファイルにして差分を解釈しないといけないのでPHPで差分をとるのと、楽な方を使えばよいと思います。 変更、追加、削除がwebサイトで分からないのなら、データベースに持っているデータと全部突き合わすしかなさそうです。 データをデータベースに持つのではなく、適当な方法でシリアライズ(XML,YAML, JSONなど)して保存するのが楽かもしれません。 このあたりは総合判断ですね。 Web siteの更新をチェックする方法ですが、まず更新が行われているか判断できるURLを見つけます それをhttp://www.xxx.xxx/index.htmlとすると a) 書き換えた日時が得られるなら、以前の情報と比較する スクリプト言語にそういう命令があるかもしれません。 UNIX系OSの場合には curl -I http://www.xxx.xxx/index.html で Last-Modified: Wed, 16 Nov 2011 09:39:08 GMT のような情報が得られます b) あるいは、そのURLを読み込んで、テキストレベルで以前のものと比較する いずれにしても、情報をファイルに保存しておき比較することが必要です。

mic_goto
質問者

お礼

ありがとうございます。

  • ki073
  • ベストアンサー率77% (491/634)
回答No.3

変更や削除についてですが、webサイトのデータからそれが分かるようになっていれば、その情報をもとにデータベースを書き換えていく方法で対応できますが、それが分からない場合は a) データ容量がそれほど多くないので、新たにデータベースを作り直す。 b) データベースから全データを読み込んで、webサイトのデータの差を調べ、それに従ってデータベースを更新する 全部がテキストデータならdiffを使うと簡単にできます。 webサイトのデータが変更、追加、削除がわかるようになっているのでしょうか? >本番とテストでOSが異なるのはよろしくないでしょうか? 差を理解した上で使うのであれば問題ないと思います。改行コードや文字コードでつまずかないようにしてください。 お手軽にやりたいのならSQLite3の選択もあります。MySQLとSQLite3の両方を用意していますが、最近はSQLite3しか使っていないです。限界が見えたらMySQLにデータを移そうと思っていますが、まだその機会はないです。少人数でしか使っていないのでそのせいかも知れませんが。

mic_goto
質問者

お礼

ありがとうございます。 > webサイトのデータが変更、追加、削除がわかるようになっているのでしょうか? なっていません。 > 全部がテキストデータならdiffを使うと簡単にできます。 diffというのは、C言語でしょうか? C言語をやったことがないので、私には難しそうです。 探してみたところ、PHPにもxdiff_file_diffという関数があるようですね。 また、No.1で教えていただいたことに戻ってしまい恐縮ですが、「1) Web siteの更新をチェックする」について、よろしければ質問させてください。 これは、バッチ処理で行うようなかたちになろうかと存じますが、何分初心者なもので、「バッチ 作り方」等のキーワードで検索して出てくるページに理解が及びません。 このあたりの知識について、どの辺りから勉強していけばよろしいでしょうか? (ざっくりとした質問で恐縮です。)

  • ki073
  • ベストアンサー率77% (491/634)
回答No.2

まず確認ですが 1) データの構造ですが、普通はIDや見出しなどがあって、それに対していろいろな情報が付随してる場合が多いと思いますが、そのような構造をしていますか? 2) データ一件あたりのどれくらいの文字数(あるいはバイト数)はどれくらいでしょうか。また件数は何件くらいを想定していますか。 3) データは追加だけで、削除や一部変更などはないか。 4) OSは何を使っているのでしょうか 5) データベースソフトはMySQLなのか。その場合MySQLは別にサーバーを作っているのか を教えてください。 さて、 新しく得られた hoge1 hoge4 hoge2 hoge3 を順番にデータベースを検索して登録されているか確認します。 そうするとhoge4が見つからないので、追加登録します IDはデータベースの中にIDの最大値を見つけ+1してhoge4とする。 参考 http://sasuke.main.jp/max.html これでどうでしょうか。 IDは自動で振った方が重複やつけ忘れもないんですが。

mic_goto
質問者

お礼

ありがとうございます。 お陰様で追加の場合のやり方は、分かりました。 後は、頂いた確認事項3)にある削除の場合のやり方が分かりませんので、 二度手間になってしまい恐縮でございますが、 よろしければ、改めてご教示いただければ大変助かります。 なお、以下、頂いた確認事項にお答え申し上げます。 > 1) データの構造ですが、普通はIDや見出しなどがあって、それに対していろいろな情報が付随してる場合が多いと思いますが、そのような構造をしていますか? はい。そのような構造をしています。 > 2) データ一件あたりのどれくらいの文字数(あるいはバイト数)はどれくらいでしょうか。また件数は何件くらいを想定していますか。 200バイト、10000件くらいを想定しています。 3) データは追加だけで、削除や一部変更などはないか。 削除や一部変更もあり得ます。 4) OSは何を使っているのでしょうか 本番はLinuxです。 テスト環境は、Windows7(64bit)です。 本番とテストでOSが異なるのはよろしくないでしょうか? 5) データベースソフトはMySQLなのか。その場合MySQLは別にサーバーを作っているのか を教えてください。 MySQLです。 レンタルサーバを利用しており、WEBサーバーとデータベースサーバが別かどうか把握しておりません。 すみません。

  • ki073
  • ベストアンサー率77% (491/634)
回答No.1

少し手を加えれば十分可能なように思います。 整理すると 1) Web siteの更新をチェックする  一番単純なのが、更新されそうなページを定期的に読み込み、以前の状態と比較することです。 2) 更新があればデータを読み込む  Simple HTML DOM Parserで作ったものがあればそれを使う 3) データベースと照合し、更新のあったところを書き換える  データ数が少ないのなら丸ごと書き換えも可能。最初に作ったものがそのまま使える。更新分だけを変更したいのなら、データベースを読み込みつつ変更。 どこがわからないのでしょうか。 分けて考えて少しずつ作られてはいかがでしょか。 そのwebサイトが一般の公開されているものでしたら、こちらでも見てみますが。 私自身はPHPをほとんど使いませんので具体的なプログラムを提示できませんが、以上のことを簡単にでいるライブラリがあるはずで、それを組み合わせばそんなに手間がかからずにできるはずです。 rubyなら何を使えば簡単にできるかは思い浮かべられますので、PHPでも同じ様なものがあるはずです。

mic_goto
質問者

お礼

ありがとうございます。 ご提案の通り分けて考えたうえで、どこが分からないか明確にしたいと負います。 一旦、1)は置いておいて、2)及び3)について考えてみます。 以下のソースを持つページがあったとします。 <p>hoge1</p> <p>hoge2</p> <p>hoge3</p> まず、以下のように「Simple HTML DOM Parser」を使ってこのページのデータをデータベースにinsertします。 <?php require_once('simple_html_dom.php'); $html=file_get_html("http://www.example.com/"); $hoge=$html->find('p'); foreach($hoge as $value){ $name[]=$value->plaintext; } $pdo=new PDO("mysql:host=localhost;dbname=dbname","user","pass"); for($i=0;isset($name[$i]);$i++){ $pdo->query("insert into hoge values($n+1,'$name[$n]')"); } ?> そうすると、データベースは以下のようになります。 id     name 1     hoge1 2     hoge2 3     hoge3 次に、上記のページが以下に更新されたとします。 <p>hoge1</p> <p>hoge4</p> <p>hoge2</p> <p>hoge3</p> この場合にhoge4のidを4として、データベースに取り込むスクリプトの組み方が分かりません。 以上、よろしければ、改めてご教示いただいたくお願い申し上げます。

関連するQ&A

  • データベースのデータ更新について

    ネットショップの商品データの管理にMySQLを使用しています。 特定の日付以降、価格を変更(データベースの値を更新)しようと 考えているのですが、これをあらかじめタイマー製のスクリプトなどを組み、自動でする事は可能でしょうか? フィールド数や属性などは変更せず、あくまで値の更新(UPDATE?)のみです。 どなたか良い方法をご存じ・思いつく方、ご教示宜しく御願い致します。

    • ベストアンサー
    • MySQL
  • SQLite3にPHPでデータの更新・追加する方法

    PHP初心者です。 すみません、どなたか教えてください。 SQLite3 のデータベース内にあるテーブルに、同一データがすでにある場合はそのデータを更新、無い場合はデータを追加したいのですが、PHPではどのように書けばよいのでしょうか? 具体的には、hoge.dbの中のテーブル prime_ministers があり、 id 1, name 伊藤博文, origin 長州 id 2, name 黒田清隆, origin 薩摩 上記の2データはすでに保存されているものとします。 そこにデータを追加するのですが、 name 伊藤博文, origin 長州 の場合は、もうすでにテーブル内に伊藤博文のデータがあるので、上書き更新、 name 大隈重信, origin 肥前 の場合は、nameのカラムに大隈重信が無いので、データを追加。 データベースがSQLite3の場合、どのように書けば良いのでしょうか? どうぞよろしくお願いします。

    • ベストアンサー
    • PHP
  • データベースの更新日について

    最近部署移動であるデータベースを管理しているのですが。データの更新日が何処にも表示されていないので表示するようシステム管理者に依頼したら更新日データを保持してないとの回答でした。 以前の部署でSQLを利用しておりましたが、そのようなことはちょっと考えられなかったのですが、データベースを管理する上で、そんなことがありえるのでしょうか?データベースはAS/400のDB2を使っているそうです。

  • データベース

    データベースを使用するHPを作ろうかと思っています。 以下の内容が分からないので教えてください。 アクセスで、 ・一つのデータベースを複数のユーザーが個別に使用する。 ・複数のユーザーがID、パスワードを持ち個別に使用する。 ・データを他のサイトから自動入力する。 の様な処理をアクセスで構築できるでしょうか? 上記の内容をHP化し、使用できるようにしたいです。 またアクセスで構築できない場合、他はどんな言語を使用すればよろしいでしょうか? どうぞ宜しくお願いします。

  • Webサイトを複数人で管理・更新を行う場合のデータ管理について

    初めて質問させていただきます。 サイトの更新・管理などを複数で行う場合、 データの管理はどうするのが一番いいのでしょう? 現在、数十個のサイトを3人で管理しています。 そのサイトの殆どはデータベースなどは使用しない、 html、css、javascriptなどで構築したサイトです。 データの管理方法についての質問なのですが、 現在、3人それぞれが自分の担当するクライアントのデータを、 自分のローカルマシンで管理しています。 毎回必ず自分が更新するならこれで問題ないのですが、 実際はそうではなく手が空いている人が更新したりするので、 その度に、ローカルのサイトデータ、資料、デザインデータなどを 更新する人のPCにコピーしています。 こんな状態だと、どちらのデータが最新だか分からなくなるし、 毎回膨大なデータをコピーしたりと、かなり無駄があります。 普通はどうやって管理するものなんでしょう? なにかいい方法教えていただけないでしょうか? 例えば、それぞれのローカルPCにはデータは持たず、 ファイルサーバをローカルネットワーク上に一台置いて、 そこに全サイトのデータを入れて直接更新する・・・とかは可能でしょうか? みなさん実際どうやって管理していますか? よろしくお願いします。

  • データの連番

    重複しないように連番になるように AUTO_INCREMENTとPRIMARYが設定されているidフィールドがあるんですが、 データを削除したあと連番になりません。 例えばデータを10個作ると自動的にidフィールドに1~10まで番号がふられます。 id10のデータを削除し、新規で追加すると データのidは11になってしまいます。自動的に10に振り分けてほしいのですが可能なのでしょうか?

    • ベストアンサー
    • MySQL
  • MySQLにデータを登録した後、すぐ直前のデータを読み込む方法は?

    お世話になっております。 PHPでデータベースを作成しています。 同じページの中にデータをデータベースへ登録し、すぐ直後にauto_incrementの値を読み込み、変数にセットしたいのですが、うーーーん・・・ってな具合です。。 データは何でもいいのですが、主キーはauto_incrementにしています。(例:現在、100件データを入れている状態で、新規にデータを登録します。ID(主キー)は101になります。そのデータを登録した直後にこのIDの値101を取り出したいのです。) すみませんが、よろしくお願いいたします!!

    • ベストアンサー
    • MySQL
  • データの更新判断

    この方面に詳しくないので用語などに間違いがあるかもしれません SQL Server2008 RC2 を使っています データベースに複数のデータ列が存在してデータ件数(レコード数)は不定です プログラムは VC2010にて自作  ODBC経由でアクセス データベースの構造はある程度自分で加工可能 データベースへの件数の削除・追加・更新は自作プrグラム以外からも行われる 自作プログラム以外には以外には極力影響与えたくない 上記データベースの件数の変化については現状 SELECT COUNT (*) FROM [データベース名]  のポーリングで件数の増減の検出 新規追加の判断に関してはデータ列の中に データ登録日を保存することで それをソートして処理していますが 何処かのデータの一部が更新されたというのを検出することは可能なのでしょうか?   ※ 判断したいのはデータの追加と更新だけで削除されたデータが     どういったものであったかを判断する必要はありません 更新データも全データを都度ポーリングチェックすれば判断はできるでしょうが データ件数によってレスポンス的に使えない代物になると考えています データベースの設定やプログラム的なもので対処できるものなのか 無理なのか(個人的に無理だと考えてる) 可能であればどういった方法で実現できるのか わかる方がいたら教えていただけないでしょうか (無理なら無理で構わない  ->  詳しい方の判断を求めたい) 内容に不足があれば補足させていただきます

  • データベースの更新は手動でやるのが一般的??

    http://suumo.jp/tochi/kanagawa/yokohamashiisogo/__JJ_JJ010FJ001_arz1030z2bsz1030z2scz114107z2taz114.html こちらのサイトでは各物件の一部分の情報を、物件ごとにブロックに分けて一覧として表示していますが、 これらの情報はデータベースに保存されたデータを持ってきて表示していると思います。 この一覧ページが更新されるときは、データベースと物件ページの両方を手作業で更新しているのでしょうか。 1)物件のページが手作業で更新された 2)もし物件ページに変更が生じたら、何かがデータベースに知らされて自動的にデータベースが更新される 3)データベースが更新されたら、データベースを元に一覧ページを更新 という仕組みか、 1)物件のページが手作業で更新された、それに合わせてデータベースも手作業で更新する 2)データベースが更新されたら、データベースを元に一覧ページを更新 かどちらでしょうか。

  • データベースのフィールドのデータ型について

    くだらない質問で申し訳ありませんが宜しくお願いします。 下記のようなデータを格納するテーブルを構築しています。 ・ユーザーID ・名前 ・カタカナ ・パスワード ・年齢 ・郵便番号 ・住所1 ・住所2 ・住所3 ・電話番号 ・メールアドレス ・備考 ・削除フラグ ・登録者 ・登録日 ・更新者 ・更新日 上記の内容を下記のようなテーブルのフィールドのデータ型を考えました。 ・ユーザーIDのデータ型をVARCHAR(4) ・名前のデータ型をVARCHAR(32) ・カタカナのデータ型をVARCHAR(32) ・パスワードのデータ型をVARCHAR(255) ・年齢のデータ型をINTEGER ・郵便番号のデータ型をVARCHAR(8) ・住所1のデータ型をVARCHAR(255) ・住所2のデータ型をVARCHAR(255) ・住所3のデータ型をVARCHAR(255) ・電話番号のデータ型をVARCHAR(18) ・メールアドレスのデータ型をVARCHAR(255) ・備考のデータ型をTEXT ・削除フラグのデータ型をVARCHAR(1) ・登録者のデータ型をVARCHAR(4) ・登録日のデータ型をTIMESTAMP ・更新者のデータ型をVARCHAR(4) ・更新日のデータ型をTIMESTAMP そうしたら下記のような風にテーブルのフィールドのデータ型にしたら格納する文字列の桁エラーが起こらないからどうといわれました。 ・ユーザーIDのデータ型をVARCHAR(4) ・名前のデータ型をTEXT ・カタカナのデータ型をTEXT ・パスワードのデータ型をTEXT ・年齢のデータ型をTEXT ・郵便番号のデータ型をTEXT ・住所1のデータ型をTEXT ・住所2のデータ型をTEXT ・住所3のデータ型をTEXT ・電話番号のデータ型をTEXT ・メールアドレスのデータ型をTEXT ・備考のデータ型をTEXT ・削除フラグのデータ型をVARCHAR(1) ・登録者のデータ型をVARCHAR(4) ・登録日のデータ型をTIMESTAMP ・更新者のデータ型をVARCHAR(4) ・更新日のデータ型をTIMESTAMP ※現在、使用しているデータベースはPostgreSQLですが、Microsoft SQL ServerやOracleやMySQL等の他のデータベースでもいいものなのかもご教授いただけると助かります。 私の知識不足でどちらがいいのかがわからず投稿させてもらいました。 申し訳ありませんが皆さんのお知恵をお貸し下さい。 宜しくお願いします。