• ベストアンサー

ファイルへデータ登録

こんにちは。以下の内容アドバイス頂戴できれば幸いです。 これまでPHPとMySQL組み合わせで、少しずつ触ってきましたが、DBを使わずファイルを用いた場合、どのようなアルゴリズム?ファイル構成?になるのかが分からず、投函させていただきました。 どのようなものを作りたいかと申しますと・・MySQLを利用した場合、 テーブル:category no category1 1  北海道 2  青森 3  岩手  ・  ・ 以上、カラムnoは、auto_increment テーブル:shikugunn no c_no category2 1  1  札幌市 2  1  帯広市 3  1  釧路市 4  2  青森市 5  2  十和田市  ・  ・ 以上、カラムnoは、auto_increment。c_noはcategoryテーブルのno テーブル:member no c_no name  mail 1  1  まゆみ ○○@○○.com 2  3  みゆき △△@△△.com 3  2  ひとし △○@□○.com と、住んでいる都道府県、市区郡、名前、アドレスを登録させる場合、1つのデータベースでも構わないと思いますが、以上のようなデータベースになるかと思います。 また、上記データをブラウザ上で都道府県の名称から市区郡名、そして名前、アドレスを登録出来るようにし(修正・削除可とする)、同じくブラウザ上にて、検索機能を設けたいと思っております。 ここで、質問の本題に入りますが、これまでファイルにてデータを登録するようなプログラムを触ったことがなく、DBを使わずファイルへデータを書き込むような場合、データは1つのファイル内に書き込むべきなのでしょうか?それともDBのテーブル構成のように複数に分けるのでしょうか? また、ファイルにデータを書き込んだとき、ファイル内のデータはどのような形式で保存されるのでしょうか? 先にも申しましたが、ファイルを用いてデータを登録といった経験がなく、作成にあたりイメージが浮かばずに居る次第です。 上記のほかファイルを利用する際の注意点など、どんなことでも結構です。アドバイス頂戴できれば嬉しいです!宜しくお願い致します!

  • PHP
  • 回答数2
  • ありがとう数5

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

  • ベストアンサー
  • shimix
  • ベストアンサー率54% (865/1590)
回答No.2

使い方のイメージがないと設計も難しいでしょうけど、基本的には(DBでいうところの)テーブルごとにファイルを分ける方向でいいと思います。リレーション回りを作りこもうとするとスクリプトに負荷をかけることになりますが、そもそも「DBを使わない」という時点で複雑なリレーションは諦めざるを得ないでしょう。 保存方法は基本的にテキストファイルですね。CSVはANo.1の方も書かれていますが「奥が深い」ので(RFCを読んでみてください)、個人的にはタブ区切りの方が使いやすいと思います。タブコード(\t)はフォームからPOSTされてこないので確実に区切り文字として使えます。 なおtextareaからPOSTされる改行コードはnl2brしたあとで抹消しないといけません(必要に応じて元に戻します)。また(当然ですが)行末にはPHP_EOLを付加します。

mayu_chap
質問者

お礼

shimixさんへ はじめまして、こんばんは。 具体的なアドバイスをありがとう御座います! DBを使うことで簡単に行えることでも、ファイルを利用した場合は簡単にはいかないのですね。 ちょっとくじけそうですが、shimixさんのアドバイスをイメージしながら、改めて勉強してみようかと思います。 ありがとう御座いました。

その他の回答 (1)

  • inu2
  • ベストアンサー率33% (1229/3720)
回答No.1

>データは1つのファイル内に書き込むべきなのでしょうか?それともDBのテーブル構成のように複数に分けるのでしょうか? べき論で言えば、DBと同じほうが簡単ではありますが、リレーションを張ったり、FKが必要な場合はファイルだと面倒ですね。PHPでぐりんぐりんブン回すことになります。 ま、お好きなように ってのが正直なところ。 >ファイルにデータを書き込んだとき、ファイル内のデータはどのような形式で保存されるのでしょうか? それは貴方が決めること。どのように保存させたいのかを貴方が決めて実装すれば良いだけ。 一般的にはCSVが手っ取り早いかな けど、CSVのフォーマットって丁寧に一つ一つ吟味してゆくと奥深いですよ。

mayu_chap
質問者

お礼

inu2さんへ はじめまして、こんばんは。何だか難しそうですね。。 早速のご回答ならびに貴重なご意見をありがとう御座いました。

