toukanno
@toukanno (kurisu erisu)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

PHP DBなし 掲示板 返信機能について

ユーザーには1、附番ID、2、ユーザーID、3、ユーザーの名前、4、パスワードが割り振られています。それぞれの
ユーザーの情報は、CSVファイルに書かれています。
附番は別のCSVファイルに書かれています
 そして投稿した内容も別のCSVファイルに書かれています。投稿できる内容はテキストボックスに書かれた内容と日付けのみです。それに対して返信できるようにしたいです。
返信は無限にできるようにしたいのですが今の構造のテーブルに挿入するのが難しいです。

画像も投稿できるようにしたいです 返信機能も画像投稿ができるようにしたいです ファイルが多いのでtop.phpだけ載せます 他はgithubに挙げています
github url: https://github.com/toukanno/phpNodblogincsv-reply
replykinのほうです

top.php
<?php
require_once("func/header.php");

//ログインしたメンバーのみがアクセスできる初期画面
//ここでtext.csvユーザ情報を編集させる
session_start();
// // // ログイン済みかを確認
if (!isset($_SESSION['id'])) {
    header('Location: login.php');
    exit;
}


function getLoginUser($session_id)
{
    $handle = fopen("csv/user.csv", "r");
    while ($line = fgets($handle)) {
        $column = explode(",", $line);
        if ($session_id != $column[0]) {
            continue;
        }
        $user["id"] = trim($column[0]);
        $user["login_id"] = trim($column[1]);
        $user["name"] = trim($column[2]);
        return $user;
    }
    return false;
}
$user = getLoginUser($_SESSION['id']);
?>
<title>テキストテーブル</title>

<body>

    <div class="container">

        <h1>トップページ</h1>
        <div style="text-align:right;">
            <?php echo $_SESSION['name'] ?>さんでログイン中
            <a href="edit.php">[ユーザー情報編集]</a>
            <a href="logout.php">[ログアウト]</a>
        </div>

        <div class="row">
            <form action="comment_insert_done.php" method="post">
                コメント
                <input type="text" name="comment">
                <input type="submit" value="投稿" class="btn btn-primary">
            </form>
        </div>

        <div class="row">
            <?php
            //読み取り専用でファイルを開く
            $handle = fopen("csv/text.csv", "r");

            //  テーブルのHTMLを生成
            echo "<table class='table'>
  <thead class='thead-light'>
    <tr>
    <th>ログインID</th>
    <th>ユーザー名</th>
    <th>コメント</th>
    <th>投稿日</th>
    <th></th>
        <th></th>
        <th></th>
    </tr>
  </thead>
  ";

            //  csvのデータを配列に変換し、HTMLに埋め込んでいる
            //fgetで値を一行ずつ取得する

            // 主キー UPDATE / DELETE用
            $line_number = 0;

            // 自分自身のCSVの内容を表示
            while ($line = fgets($handle)) {
                $line_number++;
                // 削除したコメントは非表示にする。-から始まるものが削除されたコメント。
                if (preg_match("/^-/", $line)) {
                    continue;
                }
                // $linesっていう配列にexplodeでカンマ区切りを指定して $lineを区切って代入する
                $lines = explode(",", $line);

                $id = $lines[0];
                $login_id = "-";
                $name = "-";
                if (getLoginUser($id)) {
                    $login_id = getLoginUser($id)["login_id"];
                    $name = getLoginUser($id)["name"];
                }
                $comment = $lines[1];
                $datetime = $lines[2];

                echo "<tr>";
                echo "<td>" . $login_id . "</td>";
                echo "<td>" . $name . "</td>";
                echo "<td>" . $comment . "</td>";
                echo "<td>" . $datetime . "</td>";

                echo '<td>';
                if ($id == $_SESSION["id"]) {
                    echo '<form action="comment_change.php" method="post">';
                    echo '  <input type="hidden" value="' . $line_number . '" name= "line_number">';
                    echo '  <input type="submit" class="btn btn-success" value="変更" >';
                    echo "</form>";
                }
                echo "</td>";

                echo '<td>';
                if ($id == $_SESSION["id"]) {
                    echo '<form action="comment_delete_done.php" method="post" onClick="return confirm(\'削除しますか?\');">';
                    echo '  <input type="hidden" value = "' . $line_number . '" name= "line_number">';
                    echo '  <input type="submit" class="btn btn-danger" value="削除" >';
                    echo "</form>";
                }
                echo "</td>";

                echo '<td>';
                echo '<form action="reply.php" method="post" onClick="return confirm(\'返信しますか?\');">';
                echo '  <input type="hidden" value = "' . $line_number . '" name= "line_number">';
                echo '  <input type="hidden" value = "' . $login_id . '" name= "login_id">';
                echo '  <input type="hidden" value = "' . $comment . '" name= "comment">';
                echo '  <input type="submit" class="btn  btn-secondary" value="返信" >';
                echo "</form>";
                echo "</td>";

                echo "</tr>";
            }
            echo "</table>";


            // #4 ファイルを閉じる
            fclose($handle);
            ?>
        </div>
    </div>
