[PHP-users 11727] 簡単なbbsを作ったのですが

kaz php-users@php.gr.jp
Sat, 23 Nov 2002 21:38:57 +0900


こんにちは。まつもと@北河内です。
「PHP入門(AI出版)」を参考に簡単なBBSを作ってみました。
作業環境はFreeBSD4.7+apache1.3.27+php 4.2.2です。
テストをしてみると、内容欄に改行が無ければ書き込みはうまくいきます。
しかし、例えば適当な名前を記入して以下の順番で内容を書き込んでみると
おかしくなります。

1回目に記入する内容
a(改行)
b(改行)
c(改行)

2回目に記入する内容
a(改行)
b(改行)
c(改行)
d(改行)
e(改行)

3回目に記入する内容
a(改行)

色々考えてみましたが、何故こうなるのかわかりません。
宜しくお願いします。

以下、ソースです。
同じディレクトリにkakiko.dat(パーミッション666 or 606)を
置いていただく必要があります。

_________________ここから__________________

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 transitional//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=EUC-JP">
<title>てすとBBS</title>
</head>

<body>
<h1>ミニミニ伝言板</h1>
<p>何か一言書いてね</p>
<?php print ("<form action=\"" . $_SERVER['PHP_SELF'] . "\"
method=\"post\">\n") ?>
<p>お名前<br><input type="text" name="name" size="20" MAXLENGTH="30"></p>
<p>内容<br><textarea name="msg" cols="40" rows="10"></textarea></p>
<INPUT TYPE="submit" NAME="submit" VALUE="OK">&nbsp;&nbsp;&nbsp;
<INPUT TYPE="reset" NAME="" VALUE="リセット">
</form>

<?php

$now = date("Y/m/d H:i:s");
$data_file = "./kakiko.dat";
$data_max = 2;        //早くエラーを見ていただくために

$submit = $_POST['submit'];    //見にくいので入れなおします
$name = $_POST['name'];
$msg = $_POST['msg'];

convert (&$name);
convert (&$msg);

if ($submit != ""){
    if ($name == ""){print ("名前を入力してください");exit;}
    if ($msg == ""){print ("本文を入力してください");exit;}
    if (strlen ($name) > 40){print ("名前が長すぎます");exit;}
    if (strlen ($msg) > 400){print ("本文は200文字までとします");exit;}
    
    $fp = fopen($data_file,"r+") ;
    if ($fp == False){print ("<p>ファイルが開くことができません</p>");exit;}
    set_file_buffer ($fp, 0);
    flock ($fp,2);
    rewind ($fp);
    $lastmsgno = chop (fgets ($fp,10));
    $count = 1;
    while (($readbuf = fgetline($fp)) && ($count < $data_max)){
        $buf[$count] = chop ($readbuf);
        $count++;
    }
    $lastmsgno++;
    $buf[0] = implode (",",array($lastmsgno,$now,$name,$msg));
    //↑連結して、連想配列へ
    rewind ($fp);
    
    fwrite($fp,$lastmsgno . "\n"); //最終番号を記入
    for ($i = 0;$i<$count;$i++){
        fwrite ($fp,$buf[$i] . "\n");
    }
    flock ($fp,3);
    fclose ($fp);
}

$fp = fopen($data_file,"r");
if($fp == False){
    print ("ファイルを開くことができません\n");
    exit;
}

$count = 0;
$lastmsgno = fgets ($fp, 10);

while (($buf = fgetline($fp))&&($msg_num < $data_max)){
    list ($msg_num_new,$time_new,$name_new,$msg_new) = split ("," ,$buf);

    print ("[" . $msg_num_new . "]\n<small>" . $time_new .
"</small>\n<br>\n");
    print ("<strong>" . $name_new . "</strong>さんから<br>\n");
    print ("<p>『" . $msg_new . "』だそうです</p>\n<br>\n<br>\n");
    $count++;
    }
fclose ($fp);

function fgetline ($fp)            //ファイルの終わりか改行文字まで読み込む
{
    do{
        $str .= fgets($fp,4096);
    }
    while ($str != False && substr ($str, -1) != "\n");
    return $str;
}

function  convert($str)        //タグの無効化など
{
    $str = htmlspecialchars ($str) ;
    $str = stripslashes ($str);
    $str = ereg_replace (",", "、", $str) ;
    $str = ereg_replace (" | ","&nbsp;",$str) ; //半角・全角スペース変換
    $str = ereg_replace ("\r|\n|\r\n", "<br>" ,$str) ;
    return $str;
}

?>
</body>
</html>

--- k.matsumoto -----------
   eaald702@mkc.zaq.ne.jp
   OS        FreeBSD4.7
   www       Apache1.3.26
   php       PHP4.2.2