@toukanno
Revisions
Report this question
Subscribe question
Help us understand the problem. What is going on with this question?
Q&A

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

ユーザーには1、附番ID、2、ユーザーID、3、ユーザーの名前、4、パスワードが割り振られています。それぞれの
ユーザーの情報は、CSVファイルに書かれています。
附番は別のCSVファイルに書かれています
 そして投稿した内容も別のCSVファイルに書かれています。投稿できる内容はテキストボックスに書かれた内容と日付けのみです。それに対して返信できるようにしたいです。
返信は無限にできるようにしたいのですが今の構造のテーブルに挿入するのが難しいです。
画像も投稿できるようにしたいです 返信機能も画像投稿ができるようにしたいです ファイルが多いのでtop.phpだけ載せます 他はgithubに挙げています https://toukanno.github.io/phpNodblogincsv-reply/
一応最初の投稿には0を持たせて返信の投稿にはその附番を持たせました
他の問題点
問題点1、php7なら動くがphph5.3では動かない
問題点2,空の投稿内容が追加されてしまう

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

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

// function getUserText($flg)
// {
//  $handle = fopen("csv/text.csv", "r");
//  while ($line = fgets($handle)) {
//      $column = explode(",", $line);
//      if ($flg > 0) {
//          continue;
//      }
//      $user2["textid"] = trim($column[0]);
//      $user2["textflg"] = trim($column[1]);
//      $user2["id"] = trim($column[2]);
//      $user2["comment"] = trim($column[3]);
//      $user2["date"] = trim($column[4]);
//      $user2["deleteflg"] = trim($column[5]);
//      $value[] = $user2;
//      return $user2;
//  }
//  return false;
// }