</body>
comment.change_done.php
<?php
session_start();
if (!$_SESSION['id']) {
    header('Location: login.php');
    exit;
}
if (!$_POST['line_number']) {
    header('Location: login.php');
    exit;
}
//postの値がからだったら送信できないようにもしたい
//この場合だとすべての投稿が削除されてしまう
// 読み込み
if (!empty($_POST['comment'])) {
    $handle = fopen("csv/text.csv", "r");
    $line_number = 0;
    $data = "";
    while ($line = fgets($handle)) {
        $line_number++;
        if ($_POST["line_number"] == $line_number) {
            // 編集
            $line = $_SESSION['id'];
            $line .= "," . $_POST["comment"];
            $line .= "," . date('Y-m-d H:m:s');
            $line .= PHP_EOL;
        }
        $data .= $line;
    }
    fclose($handle);
}

// 書き込み
$handle = fopen("csv/text.csv", "w");
fwrite($handle, $data);
fclose($handle);

?>
<meta http-equiv="refresh" content="1;URL=top.php">
コメントを変更しました。

ここから返信処理をする 

reply.php
<?php
require_once("func/header.php");
session_start();
if (!$_SESSION['id']) {
  header('Location: login.php');
  exit;
}
if (!$_POST['line_number']) {
  header('Location: login.php');
  exit;
}

// // 投稿
// $line = $_SESSION['id'];
// $line.= "," . $_POST["comment"];
// $line.= "," . date('Y-m-d H:m:s');
// $line.= PHP_EOL;
// $data .= $line;
// fclose($handle);

?>
<!-- <meta http-equiv="refresh" content="1;URL=top.php"> -->
<!-- 返信を投稿しました。 -->

<!DOCTYPE html>
<title>返信内容</title>

<body>
  <div class="container">
    <h1>返信内容</h1>
    <div class="row">
      <h2><?php echo $_POST['login_id']."さんに返信する"; ?></h2>&nbsp;&nbsp;&nbsp;
      <h3><?php echo "内容:".$_POST['comment']; ?></h3>
      <form action="comment_insert_done.php" method="post">
        コメント
        <input type="text" name="comment">
        <input type="submit" value="投稿" class="btn  btn-outline-primary">
        <input type="hidden" value="<?php echo $_POST['line_number']; ?>" name="line_number">
      </form>
    </div>
  </div>
</body>
0

2Answer

以下の2つの質問があると考えています.

  1.  そして投稿した内容も別のCSVファイルに書かれています。投稿できる内容はテキストボックスに書かれた内容と日付けのみです。それに対して返信できるようにしたいです。
    • 返信は無限にできるようにしたいのですが今の構造のテーブルに挿入するのが難しいです。
  2. 画像も投稿できるようにしたいです 返信機能も画像投稿ができるようにしたいです ファイルが多いのでtop.phpだけ載せます 他はgithubに挙げています

返信機能ですが,text.csv の中にどの「投稿」に対する「返信」なのかを記録すれば実装できるのではないでしょうか.
無限に返信できる,というのはどこかに制限を感じているということでしょうか?
現状でも「投稿」自体には制限がかかっていないので,「返信」も制限が無いようにすれば良いかと思います.

画像投稿の部分は例えば以下の記事のように,ファイルを保存するというやり方もあると思います.

1Like

Comments

  1. @toukanno

    Questioner

    画像投稿機能はまだです。返信機能なのですが 返信もとに対して返信するのですが最初の投稿に対して返信はできるようにはなったのですが、返信に対しての返信ができないのでそれが問題です また明日ファイルを上げなおして質問しなおします

https://github.com/toukanno/phpnodbkeijiban/
を見てみたんですが,まだ内容が変わってないようでした.

ですので現状を見た回答ではありません.

投稿に対して返信はできるようにはなったのですが、返信に対しての返信ができないのでそれが問題です

これも「返信」が,どの「投稿」や「返信」に対しての「返信」であるか,を記録すれば達成できると考えています.
仮に,「投稿」,「返信」のどちらにも重複しないIDが付けられるとしたら,

ID ReplyTo Body createdAt
1 これは投稿です 20xx....
2 1 これは「1」への返信です 20xx...
3 2 これは「2」への返信です 20xx...

みたいなこともできるんではないか.と思いました.

1Like

Comments

  1. @toukanno

    Questioner

    なるほど 返信にもIDを付けるということですね まだ内容は変わっていません今あげます
  2. @toukanno

    Questioner

    アップロードしなおしました いろいろまだまだ問題点があります 空白の内容が追加されたりなど返信に対しての返信ができないだけでもいいので解決したいです
  3. @toukanno

    Questioner

    一応最初の投稿には0を持たせて返信の投稿にはその附番を持たせました
  4. リポジトリの中に,ディレクトリが2つありますね.
    - phpNodblogincsv-reply
    - phpNodblogincsv-replykin

    branch も2つあるようです.
    - master
    - toukanno-patch-1

    master / phpNodblogincsv-replykin が新しそうなので,それだと想定します.
    間違っていたら指摘してください.
  5. @toukanno

    Questioner

    phpNodblogincsv-replykin で間違いないです 404になったりフォルダの削除がわからないのですいません。
  6. 複数あることなど,それ自体は大丈夫です.
    対象が間違っていると,意見がこんがらがったりするので,念の為事前に確認しておくといいと思っていました.

Your answer might help someone💌