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をまだログインした掲示板にはなっていませんが ここにそれぞれのユーザが投稿できるようにしたいのとそれぞれ削除と編集ができるようにしたいです。
 まだうまく内容をまとめられずお見苦しいですが何から手を出していいのかわかりません。
教えていただくと幸いです。またそれぞれのファイルも一部一応載せます。修正点があれば教えてほしいです。
 このtop.phpにはまだユーザとの情報を紐ずけていませんが紐ずけたいです。
https://toukanno.github.io/phpNodblogincsv/
https://github.com/toukanno/phpNodblogincsv-reply

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

  header('Location: login.php');
  exit;
}
// print_r($_SESSOIN['id']);
// print_r($_SESSOIN['name']);
$user = fopen("csv/user.csv","r");
$value = array();
$userid = "";
$name = "";
$password = "";
while($line = fgets($user)) {
  $users = explode(",",$line);
  if($_SESSION['id'] == $users[0]){
    $userid = trim($users[1]);
    $name = trim($users[2]);
    $password = trim($users[3]);
  }
}
fclose($user);




if (!empty($_POST['text'])) {
  $datetime = date('Y-m-d H:m:s');
  $handle = fopen("csv/text.csv", "r");

  while ($line4 = fgets($handle)) {
    $lines4 = explode(",", $line4);
    // print_r($line4);
    $rands[] = $lines4[0];
  }
  fclose($handle);
  // fclose($handle);

  $min = 1;
  $max = 9;
  // $count =1;
  if (empty($tmp)) {
    $tmp = mt_rand($min, $max);
  }
  // $id = 0;

  while (true) {

    // print_r($rands);
    if (!in_array($tmp, $rands)) {
      $id = $tmp;
      // $count++;
      break;
    } elseif (in_array($tmp, $rands)) {
      $tmp = mt_rand($min, $max);
    }
  }
  // print_r($rands);

  $handle = fopen("csv/text.csv", "a");
  // ファイルへ書き込み
  fwrite($handle, $id . "," . $_POST['text'] . ",");
  fwrite($handle, $datetime . "\n");

  fclose($handle);
}
if (!empty($_POST['id'])) {


  $handle = fopen("csv/text.csv", "r");

  $value = array();
  while ($line2 = fgets($handle)) {
    $lines = explode(",", $line2);

    if ($lines[0] != $_POST['id']) {
      var_dump($lines[0]);
      $value[] = $line2;
    }
  }

  fclose($handle);

  $handle = fopen("csv/text.csv", "w");
  foreach ($value as $val) {
    fwrite($handle, $val);
  }

  fclose($handle);
}
if (!empty($_POST['id2']) && !empty($_POST['textchange'])) {
  $id2 = $_POST['id2'];
  $textchange = $_POST['textchange'];
  $datetime2 = date('Y-m-d H:m:s');
  $textcontent = $id2 . "," . $textchange . "," . $datetime2 . "\n";
  print_r($textcontent);

  $handle = fopen("csv/text.csv", "r");
  $value2 = array();
  while ($line3 = fgets($handle)) {
    $lines3 = explode(",", $line3);

    if ($lines3[0] != $id2) {

      $value2[] = $line3;

      var_dump(($lines3[0]));
    } elseif ($lines3[0] == $id2) {

      $value2[$id2] = $textcontent;
    }
  }

  fclose($handle);
  $handle = fopen("csv/text.csv", "w");

  foreach ($value2 as $val) {


    fwrite($handle, $val);
  }

  fclose($handle);
}

?>
<!DOCTYPE html>
<html lang="ja">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>テキストテーブル</title>
</head>

