こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

テキストファイルに情報を格納したい。上手に動作せず

数百ページの各ページの特定部分の情報をテキストファイルに格納するものを作りたいのです。
テキストファイルを作るところまではできたのですが、上手にできません。
初めてページを開くなら情報の新規作成、2回目以降であれば上書きしたいです。
なにが原因で動かないのでしょうか。

<?php
$filename = "samplefile.txt";
$page_list = file($filename);

//--------------------------------
//手入力で内容を更新するエリア
//--------------------------------
$url = 1 ."page.php"; //現在開いているページ。http://test.com/236page.phpなどのようになる
$h1DATE = "タイトルテスト";
$imgDATE = "img/sample.jpg"; //全てのページで固定
$comeDATE = "これはテストです。";
//--------------------------------

$lines = $url."|".$h1DATE."|".$imgDATE."|".$comeDATE."\n"; //samplefile.txtに追加する行
$fp = fopen($filename, "a");
$file = file_get_contents($filename); //ファイルを全て文字列として取得
$text = explode("\n",$file); //\nを元に行を分けて配列に格納

for($i = 0; $i <= count($text) - 1; $i++){
if(ereg($url,$text[$i]) || ereg($h1DATE,$text[$i]) || ereg($imgDATE,$text[$i])|| ereg($comeDATE,$text[$i])){
$text[$i] = ""; //このページの$url、$h1DATE、$imgDATE、$comeDATEのどれかに一致するものはその行を削除
}
}

$text[count($text)] = $lines;
fwrite($fp, $text[count($text)]);
fclose($fp);
?>

<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>ページ1</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>

投稿日時 - 2012-03-19 19:01:14

QNo.7371671

すぐに回答ほしいです

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

あぁ。。。またやった。↓ これは 俺の間違い。

>↓は多分、「Array」って文字しか書き込まれない。
> fwrite($fp, $text[count($text)]);

んで、訂正。

↓ これは、$line 一行を 元のファイルに 追記してるだけ。
$text[count($text)] = $lines;
fwrite($fp, $text[count($text)]);

↑と↓は同義。

fwrite($fp, $lines);


この上のforで書き換えた内容は、書き込まれてない。

ファイル丸ごと上書きしたいなら、file_put_contents関数。

投稿日時 - 2012-03-20 15:31:28

お礼

アドバイスありがとうございます。

>> http://test.com/236page.phpなどのようになる
>ページ数分のPHPファイルが出来るという事?
はいそうです。

>だとしたら、色々 根本的に間違ってます。
>↓問題は起きないけど
問題が起きなければOKです。
bm_hiroさんであればどのようにしてページを増やしていきますか???

>↓これは foreachを使うべき。
>for($i = 0; $i <= count($text) - 1; $i++){
配列を順に取りだして処理する場合にはforeachを使うべき。
そっちの方が第3者が見たときに分かりやすいから?

アドバイスをもとに大改善したコードはNO1のお例文にのせました。
もしよろしければ見て下さい。

投稿日時 - 2012-03-20 21:24:56

ANo.2

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

> あたかも複数ページがあるかのようにしている。
> 複数ページあるように見えてるのですね。

んー、ごめん。俺には そういう発想がないせいか、「複数ページあるように見えて」いた事はないです。
「動的にページを生成している」としか思いません。
単純に言うと、HTMLだけのようなものを「静的」、PHPのようにアクセスの度に何か変わるのとかは「動的」と言います。

> 価格順に並び替、○○以上のものを絞り込みもしたい。
> アマゾンでキーワードを入れて検索すると一覧として表示

これは SQL文の書き方次第なのと、データベースから取ってきたデータを どのように扱うか次第です。

> テキストファイルではなく実際にデータベースを作ってやっていくべきですよね。

ん、まぁ、その方が無難です。

> 下記のような考え方をしていけば実現できますか。
> 以下略

表現の仕方などのせいか 内容に ちぃいちょい違和感を感じますが、概ね そんな感じでいいと思います。
MySQLしか使った事ないんで、アレですがSQLiteでも問題ないと思います。

> サンプルコードのアドバイスも頂けたらなと・・・

正直、今 そちらがやろうとしている事は そこそこ面倒なシロモノです。
小さな事から地道に「成功例」を作っていき、それを改変、増築して デカいものにしていったほうが良いです。

とりあえず、HTMLの<FORM>とPHPの絡みから始めてください。
その後、データベースの基礎などをやるか そこら辺からだと思います。

なんか 分らない事があれば、また ここで質問すれば 大御所二人とか誰かが答えてくれるかと思います。

投稿日時 - 2012-03-22 21:23:11

お礼

試してみます。本当にいろいろとありがとうございました。
諦めずに頑張っていこうと思います。

投稿日時 - 2012-03-23 00:02:46

ANo.3

とりあえず、そちらが何をやりたいのか イマイチ理解できていないまま、ツッコめるところだけツッコんだ俺がいます。

> どのようにしてページを増やしていきますか???

いや、、、うん。。。。
PHPファイルを増やしていくと言う発想自体がないです。

データベースが使えない環境だとしても、PHPファイルを増殖させていくと言うのは どうかと。。
「自分だけが使うものだから、メンテナンスとか関係ない」ってものにしても、このやり方は オススメできません。

↓みたいに、変数つけて、可変部分はデータとして扱い、メインとなるPHPファイルは1個です。

page.php?page=1

ちなみに、↑こういうのの取り出し方は こう↓

$page = $_GET[page];

----------------------------
んで、やりたいことを確認させてください。

数百ある、PHPファイルにアクセスする度に、テキストファイルに そのページのデータを 追記していく。
既に 存在する場合は、その行を消す。

って 事でいいでしょうか?

投稿日時 - 2012-03-21 20:49:55

お礼

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つ作り、データベースによって複数ページあるかのように見せかける。
(ページ増えたかのように)ページの新規追加は、データベースにデータを追加で実現。
その方法は、コマンドプロンプトなどでデータベースにアクセスして直接書き換え。
余裕があれば、データベース更新の機能をもったものを作れば便利で、ソフトっぽくなる。

どうでしょうか。
図々しいかもしれませんが、サンプルコードのアドバイスも頂けたらなと・・・

投稿日時 - 2012-03-21 22:39:26

ANo.1

どんな教科書を見たのか分かりませんが、ツッコミどころ満載なので、つい口を出したくなりました。
正直、書きなおしたほうが早いと思いましたが、順番にツッコんでいきます。

> 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)]);

流し読みだから、何か間違っててもご容赦ください。

投稿日時 - 2012-03-20 15:24:24

お礼

アドバイスをもとに改善しました。
これなら合格レベルでしょうか。

<?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>

投稿日時 - 2012-03-20 21:13:52

あなたにオススメの質問