ファイルに1行しか書いていないのに2回読まれる - PHPプロ!Q&A掲示板

2832

  • 0P

ファイルに1行しか書いていないのに2回読まれる

質問日時 / 2010年8月3日 16:42    回答数 / 3件

Questioner:  masahiroyamamoto  このエントリーをはてなブックマークに追加 

1)ファイルへ書き込むプログラム
別のHTML入力画面からデータを取得して、
ファイルに書き込んでいます。
<?php

#データを取得する
    $name    = $_POST["name"];
    $mail    = $_POST["mail"];
    $title   = $_POST["title"];
    $message = $_POST["message"];

    # 日本語表記の日時を得る
    $time = date("Y/m/d l H:i:s");

    # データを1行にまとめる(項目の区切りは%)
    $data = $time."%".$name."%".$mail."%".$title."%".$message."\n";

# 追加書き込みモードでファイルを開く
$handle = fopen("bbs","a") ;

flock($handle, LOCK_EX);

fwrite($handle,$data);

#ファイルをアンロックする
flock($handle, LOCK_UN);

fclose($handle);

#?>

2)ファイルから読み込むプログラム
1)で書き込んだファイルから1行ずつ読み込み、表示し、
ファイルが終了するまで継続しています。
このとき、1行余分に、読み込まれます。
すなわち、while(!feof($handle))で、1回余分にループしていることになります。
なぜでしょうか。

# 読み込みモードでファイルを開く
$handle = fopen("bbs","r") ;

#ファイルの最後まで読み込む
while(!feof($handle)){
#1行読み込む
$line=fgets($handle);

#1行の文字列を「%」で分解して項目と取り出す
$word=explode("%",$line);
$time=$word[0];
$name=$word[1];
    $mail=$word[2];
    $title=$word[3];
    $message=$word[4];

# 1件分のデータを表示する
print <<< HTML

<HTML>
<HEAD>
<TITLE>(^_^)</TITLE>
</HEAD>
<BODY>
<TABLE width="500" cellpadding="10" bgcolor="wheat">
<TR>
<TD>
<B>$time</B> <B>$title</B><BR>
<FONT color="green">$name</FONT>
<IMG src="email.gif" align="middle" hspace="5">
<A href="mailto:$mail">$mail</A><BR>
<BR>
$message
</TD>
</TR>
</TABLE>
<P>

</BODY>
</HTML>

HTML;

}

fclose($handle);

よろしくお願いします。

この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。



ツリー一覧

┣A01shimix1行目を読み込んだ時点では行末の改行で処理を終えて
┃┗A01-1masahiroyamamotoありがとうございました。
┗A02pannna# shimixさんのレスの指摘で事足りるのですが… フ

回答一覧

並び替え:

A01
answerershimix [8月3日 17:55] (最終編集:8月3日 18:00)

1行目を読み込んだ時点では行末の改行で処理を終えているのでまだEOFに達していないと判断されているハズです。つまり「EOFが書かれている2行目がある」のですがそれはまだ不定です(次にEOFがあるかどうかはこの時点ではわかっていません)。feofはEOFに達しているかのチェックですからまだ(1行目を読み終えた時点では)EOFに達していないことになります。

なので

  1. $line = fgets($handle);
  2. if ($line === false) { break; }
もしくは
  1. if (($line = fgets($handle)) === false) { break; }

としてやればいいです。

この意見に回答する

ツリーへ TOPへ

A01-1
replyermasahiroyamamoto [8月5日 12:42]

ありがとうございました。

この意見に回答する

ツリーへ TOPへ

A02
answererpannna [8月4日 01:16] (最終編集:8月4日 01:46)

# shimixさんのレスの指摘で事足りるのですが…

ファイルから文字列を読み込んだ際、読み込んだ文字列の長さや
explode関数で分割したそれぞれの文字列の長さをチェックする癖を付けたほうがいいです。
また、デリミタとして使用する記号も記述で使われることがないような文字列のほうがいいですね。
見たところ掲示板のログのようですが、"%"なんかは普通に使われる文字ですし。
あとはHTMLタグのエスケープ処理がないと表示したときにまずいことになるかと。

個人的には掲示板のログはXMLで保存したほうがいいのかな、なんて思います。

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
動的なURLを静的に見せる方法
 このエントリーをはてなブックマークに追加 
A
普通に考えて、mod_rewrite でしょうね。 http://www.nishishi.com/blog/2006/01/mod_rewrite_url.html...

>>続きを読む

GETのままでは検索エンジンのロボットが拾ってくれなかったためにSEO対策として有効だと言われていますね。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)