<body>
  <h1>トップ画面</h1>
  <p><?php echo $_SESSION['name'] ?>さんでログイン中</p>
  <form action="texttable.php" method="post">
    <input type="text" name="text">
    <input type="submit" value="送信">
    <input type="reset">
  </form>
  <form action="logout.php" method="post">
    <input type="submit" name="logout" value="ログアウト">
  </form>
  <form action="edit.php" method="post">
    <input type="hidden" name="userid" value="<?php echo $userid; ?>">
    <input type="hidden" name="name" value="<?php echo $name; ?>">
    <input type="hidden" name="password" value="<?php echo $password; ?>">
    <input type="submit"  value="ユーザ情報編集">
  </form>

  <?php

  //読み取り専用でファイルを開く
  $handle = fopen("csv/text.csv", "r");
  // $user = fopen("csv/user.csv","r");
  //  テーブルのHTMLを生成
  echo "<table border = 1>
    <tr>
    <th>ID</th>
    <th>名前</th>
    <th>内容</th>
    <th>日付</th>
    <th></th>
    <th></th>
    </tr>";

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

  while ($line = fgets($handle)) {
    // $linesっていう配列にexplodeでカンマ区切りを指定して $lineを区切って代入する
    // while($line = fgets($user)){
    // $lines = explode(",", $line);

    echo "<tr>";
    echo "<td>" . $users[1] . "</td>";//ここにIDを入れたい
    echo "<td>" . $users[2] . "</td>";
    echo "<td>" . $lines[1] . "</td>";
    echo "<td>" . $lines[2] . "</td>";
    echo '<td>';
    echo '<form action="texttable.php" method="post">';
    echo '<input type="hidden" value = "' . $lines[0] . '" name= "id">';
    echo '<input type ="submit" name = "destroy" value = "削除" >';
    echo "</form>";
    echo "</td>";
    echo '<td>';
    echo '<form action="textchange.php" method="post">';
    echo '<input type="hidden" value = "' . $lines[0] . '" name= "id">';
    echo '<input type ="submit" name = "change" value = "変更" >';
    echo "</form>";
    echo "</td>";
    echo "</tr>";

  }
  echo "</table>";


  // #4 ファイルを閉じる
  fclose($handle);
  ?>


</body>

</html>

このファイルは投稿内容を変更するファイルです一旦ここで情報を受け取りますまだユーザー情報と紐ずけていません

topcahnge.php
<?php
session_start();
print_r($_SESSION['id']);
print_r($_SESSION['name']);
// // // ログイン済みかを確認
if(!isset($_SESSION['id'])){

  header('Location: login.php');
  exit;
}
if (!empty($_POST['id'])) {
  $id = $_POST['id'];
  $placeholder = "";
  $handle = fopen("csv/text.csv", "r");
  while ($line = fgets($handle)) {
    $lines = explode(",", $line);

    if ($lines[0] == $_POST['id']) {
      $placeholder = $lines[1];
    }
  }
  fclose($handle);
}
?>


<!DOCTYPE html>
<html lang="ja">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>内容変更</title>
</head>
<?php


?>

<body>
  <form action="texttable.php" method="post">
    <input type="hidden" value="<?php echo $id; ?>" name="id2">
    <input type="text" name="textchange" value="<?php echo $placeholder; ?>">
    <input type="submit" value="送信">
    <input type="reset">
  </form>
</body>
</html>

//このCSVファイルもuser.csvと紐づけたい

text.csv
9,3,2020-09-16 13:09:43
2,2,2020-09-16 13:09:43
4,4,2020-09-16 13:09:43 //このCSVファイルもuser.csvと紐づけたい
4,2,2020-09-16 13:09:43

ここにそれぞれのユーザー情報が入っている edit.phpでユーザ情報を消したりしているので附番が疎らになっている
本来ならば順番道理になる。

user.csv
1,1,2,3
6,33333,444,444
7,3,3,3
9,3,222,222
id.csv
9

これは附番を一応残してあるだけなので実際には使わない

ids.csv
1
2
3
4
5
6
7
8
9

ユーザ情報を新規登録するPHP

signup_dune.php
<?php
$e = "";
$t1 = "";
$t2 = "";
//ログインしてない人向け画面
session_start();
// if(isset($_SESSION['id'])){
//   header('Location: top.php');//ログインしていればtexttable.phpへリダイレクト
//   exit;
// }



