質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.80%

[PHP]掲示板でのコメント機能の不具合

受付中

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 628

score 4

コード

 前提・実現したいこと

掲示板の作成。

PHPで掲示板の作成をしています。
いろんな人がコメントを書き込めるようにしていて、一番目の人は正常に書き込めるのですが二番目の人が書き込むと一番目の人のコメントに上書きされてしまいます。

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

PHP

<?php
$data_file = 'keijiban.txt';
$ext = file_exists($data_file);
$lines = $ext ? file($data_file) : array();
$errMsg = "";
date_default_timezone_set('Asia/Tokyo');

if(isset($_POST['submit'])){
        if(empty($_POST['name'])){
                $errMsg='名前を入力してください<br>';
        }
        elseif(empty($_POST['free'])){
                $errMsg .='記事を入力してください';
        }

        if(!$errMsg){
                function convert_str($str){
                        $str=htmlspecialchars($str);
                        $str=preg_replace("/\r\n/","<br>",$str);
                        $str=preg_replace("/\r|\n/","<br>",$str);
                        return $str;
                }

                $ln = explode(",", $lines[0]);
                $no = $ext ? sprintf("%03d", $ln[0]+1) : "001";
                $name = convert_str($_POST['name']);
                $free = convert_str($_POST['free']);
                $delkey = !empty($_POST['delkey']) ? convert_str($_POST['delkey']) : '#####';
                $time = date("Y/m/d H:i:s");

                $data = "$no,$name,$free,$delkey,$time\n";
                array_unshift($lines,$data);
        }
}
        if(isset($_POST['delbtn']) && $ext){
                for($i = 0; $i < count($lines); $i++){
                        $ln = explode(",", $lines[$i]);
                        if($ln[0] == $_POST['no'] && $ln[3] == $_POST['Rdkey']){
                                array_splice($lines,$i,1);
                                break;
                        }
                }
        }

        if(isset($_POST['submit']) || isset($_POST['delbtn'])){
                $fk = fopen($data_file, 'w');
                foreach($lines as $line)
                        fputs($fk, $line);
                fclose($fk);
        }
?>

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>絵本の掲示板</title>
<link rel="stylesheet" href="keijiban.css">
</head>
<body>
<div id="wrapper">
<form method="post" action="keijiban.php">
<div class="center">
    <div id="title">絵本の掲示板</div>
    <p>
    No:<input type="text" name="no" size="5">
    削除キー:<input type="text" name="Rdkey" size="20">
    <input type="submit" name="delbtn" value="削除">
    </p>
</div>

<?php
        if($errMsg)
                echo"<div id='errMsg'>".$errMsg."</div>";
?>

<div id ="edit_area">
    <p>
    名前:<input type="text" name="name" size="26">
    削除キー:<input type="text" name="delkey" size="20">
    </p>
    <p>
    記事:<br><textarea name="free"></textarea>
    </p>
    <p class="center">
    <input type="submit" name="submit" value="書き込む">
    <input type="reset" value="取り消す">
    </p>
</div>

<?php
        foreach($lines as $line){
                $ln = explode(",", $line);
                echo"<div><p class='entry_ID'>[No.".$ln[0]."] 名前:".$ln[1]."&nbsp;";
                echo"書込み日付:".$ln[4]."</p>";
                echo"<p>".$ln[2]."</p>";
                echo"</div><hr>";
        }
?>

</form>
</div>
</body>
</html>


```

試したこと

上書きされてしまう、ということで配列の格納場所の移動ができていないのかと考え、確認してみましたが、私には間違いが発見できませんでした。

補足情報(FW/ツールのバージョンなど)

このプログラムはテラタームプロで作成しました。
ご回答よろしくお願いします!

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • m6u

    2020/01/20 18:16

    第2版であっても2017年4月のため、情報が古いです。例えば有名なCMSソフトであるWordPress最新版はPHP7.3以降が必須になっていたりなど、PHP7系に対応していない本の情報を鵜呑みにしてはいけないと考えます。PHPの関数を使う前に、PHPマニュアル https://www.php.net/manual/ja/ で引数や戻り値など念のため点検してください。 あと、htmlspecialchars() についてはこちらもご参照ください: https://qiita.com/mpyw/items/19e6fed835ccdbcb0d6d

    キャンセル

  • kirinkun_

    2020/01/20 18:21

    そうなんですね!わかりやすいご回答にリンクまでありがとうございます!!
    参考にさせていただきます!

    キャンセル

  • m.ts10806

    2020/01/20 18:22

    本当にやろうと思ったらロジック最初から組み直した方がスッキリすると思います。
    (あと、テキストファイルでデータ管理するやり方は実務で役に立ちません)

    キャンセル

回答 2

+1

試しに、ファイル名だけ変更してそのまま動かしてみたけど、
全くデータがない状況から、一人目の投稿をしたときに
$ln = explode(",", $lines[0]);でエラー「Notice: Undefined offset: 0 」になったりしたくらいで、
1行しかデータがない場合に$lines[0]じゃアクセスできないからっていう理由で、
少々微妙な気持ちになったり。

せめて、

if (is_array($lines)) {
}
else {
}


とかやってもいいかもしれない。

ちなみに、PHPのコーディングをやるときはたとえWindowsであっても、
UTF-8(BOMなし)エンコーディング、改行コードはLFで保存してる。
エンコーディングや改行コードの種類がわからないエディタを使っているようなら、
プログラミング向けのエディタを物色してほしい。
VisualStudioCodeでもいいだろうし。

まずは、keijiban.txtをまるっと削除して、
最初から再現テストをしてみてほしい。
(あるいは、削除する前にkeijiban.txtを開いて、余計な「,」を含んでいないかもチェック。)

あと、入力フォームに「,」が含まれると処理が破綻するので、
「,」を含んでいたらデータファイルが壊れてしまわないよう、
検証処理を加えるべき。
(よくネットで見られる簡易掲示板の、データ区切り文字は「,」を使わず「<>」だったりする。)

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

テスト環境で検証した結果疑わしい情報があります。

keijiban.textファイルの作成、読み込み、または書き込みが許可されているでしょうか。keijiban.textの中身を確認してください。真っ白のままならばパーミッションエラーで書き込みができない設定のままになっているはずです。その場合はひたすら入力された文字をそのまま配列に受けて流す繰り返しになりますので、何度やっても上書きを繰り返します。もし、存在しない場合は、権限がないためにkeijiban.textのファイル作成を行えない可能性が極めて高いです。

ini_set("display_errors","on");

これでエラー情報をチェックし、permission deniedと出ていれば間違いないです。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.80%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る