?>
<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="hidden" name="flg" value="0">
                <input type="submit" value="投稿" class="btn btn-primary">
            </form>
        </div>
        <div class="row">
            <?php
            $handle = fopen("csv/text.csv", "r");
            while ($line = fgets($handle)) {
                $lines = explode(",", $line);
                $a[] = $lines;
                // $textids[] = $lines[0];
                // $textflgs[] = trim($lines[1]);
            }
            $b = array();
            foreach ($a as $key => $value1) {
                if ($value1[1] == 0) {
                    $b[] = $value1;
                    // $e[] = $value1;
                    // print_r($value1[2]);
                    foreach ($a as $key2 => $value2) {

                        if ($value1[0] == $value2[1]) {
                            $b[] = $value2;
                            // $c[] = $value2;
                        }
                    }
                }
            }
            // print_r($e);
            // $sorted_ary[] = $b;
            $a = $b;
            // print_r($a);

            echo "<table class='table'>
  <thead class='thead-light'>
    <tr>
    <th>番号</th>
    <th>ログインID</th>
    <th>ユーザー名</th>
    <th>コメント</th>
    <th>投稿日</th>
    <th></th>
        <th></th>
        <th></th>
    </tr>
  </thead>
  ";
            // $delete = array();//削除されたtextIDを保存する用の配列
            foreach ($a as $key3 => $value3) {
                // 削除したコメントは非表示にする。1が削除されたコメント。
                // $delete = array();
                if (preg_match("/1.$/", $value3[5])) {
                    // $delete[] = $value3[0]; //削除されたtextIDを保存する
                    continue;
                }
                //返信フラグに削除フラグがついた内容があったら消える
                // if (in_array($value3[1], (array)$delete)) {
                //  continue;
                // }

                $id = $value3[2];
                $login_id = "-";
                $name = "-";
                if (getLoginUser($id)) {
                    $login_id = getLoginUser($id)["login_id"];
                    $name = getLoginUser($id)["name"];
                }
                $textid = "-";
                $textflg = "-";
                $textid = $value3[0];
                $textflg = $value3[1];
                $comment = $value3[3];
                $datetime = $value3[4];
                $deleteflg = $value3[5];
                // $value = array($textid, $textflg, $id, $name, $date, $deleteflg, $comment, $datetime);

                echo "<tr>";
                echo "<td>" . $textid . "</td>";
                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="' . $textid . '" name= "textid">';
                    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 = "' . $textid . '" name= "textid">';
                    echo '  <input type="hidden" value = "' . $textflg . '" name= "textflg">';
                    echo '  <input type="hidden" value = "' . $comment . '" name= "comment">';
                    echo '  <input type="hidden" value = "' . $login_id . '" name= "login_id">';
                    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 = "' . $textid . '" name= "textid">';
                echo '  <input type="hidden" value = "' . $textflg . '" name= "textflg">';
                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>";

            ?>
        </div>
    </div>
</body>
text.csv
1,0,11,ないよう1,2020-09-24 07:09:07,0
2,0,11,ないよう2,2020-09-24 07:09:13,0
3,0,11,ないよう3,2020-09-24 07:09:21,0
4,0,11,ないよう4,2020-09-24 07:09:51,0
5,0,12,ないよう5,2020-09-24 07:09:32,1
6,0,12,ないよう6,2020-09-24 07:09:37,0
7,0,12,ないよう7,2020-09-24 07:09:45,0
8,7,12,7番目のuser3へ返信:ないよう8,2020-09-24 08:09:23,0
9,8,12,8番目のuser3へ返信:ないよう9,2020-09-24 09:09:13,0
10,6,11,6番目のuser3へ返信:へんしんないよう,2020-09-25 01:09:58,0
11,2,11,2番目のuser2へ返信:へんしんないよう2,2020-09-25 01:09:02,0
reply.php
<?php
require_once("func/header.php");
session_start();
if (!$_SESSION['id']) {
  header('Location: login.php');
  exit;
}
if (!$_POST['textid']) {
  header('Location: login.php');
  exit;
}


print_r($_POST['textid']);
print_r($_POST['login_id']);
print_r($_SESSION['id']);
?>
<!DOCTYPE html>
<title>返信内容</title>

<body>
  <div class="container">
    <h1>返信内容</h1>
    <div class="row">
      <p class="bg-success"><?php echo $_POST['textid']."番目"; ?></><br>
      <p class="text-light bg-dark"><?php echo $_POST['login_id']."さんに返信する"; ?></><br>
      <p class="bg-info"><?php echo "内容:".$_POST['comment']; ?></p><br>
      <form action="reply_done.php" method="post">
        コメント<br>
        <input type="text" name="comment"><br>
        <input type="hidden" value="<?php echo $_POST['textid']; ?>" name="textid"><br>
        <input type="hidden" value="<?php echo $_POST['login_id']; ?>" name="login_id"><br>
        <input type="submit" value="投稿" class="btn  btn-outline-primary"><br>
      </form>
    </div>
  </div>
</body>
reply_done.php
<?php
session_start();
require_once("func/header.php");
if (!$_SESSION['id']) {
    header('Location: login.php');
    exit;
}
if (!$_POST['textid']) {
    header('Location: login.php');
    exit;
}
print_r($_POST['textid']);
print_r($_POST['login_id']);
print_r($_SESSION['id']);
// ユーザからの情報があるかないかの確認
function getUserText($textid)
{
    $handle = fopen("csv/text.csv", "r");
    while ($line = fgets($handle)) {
        $column = explode(",", $line);
        if ($textid != trim($column[0])) {
            continue;
        }
        $user["textid"] = trim($column[0]);
        $user["textflg"] = trim($column[1]);
        $user["id"] = trim($column[2]);
        $user["name"] = trim($column[3]);
        $user["date"] = trim($column[4]);
        $user["deleteflg"] = trim($column[5]);
        return $user;
    }
    return false;
}
$user = getUserText($_POST['textid']);

if (!empty($_POST['comment'])) {
    $handle = fopen("csv/text.csv", "r");
    $data = "";
    while ($line = fgets($handle)) {
        $data .= $line;
    }
    // 投稿
    $textid = file("csv/textid.csv");
    $textid[0] +=1;
    $textids =fopen("csv/textids.csv","a");
    fwrite($textids,$textid[0]."\n");
    fclose($textids);
    $line = $textid[0];
    $line .= "," . $_POST['textid']; //最初の投稿かへんしんかどうか
    $line .= "," . $_SESSION['id'];
    $line .= "," . $_POST['textid'] . "番目の" . $_POST['login_id'] . "へ返信:" . $_POST["comment"];
    $line .= "," . date('Y-m-d H:m:s');
    $line .= "," . 0; //削除フラグ
    $line .= PHP_EOL;
    $data .= $line;
    fclose($handle);

    // 書き込み
    $handle = fopen("csv/text.csv", "w");
    fwrite($handle, $data);
    fclose($handle);
}
$textidfp = fopen("csv/textid.csv", "w");
        fwrite($textidfp, $textid[0]);
        fclose($textidfp);
?>
<meta http-equiv="refresh" content="1;URL=top.php">
コメントを投稿しました
comment_delete_done
<?php
session_start();
require_once("func/header.php");
$t = "";
if (!isset($_SESSION['id'])) {
    header('Location: login.php');
    exit;
}
if (!isset($_POST['textid'])) {
    header('Location: top.php');
    exit;
}

// 読み込み
$handle = fopen("csv/text.csv", "r");
$data = "";
while ($line = fgets($handle)) {
    $lines = explode(",", $line);
    if ($_POST['textid'] == $lines[0]) {
        // 削除フラグとして行末に1をつけることとした
        $line = $lines[0];
        $line .= "," . trim($lines[1]); //最初の普通の投稿かもしくは返信内容か?
        $line .= "," . $_SESSION['id'];
        $line .= "," . $_POST["comment"];
        $line .= "," . date('Y-m-d H:m:s');
        $line .= "," . 1; //削除フラグ
        $line .= PHP_EOL;
    }
    //postでわたってきたidとflgidを比較して一致したものを通す
    if($_POST['textid'] == $lines[1]) {
        $line = $lines[0];
        $line .= "," . trim($lines[1]); //最初の普通の投稿かもしくは返信内容か?textflg
        $line .= "," . trim($lines[2]); //userid
        $line .= "," . trim($lines[3]); //comment
        $line .= "," . date('Y-m-d H:m:s'); //時間
        $line .= "," . 1; //削除フラグをつける
        $line .= PHP_EOL;
    }
    $data .= $line;
}
print_r($data);
fclose($handle);

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

?>
<meta http-equiv="refresh" content="1;URL=top.php">
コメントを削除しました。
0
3
Answer

こちらが「投稿」を変更している部分だと思います.

https://github.com/toukanno/phpNodblogincsv-reply/blob/ddaca96f65d73e6c585a20b3dc40a648cb109df8/phpNodblogincsv-replykin/comment_change_done.php#L14-L37

if (!empty($_POST['comment'])) {
    $handle = fopen("csv/text.csv", "r");
    $data = "";
    while ($line = fgets($handle)) {
        $lines = explode(",", $line);
        if ($_POST['textid'] == $lines[0]) {
            // 編集
            $line = $lines[0];
            $line .= "," . trim($lines[1]); //最初の投稿か返信かどうか?
            $line .= "," . $_SESSION['id'];
            $line .= "," . $_POST["comment"];
            $line .= "," . date('Y-m-d H:m:s');
            $line .= "," . 0; //削除フラグ
            $line .= PHP_EOL;
        }
        $data .= $line;
    }
    fclose($handle);
}


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

L35-37 の部分で,$data を書き込んでいますが,
if (!empty($_POST['comment'])) { の内部が実行されていないのに,
(= $data の中身を作っていない)
$data をファイルに書き込んでいるようです.
つまり,空の内容を書き込んでいるようです.

例えば,

if (!empty($_POST['comment'])) {
  // $data を作る処理

  // $data を書き込む処理
}

のように,if の内側に,書き込む処理を移動することで,
$data が空の状態でファイルに書き込まないようにするのはどうでしょうか?

1
なるほどif文の外になっていました気づきませんでした有難うございます

```php:change_done.php

<?php
session_start();
if (!$_SESSION['id']) {
header('Location: login.php');
exit;
}
if (!$_POST['textid']) {
header('Location: top.php');
exit;
}
//postの値がからだったら送信できないようにもしたい
//この場合だとすべての投稿が削除されてしまう
// 読み込み
if (!empty($_POST['comment'])) {
$handle = fopen("csv/text.csv", "r");
$data = "";
while ($line = fgets($handle)) {
$lines = explode(",", $line);
if ($_POST['textid'] == $lines[0]) {
// 編集
$line = $lines[0];
$line .= "," . trim($lines[1]); //最初の投稿か返信かどうか?
$line .= "," . $_SESSION['id'];
$line .= "," . $_POST["comment"];
$line .= "," . date('Y-m-d H:m:s');
$line .= "," . 0; //削除フラグ
$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">
コメントを変更しました。
```


に直しました
change_done.php
<?php
session_start();
if (!$_SESSION['id']) {
    header('Location: login.php');
    exit;
}
if (!$_POST['textid']) {
    header('Location: top.php');
    exit;
}
//postの値がからだったら送信できないようにもしたい
//この場合だとすべての投稿が削除されてしまう
// 読み込み
if (!empty($_POST['comment'])) {
    $handle = fopen("csv/text.csv", "r");
    $data = "";
    while ($line = fgets($handle)) {
        $lines = explode(",", $line);
        if ($_POST['textid'] == $lines[0]) {
            // 編集
            $line = $lines[0];
            $line .= "," . trim($lines[1]); //最初の投稿か返信かどうか?
            $line .= "," . $_SESSION['id'];
            $line .= "," . $_POST["comment"];
            $line .= "," . date('Y-m-d H:m:s');
            $line .= "," . 0; //削除フラグ
            $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">
コメントを変更しました。

1

問題点1、php7なら動くがphph5.3では動かない

こちら,どこで問題になりますか?
エラーなどヒントがあれば探し易いと思います.

参考

問題点2,空の投稿内容が追加されてしまう

こちら,
https://github.com/toukanno/phpnodbkeijiban/blob/e2aaa745b17499ab2e9973758ea3d3ce41152bba/phpNodblogincsv-replykin/reply_done.php#L36

if (!empty($_POST['comment'])) {

のように対策されているようです.
なにか,こうすると期待通りに動かないといった例のようなものありますでしょうか?

0
変更の時空白で入力するとすべて消去される問題が発生しています
Help us understand the problem. What is going on with this answer?
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login