if (!empty($_POST['userid']) && !empty($_POST['name']) && !empty($_POST['password'])) {
  $userid = $_POST['userid'];
  $name = $_POST['name'];
  $password = $_POST['password'];
  $user = fopen("csv/user.csv", "r");
  while ($line = fgets($user)) {
    $users = explode(",", $line);
    $ids[] = trim($users[1]);
  }
  fclose($user);
  if (!in_array($userid, $ids)) {

    $id = file("csv/id.csv");
    $id[0] += 1;
    // fwrite()
    print_r($id);
    $idscsv = fopen("csv/ids.csv","a");
    fwrite($idscsv,$id[0]."\n");
    fclose($idscsv);
    // $user = fopen("csv/user.csv", "a");
    $user = fopen("csv/user.csv", "r");
    $value = array();
    while ($line = fgets($user)) {
      $lines = explode(",", $line);
      $value[] = $line;
    }
    // fwrite($user,$id[0].",". $userid . "," . $name . "," . $password . "\n");
    $textcontent = implode(",", array($id[0], $userid, $name, $password. "\n"));
    $value[] = $textcontent;
    $user = fopen("csv/user.csv", "w");
    foreach ($value as $val) {
      fwrite($user, $val);
    }
    fclose($user);
    $intid = fopen("csv/id.csv", "w");
    fwrite($intid, $id[0]);
    fclose($intid);
    $user = fopen("csv/user.csv", "r");
    while ($line = fgets($user)) {
      $users = explode(",", $line);
      if ($users[1] == $userid && trim($users[3]) == $password) {
        $_SESSION['id'] = $users[0];
        $_SESSION['name'] = trim($users[2]);
        $t1 = "登録が完了しました。";
        $t2 = "<a href='top.php' style = 'color:blue'>トップページへ</a>";
        // exit();
      }
    }
  } else {

    $e = "IDがすでに使われています";
    // exit();
  }
}


?>

<!DOCTYPE html>
<html lang="ja">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>マイページ登録</title>
  <link rel="stylesheet" type="text/css" href="register_confirm.css">
</head>

<body>

  <header>
    <h1 style="color: red;"><?php echo $e ?></h1>
    <p style = 'color:blue'><?php echo $t1 ?></>
    <?php echo $t2 ?>
  </header>

  <main>
    <div class="confirm">
      <div class="form_contents">
        <h2>会員登録 確認</h2>
        <p>こちらの内容で登録しても宜しいでしょうか?</p>
        <div class="name">
          ユーザID :
          <?php echo $_POST['userid']; ?>
        </div>
        <div class="name">
          名前 :
          <?php echo $_POST['name']; ?>
        </div>
        <div class="password">
          パスワード :
          <?php echo $_POST['password']; ?>
        </div>
        <div class="buttons">
          <div class="modoru_button">
            <a href="signup.php">戻って修正する</a>
          </div>
          <div class="submit">
            <form action="top.php" method="post">
              <input type="hidden" value="<?php echo $_POST['userid']; ?>" name="name">
              <input type="hidden" value="<?php echo $_POST['name']; ?>" name="mail">
              <input type="hidden" value="<?php echo $_POST['password']; ?>" name="password">
              <input type="submit" class="submit_button" size="35" value="登録する">
            </form>
          </div>
        </div>
      </div>
    </div>

  </main>

  <footer>
  </footer>

</body>

</html>

ここは先ほど質問して関数や別ファイルでまとめたほうがいいといわれたがまだ修正していないログインするファイル

login_done.php
<?php
//ログインするための画面
$e = "";
session_start();
//ログイン済みかを確認
if (isset($_SESSION['id'])) {
  header('Location: top.php'); //ログインしていればtexttable.phpへリダイレクト
  exit;
}
//ログイン機能