関連するQ&A

  • PHP+mysql データ重複登録

    ◆PHPバージョン 5.3.3 ◆mysqlバージョン 4.1.22 ◆テーブル情報 `no` int(11) NOT NULL auto_increment, `name` text NOT NULL, `mail` text NOT NULL, `memo` text NOT NULL, `updating` timestamp NOT NULL default CURRENT_TIMESTAMP, PRIMARY KEY (`no`) ENGINE=MyISAM DEFAULT CHARSET=utf8 ◆SQL (1)insert into test(name, mail, memo) values ('abc','abc@test.com','abc') (2)insert test set name='abc', mail='abc@test.com', memo='abc' ◆処理概要 $conn = mysql_connect(ホスト、ユーザ、パスワード); mysql_query("set names utf8"); $rs = mysql_select_db(DB名, $conn); $result = mysql_query(SQL, $conn); ◆登録情報 (1, 'abc', 'abc@test.com', 'abc', '2011-09-02 16:28:57'), (2, '', '', '', '2011-09-02 16:28:57'), 【問題】 上記SQL(1)、(2)どちらでDBに登録しても、登録情報のように同時に空データも同時に登録されてしまう 全く原因の検討がつかないので、何か手がかりがありましたらご教授頂けたらと思います。 どうぞよろしくお願いします。

    • ベストアンサー
    • MySQL
  • MYSQLのレコードを上書きしたいのですが…

    phpからMYSQL5に接続して以下のようなデータベースを作りました。 no name comment ←カラム名 1  山田 起きる 2  山田 叫ぶ 3  山田 寝る これを上書きして、 no name comment 1  山田 食べる 2  山田 遊ぶ 3  山田 寝る というようにレコードを更新したいのです。 しかし、どうやっても1、2、3の後に4、5、6と続いてしまいます。 「no」カラムにはauto_increment+primary keyを設定しています。 phpで構文を送る前に mysql_query("alter table db1 auto_increment=0"); を設定してみたり、 mysql_query("insert into db1 (name,comment) value ('山田','$comment')"); や mysql_query("replace into db1 (name,comment) value ('山田','$comment')"); を試してみましたが、上手く行きませんでした。 現在は、 mysql_query("delete from db1"); mysql_query("alter table db1 auto_increment=0"); ---php処理--- mysql_query("insert into db1 (name,comment) value ('山田','$comment')"); というように、二度目の書き込みを行う前に一旦テーブル内のレコードを すべて削除して書きなおすという方法を取っています。 しかし、数が多くなると一旦削除する作業を行うと処理が遅くなってしまうと思いますので、上書きしてデータベースを更新したいと思っているのですが、どのようにすればよいでしょうか?

    • ベストアンサー
    • MySQL
  • MySQLのデータファイルの位置について

    MySQLでテーブル、データベースを作成したのですが、 OS上から作成したテーブル・データベースが保存されているファイル(データファイル?) が見つけられません。 テーブルにデータをインサートしてコミットして、 セレクトを行ってデータは反映されていることは確認しています。 OSはWindows 7 MySQLのバージョンは5.5です。 user_dbというデータベースを作成し、 show databasesを行った結果、 information_schema mysql performance_schema test user_db が表示されることから、データベースuser_dbは正常に作られていると思います、 user_dbに対して、インサートは可能で、一度データベースを停止して、 再起動後、インサートしたデータがみれています。 しかし、インストールフォルダのMy.iniのdatadirで指定されているフォルダには mysql performance_schema のフォルダしかない状態です。(ここにuser_dbフォルダが作成されると思うのですが) どこにデータが保存されているのでしょうか?

    • ベストアンサー
    • MySQL
  • 同じデータが結果として出てくるので困ってます

    他人が作ったものを修正中です。 現在↓ カラム ID NO1 NO2 NO3     1  12 23 34 2 12 3 12 23 $sql="SELECT ID FROM `SHOPLIST`"; $db = mysql_query($sql); while($db2 = mysql_fetch_array($db)){ ・・・・省略 } 結果抽出データは 1 1 1 2 3 3 なぜか6件です。 NO1,NO2,NO3に値が入っている数と重複するデータ数が同じです。 現在はif文を使ってIDが同じものは処理しないという動きです。 これをif文を使わずに、MySQLだけでIDが同じものは抽出しないと いうことはできるのでしょうか。 考え方だけでも教えて頂きたいです、宜しくお願い致します。   

  • dbに登録したデータをphpのプルダウンに表したい

    mysqlに登録したデータをphpのプルダウンに表示させたいです。 database [db1] table [unit]カラム group varchar(20) に登録しているグループ名5個を選べるようにしたいのですが知恵を拝借できますでしょうか。 <?php $s=mysql_connect("サーバー名","アカウント","パスワード") or die("失敗しました"); print "接続OK"<BR>; mysql_select_db("db1"); ここから先が知りたいです。 みなさまのお知恵を拝借したいです。 ぜひよろしくお願い致します。

    • ベストアンサー
    • PHP
  • MySQLで同じデータにフラグ付け出来ますか?

    データベースの初心者です。MySQLを使用してSQL文を試しましたが、うまくいきません。 わかりやすく教えていただけますか? 下のような2つのテーブルで、テーブル2の項目カラムに存在するデータが、 テーブル1の区分にあれば、一致する行(NOカラムの5~7)だけに、 フラグ”1”を付けたいのです。(区分カラムに、"*"で始まるデータは除きます) 区分に、データが全て埋まっていれば簡単に出来るのですが、 先頭行のみデータがあって、次の区分まで、Nullが入っています。 テーブル1 NO 区分 フラグ 1  aaaaa   null 2  null     null 3  null     null 4  null     null 5  bbbbb   null 6  null     null 7  *nozoku  null 8  ccccc null 9  null null テーブル2 NO 項目 1  bbbbb 2  eeeee よろしくお願いします。

    • ベストアンサー
    • MySQL
  • codeigniterで3つのテーブルからデータ

    codeigniterで3つのテーブルからデータ取得したいのですが、どうやるのでしょうか? ・メインテーブルm … uid、pidカラム  ・ユーザーテーブルu … uidカラム ・都道府県テーブルp … pidカラム m.uid=u.uid、かつ、m.pid=p.pidてのをモデルに書きたいです。 2つまで結合するやり方だと、 $this->db->join('u', 'm.uid=u.uid でいけたのですが、 3つ結合する時は、どうやるのでしょうか? db->joinを使ってどうにか出来るのでしょうか? それとも別のメソッドを利用するのでしょうか?

    • ベストアンサー
    • PHP
  • データが追加されません

    mysql2.23 + PHPのプログラムで あらかじめ次のようなテーブルを作っています。 CREATE TABLE metadata(id smallint unsigned not null auto_increment primary key, me_date datetime, me_info text, me_file varchar (50)); 次にPHPで $meta_server = "metadata"; $conn = mysql_connect("localhost","root","root"); とここまでは大丈夫なのですが、その後 $sql = "INSERT INTO metadata(me_date, me_info, me_file) VALUES( '".substr$table', '".$note."', '".$filename."');"; $db = mysql_db_query($meta_server,$sql); としてもデータがテーブルに入りません。 どこに問題があるのでしょうか? 誰かヒントをお願いします。

  • 3つのテーブルを結合したSELECT文

    お世話になります。困っているので質問させて下さい。 MySQLのSQL文に関しての質問ですが、PHPで記述しているので、このPHPのカテゴリで投稿させて頂きます。ご了承下さい。 以下のようなカラムを持ったテーブルがあります。 実際に当方で用意しているカラムそのものなのですが、簡単に説明させてもらうと、この教えてGooのような質問を投稿できるサイトで、その質問となるデータを収めるのが、questionテーブル。会員データを収めるのがuserテーブル。PHPやMySQL、HTMLのように質問のジャンルを収めておくテーブルがcategory2です。 question(テーブル) q_no  q_user_no  q_category_no  q_title q_exp  q_img  q_date  q_state  q_answer_cnt  q_solution  state user(テーブル) user_no  user_mail  user_pass  user_n_name  user_icon category2(テーブル) no category_id category_no category2_name ※上記各テーブルの最初のカラムはauto-incrementとして自動で連番を与えています。 ここで質問に移ります。 questiontテーブルに質問データがいくつか収まっている状態で、質問単位(スレッド単位)で呼出すためにURLに、questionテーブルのq_noとなる番号をパラメータで渡しているのですが、 $sql = "SELECT * FROM question WHERE q_no = '$get_q_no' AND state = 'on' AND q_state = 'on'"; このように、questionだけを呼出すと問題ないものの、3つのテーブルを結合して呼出すと一部のデータが呼び出せない状態です。 $sql = "SELECT question.q_no, question.q_user_no, question.q_category_no, question.q_title, question.q_exp, question.q_date, question.q_state, question.q_answer_cnt, question.q_solution, question.state, user.user_no, user.user_n_name, user.icon, user.user_mail, category2.no, category2.category2_name FROM question INNER JOIN user ON question.q_user_no = user.user_no INNER JOIN category2 ON question.q_category_no = category2.no WHERE question.q_no = '$get_q_no' AND question.state = 'on' AND question.q_state = 'on'"; SQL文に問題があるのでしょうが、全てのデータが呼び出せないのであればともかく、一部のデータだけ呼び出せないという状況で、どこに問題があるか分からず、この場をお借りし質問させて頂ければと投稿しました。 最後になりましたが、MySQLは、5.1.22-rcです。 お忙しいなか恐縮ですが、アドバイスのほど頂戴出来れば幸いです。 宜しくお願い申し上げます。

    • ベストアンサー
    • PHP
  • カラムにデータがあるかないか確認したいです。

    環境:mySQL、PHP セレクト文で対象カラムの中にデータが入っているか否かを 確認するphpの書き方を教えていただけないでしょうか。。 例: たとえば、カラム名 no に1が入っていて そのレコードにある bunsyo の中にデータが入っているか否かを確認したいと 考えてます。 $kakunin = mysql_query("select bunsyo from テーブル名 where no=1 "); 上記だとデータを参照するだけなので、、、 入っているかいないかを確認したいと考えてます。 返ってくるのが true=1、false=0 とかで返ると次の処理がしやすいので助かります。。。 よろしくお願い致します。

    • ベストアンサー
    • PHP

専門家に質問してみよう