- ベストアンサー
テキストファイルに情報を格納する方法が上手くいかない
- テキストファイルに情報を格納する方法が上手くいかず、質問者は上手に動作しないという問題に直面しています。
- 質問者は数百ページの各ページの特定部分の情報をテキストファイルに格納するという目的のためにプログラムを作成していますが、うまく実装できませんでした。
- 質問者はテキストファイルの作成はできたものの、ページを開くたびに情報の新規作成や上書きをしたいという要求に対応できていないようです。原因を特定することが求められています。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
あぁ。。。またやった。↓ これは 俺の間違い。 >↓は多分、「Array」って文字しか書き込まれない。 > fwrite($fp, $text[count($text)]); んで、訂正。 ↓ これは、$line 一行を 元のファイルに 追記してるだけ。 $text[count($text)] = $lines; fwrite($fp, $text[count($text)]); ↑と↓は同義。 fwrite($fp, $lines); この上のforで書き換えた内容は、書き込まれてない。 ファイル丸ごと上書きしたいなら、file_put_contents関数。
その他の回答 (3)
- bm_hiro
- ベストアンサー率51% (200/388)
> あたかも複数ページがあるかのようにしている。 > 複数ページあるように見えてるのですね。 んー、ごめん。俺には そういう発想がないせいか、「複数ページあるように見えて」いた事はないです。 「動的にページを生成している」としか思いません。 単純に言うと、HTMLだけのようなものを「静的」、PHPのようにアクセスの度に何か変わるのとかは「動的」と言います。 > 価格順に並び替、○○以上のものを絞り込みもしたい。 > アマゾンでキーワードを入れて検索すると一覧として表示 これは SQL文の書き方次第なのと、データベースから取ってきたデータを どのように扱うか次第です。 > テキストファイルではなく実際にデータベースを作ってやっていくべきですよね。 ん、まぁ、その方が無難です。 > 下記のような考え方をしていけば実現できますか。 > 以下略 表現の仕方などのせいか 内容に ちぃいちょい違和感を感じますが、概ね そんな感じでいいと思います。 MySQLしか使った事ないんで、アレですがSQLiteでも問題ないと思います。 > サンプルコードのアドバイスも頂けたらなと・・・ 正直、今 そちらがやろうとしている事は そこそこ面倒なシロモノです。 小さな事から地道に「成功例」を作っていき、それを改変、増築して デカいものにしていったほうが良いです。 とりあえず、HTMLの<FORM>とPHPの絡みから始めてください。 その後、データベースの基礎などをやるか そこら辺からだと思います。 なんか 分らない事があれば、また ここで質問すれば 大御所二人とか誰かが答えてくれるかと思います。
お礼
試してみます。本当にいろいろとありがとうございました。 諦めずに頑張っていこうと思います。
- bm_hiro
- ベストアンサー率51% (200/388)
とりあえず、そちらが何をやりたいのか イマイチ理解できていないまま、ツッコめるところだけツッコんだ俺がいます。 > どのようにしてページを増やしていきますか??? いや、、、うん。。。。 PHPファイルを増やしていくと言う発想自体がないです。 データベースが使えない環境だとしても、PHPファイルを増殖させていくと言うのは どうかと。。 「自分だけが使うものだから、メンテナンスとか関係ない」ってものにしても、このやり方は オススメできません。 ↓みたいに、変数つけて、可変部分はデータとして扱い、メインとなるPHPファイルは1個です。 page.php?page=1 ちなみに、↑こういうのの取り出し方は こう↓ $page = $_GET[page]; ---------------------------- んで、やりたいことを確認させてください。 数百ある、PHPファイルにアクセスする度に、テキストファイルに そのページのデータを 追記していく。 既に 存在する場合は、その行を消す。 って 事でいいでしょうか?
お礼
htmlファイルの場合はページごとにそのファイルを増やして作っていきますが、 そうではなく、phpファイルは1つで、情報を格納したファイルやデータベースを用意し、 その情報をphpのプログラムによって、あたかも複数ページがあるかのようにしている。 根本的に間違ってる、というのはそういう意味だったのですね。 やりたいことは、イメージ的に近いのは下記のサイトです。 http://www.youtube.com/ ゲームなどのキーワード入れると、各ページの一部の情報が集められ、一覧として表示 クリックすると各ページをそれぞれ見れる。 これも実は1つのファイルにデータベースが絡み、 複数ページあるように見えてるのですね。 http://sumai.homes.co.jp/Searchline/list/ 価格順に並び替、○○以上のものを絞り込みもしたい。 http://www.amazon.co.jp/s/ref=nb_sb_noss?__mk_ja_JP=%83J%83%5E%83J%83i&url=search-alias%3Dstripbooks&field-keywords=php&x=0&y=0 アマゾンでキーワードを入れて検索すると一覧として表示 最終的にしたいことは、数百ページを一覧ページに表示し、絞り込みや並び替えができるようにしたいです。まず初めにデータベースからデータを取得して表示するところからだと思い、最初のサンプルを作ったのですが、その考え方ではまったく無理だと分かりました。テキストファイルではなく実際にデータベースを作ってやっていくべきですよね。 下記のような考え方をしていけば実現できますか。 ~表示方法~ http://www.phpbook.jp/tutorial/sqlite/ このような関数を利用しデータベースへアクセスして表示 各ページと一覧ページどちらも同じ方法で表示できる。 ~一覧ページの絞り込みや並び替えなどの機能~ 上記URLの関数と、http://www.dbonline.jp/sqlite/select/を利用。 それで取得したデータをjavascriptやphpで処理させて機能させよう。 ~各ページの更新や新規の追加~ phpファイルを1つ作り、データベースによって複数ページあるかのように見せかける。 (ページ増えたかのように)ページの新規追加は、データベースにデータを追加で実現。 その方法は、コマンドプロンプトなどでデータベースにアクセスして直接書き換え。 余裕があれば、データベース更新の機能をもったものを作れば便利で、ソフトっぽくなる。 どうでしょうか。 図々しいかもしれませんが、サンプルコードのアドバイスも頂けたらなと・・・
- bm_hiro
- ベストアンサー率51% (200/388)
どんな教科書を見たのか分かりませんが、ツッコミどころ満載なので、つい口を出したくなりました。 正直、書きなおしたほうが早いと思いましたが、順番にツッコんでいきます。 > http://test.com/236page.phpなどのようになる ページ数分のPHPファイルが出来るという事? だとしたら、色々 根本的に間違ってます。 ↓問題は起きないけど、ファイルオープンのタイミングとしてはおかしい。 $fp = fopen($filename, "a"); ↓これは 後の流れを見るかぎり file()関数を使うべき。 $file = file_get_contents($filename); //ファイルを全て文字列として取得 $text = explode("\n",$file); //\nを元に行を分けて配列に格納 ↓これは foreachを使うべき。 for($i = 0; $i <= count($text) - 1; $i++){ ↓配列の最後に追加したいなら、array_push関数。 $text[count($text)] = $lines; ↓は多分、「Array」って文字しか書き込まれない。 fwrite($fp, $text[count($text)]); 流し読みだから、何か間違っててもご容赦ください。
お礼
アドバイスをもとに改善しました。 これなら合格レベルでしょうか。 <?php //-------------------------------- //手入力で内容を更新するエリア //-------------------------------- $pageNO = 1; //半角で。 $h1DATE = "タイトルテスト"; $imgDATE = "img/sample.jpg"; //全てのページで固定 $comeDATE = "これはテストです。"; //-------------------------------- $url = $pageNO ."page.php"; //現在開いているページ。http://test.com/236page.phpなどのようになる $pageDATE = $url."|".$h1DATE."|".$imgDATE."|".$comeDATE; $filename = "samplefile.txt"; $file = file_get_contents($filename); $text = explode("\n",$file); //以前にこのページを開きファイルに情報が追加されているかの確認、存在すれば削除 /*foreachの場合$line .= "\n";が機能しないのでfor foreach($text as $line){ $line .= "\n"; if(ereg($url,$line)){ $line = ""; } } */ for($i=0; $i<count($text); $i++){ $text[$i] .= "\n"; if(ereg($url,$text[$i])){ $text[$i] = ""; } } //このページの情報を追加 if($text[0] == "\n"){$text[0] = "";}//新規作成の場合\nだけの行ができるため array_push($text, $pageDATE); file_put_contents($filename, $text); ?> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>ページ<?php echo $pageNO ?></title> </head> <body> <div id="main"> <h1><?php echo $h1DATE ?></h1> <?php echo '<img src="'.$imgDATE.'" id="imgID" />' ?> <p id="comeID"><?php echo $comeDATE ?></p> </div> </body> </html>
お礼
アドバイスありがとうございます。 >> http://test.com/236page.phpなどのようになる >ページ数分のPHPファイルが出来るという事? はいそうです。 >だとしたら、色々 根本的に間違ってます。 >↓問題は起きないけど 問題が起きなければOKです。 bm_hiroさんであればどのようにしてページを増やしていきますか??? >↓これは foreachを使うべき。 >for($i = 0; $i <= count($text) - 1; $i++){ 配列を順に取りだして処理する場合にはforeachを使うべき。 そっちの方が第3者が見たときに分かりやすいから? アドバイスをもとに大改善したコードはNO1のお例文にのせました。 もしよろしければ見て下さい。