if (!empty($_POST['userid']) && !empty($_POST['password'])) {
  // print_r($_POST);
  // print_r($_SESSION);
  $userid = $_POST['userid'];
  $password = $_POST['password'];
  $user = fopen("csv/user.csv", "r");

  while ($line = fgets($user)) {
    $users = explode(",", $line);
    $ids[] = trim($users[1]);
    $passwords[] = $users[3];
    // print_r($users[3]);
    // print_r($users[1]);
  }
  fclose($user);

  if (in_array($userid, $ids)) {

    $user = fopen("csv/user.csv", "r");
    while ($line = fgets($user)) {

      $users = explode(",", $line);
      if ($users[1] == $userid && trim($users[3]) == $password) {
        $_SESSION['id'] = $users[0];
        $_SESSION['name'] = trim($users[2]);
        $e = "<a href='top.php' style = 'color:blue'>トップページへ</a>";
        // print_r($users[0]);
        print_r($_SESSION['id']);
        print_r($_SESSION['name']);
        break;
      } else {
        $e = "<a href='login.php' style = 'color:red'>パスワードが違います</a>";
        // break;
      }
    }
    fclose($user);
  } else {
    $e = "<a href='login.php' style = 'color:red'>IDが違います</a>";
  }
}


?>
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <?php echo $e; ?>
  <form action="top.php" method="post">
    <input type="hidden" value="<?php echo $_POST['userid']; ?>" name="name">
    <input type="hidden" value="<?php echo $_POST['name']; ?>" name="mail">
    <input type="hidden" value="<?php echo $_POST['password']; ?>" name="password">
  </form>
</body>

</html>

ここでユーザ情報だけを編集しているがIDがかぶってしまっているのに登録できてしまうのが問題点 エラーメッセジと登録完了メッセージが同時に出てしまうのが問題

edit.php
<?php
$e = "";
$t = "";
session_start();
if (!isset($_SESSION['id'])) {
  header('Location: login.php'); //ログインしていなければログインページへリダイレクト
  exit;
}
// print_r($_SESSION['id']);
// print_r($_SESSION['name']);
$user = fopen("csv/user.csv", "r");
$value = array();
$userid = "";
$name = "";
$password = "";
while ($line = fgets($user)) {
  $users = explode(",", $line);
  if ($_SESSION['id'] == $users[0]) {
    $userid = trim($users[1]);
    $name = trim($users[2]);
    $password = trim($users[3]);
  }
}
print_r($userid);
// print_r($name);
// print_r($password);
// fclose($user);
if (!empty($_POST['userid2']) && !empty($_POST['name2']) && !empty($_POST['password2'])) {
  $id = $_SESSION['id'];
  $userid = $_POST['userid2'];
  $name = $_POST['name2'];
  $password = $_POST['password2'];
  // var_dump($id);
  // var_dump($userid);
  // var_dump($name);
  // var_dump($password);
  // print_r($_POST);
  $user = fopen("csv/user.csv", "r");
  $value = array();
  while ($line = fgets($user)) {
    $lines = explode(",", $line);
    if ($lines[0] != $id && trim($lines[1]) == $userid) {

      print_r($lines[0]);
      $e = "IDがすでに使われています";
      // break;
    }
    if ($lines[0] != $id && trim($line[1]) != $userid) {
      $value[] = $line;
      // print_r($lines[0]);
    }

    if ($lines[0] == $id) {
      // print_r($lines);
      // print_r($value);
      $textcontent = implode(",", array($id, $userid, $name, $password . "\n"));
      // $textcontent =$id.",". $userid.",".$name.",".$password."/n";
      // $n = nl2br('/n');
      $value[] = $textcontent;
    }
  }
  fclose($user);
  print_r($value);

  $handle = fopen("csv/user.csv", "w");

  foreach ($value as $val) {
    fwrite($handle, $val);
  }
  fclose($handle);
  $_SESSION['name'] = $name;
  $t = "内容を編集しました";
}


?>



<!DOCTYPE html>
<html lang="ja">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>テキストテーブル</title>
</head>

<body>
  <p style="color:red"><?php echo $e; ?></p>
  <p style="color:blue"><?php echo $t; ?></p>
  <form action="edit.php" method="post">
    <p><?php echo $_SESSION['name'] . "さんのユーザ編集画面"; ?></p>
    <lavel>ID</lavel><br>
    <input type="text" name="userid2" value="<?php echo $userid; ?>">
    <br>
    <lavel>名前</lavel>
    </lavel><br>
    <input type="text" name="name2" value="<?php echo $name; ?>">
    <br>
    <lavel>パスワード</lavel><br>
    <input type="password" name="password2" value="<?php echo $password ?>">

    <br><input type="submit" value="編集">
    <br><input type="reset">
  </form>
  <a href="top.php">トップページ</a>
  <a href="delete.php">退会処理</a>

ユーザ情報を削除する退会処理

delete_done.php
<?php
session_start();
$t = "";
// if (!isset($_SESSION['id'])) {
//   header('Location: login.php');
//   exit;
// }
if (!isset($_POST['destroy'])) {
  $user = fopen("csv/user.csv", "r");
  $value = array();
  $value2 = array();
  while ($line = fgets($user)) {
    $users = explode(",", $line);
    if ($_SESSION['id'] != $users[0]) {
      $value[] = $line;
      // break;
    } else {
      $value2[] = $line;
    }
    print_r($value);
  }
  fclose($user);
  $user = fopen("csv/user.csv", "w");
  foreach ($value as $val) {
    fwrite($user, $val);
  }
  fclose($user);
  $t = "アカウントを削除しました";
  session_destroy();
}

?>

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <p style="color:blue"><?php echo $t; ?></p>

  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>アカウント退会処理</title>
</head>

<body>
  <form action="delete_done.php" method="post">
    <input type="submit" value="退会" name='destroy'>
  </form>
</body>

</html>
<a href="top.php">トップページ</a>
logout.php
<?php
session_start();
session_destroy();

header("Location:login.php");

?>
0

3Answer

量が多くて見づらいので Github にリポジトリを作ってソースを上げてもらえますか?

2Like

Comments

  1. あ、先程の修正した top.phpで

    <input type="hidden" value = "' . $line[0]

    のところは $lines[0] の間違いなので修正しておいてください。
  2. @toukanno

    Questioner

    ありがとうございます。tukiyo3さんは、本当に神ですまだ確認していませんが 今夜確認します‼
  3. @toukanno

    Questioner

    $lines[0]の2番目($lines[1])ですね
  4. @toukanno

    Questioner

    echo '<input type="hidden" value = "' . $lines[0] . '" name= "id">';
    echo '<input type="hidden" value = "' . $line[0] . '" name= "id">';のところなんですけど 
    echo '<input type="hidden" value = "' . $lines[0] . '" name= "id">';
    echo '<input type="hidden" value = "' .getLoginUser($lines[0])["login_id"]. '" name= "id">';
    もしかしてこうですか?
    それと$lines[0]でも大丈夫なんですか?
  5. @toukanno

    Questioner

    echo "<td>" . $users[1] . "</td>";//ここにIDを入れたい
    echo "<td>" . $users[2] . "</td>"; ここのところはいりますか?
  6. @toukanno

    Questioner

    確認不足ですいません 投稿機能と削除機能と変更機能はまだできていない感じですね?
    getLoginUser($lines[0])["login_id"]の部分がなぜ そうやって取得できるのかなど return array();の部分などいまだ理解が追い付いていません
  7. 今しがた改良して 投稿機能と削除機能と変更機能 に対応しました。
    https://github.com/tukiyo/phpNodblogincsv

    top.php : line_number を持たせました。この値で編集する行を決定します。
    comment_insert_done.php : コメントの投稿
    comment_change.php : コメントの編集画面
    comment_change_done.php : コメントの編集完了画面
    comment_delete_done.php : コメントの削除。csv/text.csv の行頭に-をつけて削除扱いとした
  8. @toukanno

    Questioner

    削除フラグとして先頭に-をつけることなるほどそういうことですね いろいろと参考になります。有難うございます。
  9. @toukanno

    Questioner

    またまだお願いしたいことがありますがよろしいでしょうか?
    top.phpでuser1とuser2どちらともの投稿が見れるようにしたいです。そこから自分だけの投稿を編集することは可能でしょうか?
  10. 対応しました

    > top.phpでuser1とuser2どちらともの投稿が見れるようにしたいです。そこから自分だけの投稿を編集することは可能でしょうか?
  11. cssを適用しました
  12. @toukanno

    Questioner

    css適用有難うございます cssで他のユーザの投稿が表示がされているって認識で大丈夫でしょうか?
  13. @toukanno

    Questioner

    あと削除ボタンを押したら コメントも日付けも消えるようにしたいです。
  14. 現状で、
    削除ボタンを押したら コメントも日付けも消えます。
    cssについては実際に動かしてみるとわかると思います。
  15. @toukanno

    Questioner

    cdnを読み込むだけで勝手にスタイルを変更してくれるってことですか?
  16. @toukanno

    Questioner

    それともクラス名を指定のものにするだけで勝手にスタイルが付くってことですか?
  17. cdnを読み込んで、クラス名を指定のものにするだけで
    いい感じにスタイルが付くという認識で良いかと思います。
  18. なるほど、今しがた削除したのが残る件と、Notice出力分、修正しました。
  19. @toukanno

    Questioner

    なるほどー 有難うございます
  20. ログインIDの重複は、登録前にuser.csvの中身をチェックして、
    既に登録されていたら登録処理をやめるのが良いと思います。
  21. @toukanno

    Questioner

    処理をやめる場合はbreakとかで大丈夫でしょうか?
  22. foreachを抜けるにはbreakでもいいし、フラグを持たせてif判定もいいでしょう。
    なんでも試してみるといいですよ
  23. @toukanno

    Questioner

    なるほど フラグを持たせることはまだやってないですので難しいですが 削除機能と同じ要領でやれば大丈夫でしょうか?
  24. @toukanno

    Questioner

    すいません。一つ一つ丁寧に修正していただきありがとうございます。 エラーがなければ保存するif($e == "")は結構これからも使いそうですね‼
  25. @toukanno

    Questioner

    自分でもうちょっと試したらいいと思うのですが user2でログインした場合 ログインしてトップページにはいくのですがログイン失敗というエラーメッセージも表示されます。なんで表示されるのでしょうか?user1は大丈夫です。
  26. はい、その方法がフラグを持たせるみたいなやり方の一つですね。
    素振りと思って何度も練習してみてください。
  27. user2の件、修正しました。
    login_done.php
  28. @toukanno

    Questioner

    user2の件 本当にありがとうございます。フラグを持たせるのは便利ですね
  29. @toukanno

    Questioner

    top.phpで他のユーザの投稿がなぜ見れるのかがまだわかっていません
  30. 1. 自分の投稿か、他のユーザーの投稿かを判別せずにそのまま全件投稿を表示

    2. 編集・削除 ボタン の表示は自分の投稿であれば表示

    というようになっています。
  31. @toukanno

    Questioner

    わかりました 有難うございます
  32. @toukanno

    Questioner

    何度も何度も質問すいません 
     追加で返信機能と画像ファイルをアップロードできる機能を追加したいです Twitterのように返信は何回でもできるようにしたいです
     また参考にしたコードをあげて質問し直しても大丈夫でしょうか?

Comments

  1. @toukanno

    Questioner

    このようなエラーが出ていて 内容と投稿日が残ります

oa.PNG

追加でお願いしたいです。edit.phpで他のユーザとidが一緒でも編集できてしまいます この場合はどうしたらよろしいでしょうか?

0Like

Your answer might help someone💌