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

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

ただいまの
回答率

87.48%

掲示板、二重投稿防止にリダイレクトした場合session関数を使い編集機能を動かす

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 606

score 32

PHP初心者。
独習しながら課題に取り組んでいます。

現在掲示板を作りながら学習を進めており、編集機能に取り組んでします。
編集フォームで飛ばした番号の投稿を、投稿用フォームに表示させるところで躓いています。
これが解決した後、hiddenを使って編集であることの判定が出来るようにし、投稿内容を差し替えるようにつく作っていきます。

そこで、
前の質問の続きですhttps://teratail.com/questions/214752
新たにテスト用にファイルを作って、教えていただいたコードをコピペし効果を確かめました。
次に、変数名を変えて正しく動くことを確認。
次に、ファイル名も変数に加え、ループと番号の取り出しをして確認。
やりたいことは一応できましたがなぜか、$ret_arrayと$bangouがnullになってしましました。
どうしてかわかりますでしょうか?
PHP5.2.4 です。

<?php
session_start();
//変数の定義
$filename = "keijiban.txt"; /*保存するファイル*/
$hensyuNO=filter_input(INPUT_POST,"hensyuNO");

if (!is_null( $hensyuNO ) ) { //もしPOSTで編集用の番号が送信されたら
    $ret_array = file( $filename ); //ファイルを配列として読み込む
    foreach ( $ret_array as $value ) { //ループ
      $bangou = explode( "<>", $value ); //<>で分割し投稿番号取り出す
      if ( $hensyuNO == $bangou[ 0 ] ) { //送信と書き込みの番号が同じなら
        $_SESSION["Hno"] = $bangou[ 0 ];
        $_SESSION["Hname"] = $bangou[ 1 ];
        $_SESSION["Hcomment"] = $bangou[ 2 ];
        $_SESSION["Hdate"] = $bangou[ 3 ];
      }
    }
 header('Location: hensyuNO.php');
  exit;
}else{
  $hensyuNO=isset($_SESSION["hensyuNO"])?$_SESSION["hensyuNO"]:null;
}
var_dump($hensyuNO);
var_dump($ret_array);
var_dump($bangou);
var_dump($_SESSION["Hname"]);
?>
<!doctype html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>テスト</title>
</head>

<body>
<!--投稿フォーム-->
<form method="post" >
  <label for="name-field">お名前<span style="color: red;">【必須】</span><br>
  </label>
  <input type="text" name="name" id="name-field" required="required" value="<?php echo $_SESSION["Hname"];?>">
  <label for="comment">コメント<span style="color: red;">【必須】</span></label>
  <br>
  <textarea name="comment" cols="30" rows="3" id="comment" required="required"><?php
  echo $_SESSION["Hcomment"];
  ?>
</textarea>
  <input type="submit" value="投稿">
</form>
<!--編集番号指定用フォーム-->
<form method="post">
  <label for="hensyuNO" >編集対象番号</label>
  <input type="text" name="hensyuNO" value="123">
  <input type="submit" value="編集">
</form>
<?php
$filename = "keijiban.txt";
$search = array( "<<改行>>", "&lt;&gt;" ); //置き換え時の検索文字
$replace = array( "<br>", "<>" ); //置き換える文字

if ( is_file( $filename ) ) { //ファイルの存在確認
  $ret_array = file( $filename ); //配列として読み込む
  if ( empty( $ret_array ) === false ) { //配列があれば
    foreach ( $ret_array as $value ) { //ループ
      $bunkatu = explode( "<>", $value ); //<>で分割する
      foreach ( $bunkatu as $value2 ) { //ループ
        echo str_replace( $search, $replace, $value2 ) . "<br>\n"; //投稿内容を表示(<<改行>>と&lt;&gt;を<br>と<>に置き換える)
      }
    }
  } else { //配列がなければ
    echo "まだ投稿はありません"; //「まだ投稿がありません」と表示させる
  }
} else { //ファイルが存在しなければ
  echo "まだ投稿はありません"; //「まだ投稿がありません」と表示させる
}
?>
</body>
</html>


その後元のコードに組み込んで効果を見てみました。
なぜかテスト用の方で送信した番号の名前とコメントが表示されてしまいました。
そしてvar_dumpした変数の中身はテスト用で送信されたものが表示され$bangouのみnullでした。
今思うと、変数の中身が解決してから組み込むべきだったかなと思いました。

<?php
session_start();
//変数の定義
$filename = "keijiban.txt"; /*保存するファイル*/
$name = filter_input( INPUT_POST, "name" ); /*投稿者の名前*/
$comment = filter_input( INPUT_POST, "comment" ); /*投稿するコメント*/
$date = date( "Y-m-d H:i" ); /*投稿日時*/
$search = array( "\r\n", "\r", "\n", "<>" ); //置き換え時の検索文字
$replace = array( "<<改行>>", "<<改行>>", "<<改行>>", "&lt;&gt;" ); //置き換える文字
$deleteNO = filter_input( INPUT_POST, "deleteNO" ); //削除番号の変数定義
$hensyuNO = filter_input( INPUT_POST, "hesyuNO" ); //編集番号の定義
//投稿番号の定義
if ( is_file( $filename ) ) { /*ファイルの存在確認。*/
  //最後の行にプラス1
  $ret_array = file( $filename );
  $lastline = $ret_array[ count( $ret_array ) - 1 ];
  $num = explode( '<>', $lastline );
  $lastnum = $num[ 0 ] + 1;
} else { /*ファイルが無かった場合変数の定義を1とする*/
  $lastnum = 1;
}

//書き込み内容
$hozon = $lastnum . "<>" . str_replace( $search, $replace, $name ) . "<>" . str_replace( $search, $replace, $comment ) . "<>" . $date . "\n";

//投稿部分
/*もしポストで送信されたら以下の処理を行いGET送信でリダイレクトする(更新時の二重書き込み防止)*/
if ( !empty( $name ) && !empty( $comment ) ) { //もしPOSTで送信され名前とコメントがからでなかったら

  /*もし名前とコメントが送信されたら*/
  $fp = fopen( $filename, "a" ); /*追記モードでファイルを開く*/
  if ( flock( $fp, LOCK_EX ) ) { /*ロックする*/
    fwrite( $fp, $hozon ); /*指定したファイルに追記モードで書き込み*/
  }
  flock( $fp, LOCK_UN );
  fclose( $fp );
  header( 'Location: keijiban.php', true, 303 );
  exit;
} elseif ( !empty( $deleteNO ) ) { //もしPOSTで送信され 削除番号が空でなかったら
  $ret_array = file( $filename ); //ファイルを配列として読み込む
  $fp = fopen( $filename, "w" );
  if ( flock( $fp, LOCK_EX ) ) {
    foreach ( $ret_array as $value ) { //ループ
      $bangou = explode( "<>", $value ); //<>で分割し投稿番号取り出す
      if ( $deleteNO !== $bangou[ 0 ] ) { //もし読み込んだ番号と送信した番号が違ったら
        fwrite( $fp, $value ); //ファイルに書き込む           
      }
    }
  }
  flock( $fp, LOCK_UN ); //ロック開放
  fclose( $fp );
  header( 'Location: keijiban.php', true, 303 );
  exit;
} elseif ( !is_null( $hensyuNO ) ) { //もしPOSTで編集用の番号が送信されたら
  $ret_array = file( $filename ); //ファイルを配列として読み込む
  foreach ( $ret_array as $value ) { //ループ
    $bangou = explode( "<>", $value ); //<>で分割し投稿番号取り出す
    if ( $hensyuNO == $bangou[ 0 ] ) { //送信と書き込みの番号が同じなら
      $_SESSION[ "Hno" ] = $bangou[ 0 ];
      $_SESSION[ "Hname" ] = $bangou[ 1 ];
      $_SESSION[ "Hcomment" ] = $bangou[ 2 ];
      $_SESSION[ "Hdate" ] = $bangou[ 3 ];
    }
  }

  header( 'Location: keijiban.php', true, 303 );
  exit;
} else {
  $hensyuNO = isset( $_SESSION[ "hensyuNO" ] ) ? $_SESSION[ "hensyuNO" ] : null;
}
var_dump( $hensyuNO );
"<br>\n";
var_dump( $ret_array );
"<br>\n";
var_dump( $bangou );
"<br>\n";
var_dump( $_SESSION[ "Hname" ] );
"<br>\n";
?>
<!doctype html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>簡易掲示板</title>
<script>
window.addEventListener('DOMContentLoaded', function(){
  document.querySelector('#delbtn').addEventListener('click',function(e){
    if(!confirm('本当に削除しますか?')){
      alert('キャンセルされました'); 
      e.preventDefault();
    }
  });
});
</script>
</head>

<body>
<!--投稿フォーム-->
<form method="post" >
  <label for="name-field">お名前<span style="color: red;">【必須】</span><br>
  </label>
  <input type="text" name="name" id="name-field" required="required" value="<?php echo $_SESSION["Hname"];?>">
  <label for="comment">コメント<span style="color: red;">【必須】</span></label>
  <br>
  <textarea name="comment" cols="30" rows="3" id="comment" required="required"><?php
  echo $_SESSION[ "Hcomment" ];
  ?>
</textarea>
  <input type="submit" value="投稿">
</form>
<!--削除番号指定用フォーム-->
<form method="post" name="sakujo">
  <label for="deleteNO" >削除対象番号</label>
  <input type="text" name="deleteNO" id="deleteNO" >
  <input name="btn" type="submit" value="削除" id="delbtn">
</form>

<!--編集番号指定用フォーム-->
<form method="post">
  <label for="hensyuNO" >編集対象番号</label>
  <input type="text" name="hensyuNO" >
  <input type="submit" value="編集">
</form>
<?php
$filename = "keijiban.txt";
$search = array( "<<改行>>", "&lt;&gt;" ); //置き換え時の検索文字
$replace = array( "<br>", "<>" ); //置き換える文字

if ( is_file( $filename ) ) { //ファイルの存在確認
  $ret_array = file( $filename ); //配列として読み込む
  if ( empty( $ret_array ) === false ) { //配列があれば
    foreach ( $ret_array as $value ) { //ループ
      $bunkatu = explode( "<>", $value ); //<>で分割する
      foreach ( $bunkatu as $value2 ) { //ループ
        echo str_replace( $search, $replace, $value2 ) . "<br>\n"; //投稿内容を表示(<<改行>>と&lt;&gt;を<br>と<>に置き換える)
      }
    }
  } else { //配列がなければ
    echo "まだ投稿はありません"; //「まだ投稿がありません」と表示させる
  }
} else { //ファイルが存在しなければ
  echo "まだ投稿はありません"; //「まだ投稿がありません」と表示させる
}
?>
</body>
</html>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • MakotoIshizawa

    2019/10/03 19:06

    無名関数が使えないようでした。
    ちょっと、今の僕にはハードルが高く今日中に消化しきれませんでした。
    今回のコードを参考に前のコードをいじってみましたが、うまくいかず。
    あと、変数名を短くしようと、検索と置き換えを使ったら、変数名のスペルミスが見つかり修正しましたが、結局うまく行きませんでした。
    明日は、スペルミスをチェックしてからいじってみたいと思います。

    キャンセル

  • MakotoIshizawa

    2019/10/03 19:11

    二重投稿を防ぎたいからheader関数は投稿にだけあれば良いかもですか?
    編集も削除も、二重にPOSTされても問題なさそうな気がしましたが甘いですか?

    キャンセル

  • MakotoIshizawa

    2019/10/04 14:02

    今質問文にあるコードに近いもので投稿機能以外のheader関数を削除してみたら、
    $_session["name"]以外はちゃんと中身がありました。

    キャンセル

回答 2

+2

  • keijiban.php
<?php
session_start();
$s      =filter_input(INPUT_POST,"s");
$name   =filter_input(INPUT_POST,"name");
$comment=filter_input(INPUT_POST,"comment");
$no     =filter_input(INPUT_POST,"no");
$fname  ="keijiban.txt";
if(!file_exists($fname)) die("no file"); // 追記
if($s==="編集"){
  $fp=fopen($fname,"r");
  while(($row=fgetcsv($fp,1024))!==false){
    $rows[]=$row;
  }
  fclose($fp);
  $rec=array_filter($rows,function($x) use($no){
    return $x[0]===$no;
  });
  if(count($rec)>0){
    /* 修正
    $rec=array_values($rec)[0];
    */
    $rec=array_shift($rec);
    $_SESSION["name"]    =$rec[1];
    $_SESSION["comment"] =$rec[2];
  }else{
    $_SESSION["name"]    ="";
    $_SESSION["comment"] ="";
  }
}
if($s==="投稿"){
  $fp=fopen($fname,"r");
  while(($row=fgetcsv($fp,1024))!==false){
    $rows[]=$row;
  }
  fclose($fp);
  /* 修正
  $key=array_keys(array_filter($rows,function($x) use($no){
    return $x[0]===$no;
  }))[0];
  */
  $key=array_shift(array_keys(array_filter($rows,function($x) use($no){
    return $x[0]===$no;
  })));

  if($key>=0){
    $row=&$rows[$key];
  }else{
    $row=&$rows[];
  }
  $row[0]=$no;
  $row[1]=$name;
  $row[2]=$comment;
  unset($row);
  $fp=fopen($fname,"w");
  foreach ($rows as $row) {
    fputcsv($fp, $row);
  }
  fclose($fp);
}


if (!is_null($name) and !is_null($comment) ) {
  $_SESSION["name"]    =$name;
  $_SESSION["comment"] =$comment;
  header('Location: '.$_SERVER["SCRIPT_NAME"]);
  exit;
}elseif (!is_null($no)) {
  $_SESSION["no"]      =$no;
  header('Location: '.$_SERVER["SCRIPT_NAME"]);
  exit;
}else{
  $name   =isset($_SESSION["name"])?   $_SESSION["name"]   :null;
  $comment=isset($_SESSION["comment"])?$_SESSION["comment"]:null;
  $no     =isset($_SESSION["no"])?     $_SESSION["no"]     :null;
}
$h_name   =htmlspecialchars($name);
$h_comment=htmlspecialchars($comment);
$h_no     =htmlspecialchars($no);
?>
<style>
.required{color:red;}
</style>

<form method="post" >
<input type="text" name="no" value="<?=$h_no;?>" readonly><br>
お名前<span class="required">【必須】</span>
<input type="text" name="name" id="name-field" required="required" value="<?=$h_name;?>"><br>
コメント<span class="required">【必須】</span><br>
<textarea name="comment" cols="30" rows="3" id="comment" required="required">
<?=$h_comment;?>
</textarea>
<input type="submit" name="s" value="投稿">
</form>

<form method="post">
編集対象番号
<input type="number" name="no" value="<?=$h_no;?>" min="1" required>
<input type="submit" name="s" value="編集">
</form>
  • keijiban.txt
1,hoge,あああああ
2,fuga,いいいいい
3,piyo,うううう

下位互換(とりあえず)

<?php
session_start();
$s      =filter_input(INPUT_POST,"s");
$name   =filter_input(INPUT_POST,"name");
$comment=filter_input(INPUT_POST,"comment");
$no     =filter_input(INPUT_POST,"no");
$fname  ="keijiban.txt";
if(!file_exists($fname)) die("no file"); // 追記
if($s==="編集"){
  $fp=fopen($fname,"r");
  while(($row=fgetcsv($fp,1024))!==false){
    $rows[]=$row;
  }
  fclose($fp);
  foreach($rows as $val){
    if($val[0]===$no) $rec[]=$val;
  }
  //$rec=array_filter($rows,function($x) use($no){
  //  return $x[0]===$no;
  //});
  if(count($rec)>0){
    /* 修正
    $rec=array_values($rec)[0];
    */
    $rec=array_shift($rec);
    $_SESSION["name"]    =$rec[1];
    $_SESSION["comment"] =$rec[2];
  }else{
    $_SESSION["name"]    ="";
    $_SESSION["comment"] ="";
  }
}
if($s==="投稿"){
  $fp=fopen($fname,"r");
  while(($row=fgetcsv($fp,1024))!==false){
    $rows[]=$row;
  }
  fclose($fp);
  /* 修正
  $key=array_keys(array_filter($rows,function($x) use($no){
    return $x[0]===$no;
  }))[0];
  */
  foreach($rows as $index=>$val){
    if($val[0]===$no){
      $key=$index;
      break;
    }
  }
  //$key=array_shift(array_keys(array_filter($rows,function($x) use($no){
  //  return $x[0]===$no;
  //})));

  if($key>=0){
    $row=&$rows[$key];
  }else{
    $row=&$rows[];
  }
  $row[0]=$no;
  $row[1]=$name;
  $row[2]=$comment;
  unset($row);
  $fp=fopen($fname,"w");
  foreach ($rows as $row) {
    fputcsv($fp, $row);
  }
  fclose($fp);
}


if (!is_null($name) and !is_null($comment) ) {
  $_SESSION["name"]    =$name;
  $_SESSION["comment"] =$comment;
  header('Location: '.$_SERVER["SCRIPT_NAME"]);
  exit;
}elseif (!is_null($no)) {
  $_SESSION["no"]      =$no;
  header('Location: '.$_SERVER["SCRIPT_NAME"]);
  exit;
}else{
  $name   =isset($_SESSION["name"])?   $_SESSION["name"]   :null;
  $comment=isset($_SESSION["comment"])?$_SESSION["comment"]:null;
  $no     =isset($_SESSION["no"])?     $_SESSION["no"]     :null;
}
$h_name   =htmlspecialchars($name);
$h_comment=htmlspecialchars($comment);
$h_no     =htmlspecialchars($no);
?>
<style>
.required{color:red;}
</style>

<form method="post" >
<input type="text" name="no" value="<?=$h_no;?>" readonly><br>
お名前<span class="required">【必須】</span>
<input type="text" name="name" id="name-field" required="required" value="<?=$h_name;?>"><br>
コメント<span class="required">【必須】</span><br>
<textarea name="comment" cols="30" rows="3" id="comment" required="required">
<?=$h_comment;?>
</textarea>
<input type="submit" name="s" value="投稿">
</form>

<form method="post">
編集対象番号
<input type="number" name="no" value="<?=$h_no;?>" min="1" required>
<input type="submit" name="s" value="編集">
</form>

むちゃくちゃ古くても動く書き方

<?php
header('content-type:text/html;charset=UTF8');
session_start();
function get_post($val){
  return isset($_POST[$val])?$_POST[$val]:null;
}
$s      =get_post("s");
$name   =get_post("name");
$comment=get_post("comment");
$no     =get_post("no");
$fname  ="keijiban.txt";
if(!file_exists($fname)) die("no file");
if($s==="編集"){
  $fp=fopen($fname,"r");
  while(($row=fgetcsv($fp,1024))!==false){
    $rows[]=$row;
  }
  fclose($fp);
  foreach($rows as $val){
    if($val[0]===$no) $rec[]=$val;
  }
  if(count($rec)>0){
    $rec=array_shift($rec);
    $_SESSION["name"]    =$rec[1];
    $_SESSION["comment"] =$rec[2];
  }else{
    $_SESSION["name"]    ="";
    $_SESSION["comment"] ="";
  }
}
if($s==="投稿"){
  $fp=fopen($fname,"r");
  while(($row=fgetcsv($fp,1024))!==false){
    $rows[]=$row;
  }
  fclose($fp);
  foreach($rows as $index=>$val){
    if($val[0]===$no){
      $key=$index;
      break;
    }
  }

  if($key>=0){
    $row=&$rows[$key];
  }else{
    $row=&$rows[];
  }
  $row[0]=$no;
  $row[1]=$name;
  $row[2]=$comment;
  unset($row);
  $fp=fopen($fname,"w");
  foreach ($rows as $row) {
    foreach ($row as $key=>$val) {
      if(!is_numeric($val)){
        $val=str_replace("\"","\"\"",$val);
        $val="\"".$val."\"";
        $row[$key]=$val;
      }
    }
    fwrite($fp,implode(",",$row)."\r\n");
  }
  fclose($fp);
}


if (!is_null($name) and !is_null($comment) ) {
  $_SESSION["name"]    =$name;
  $_SESSION["comment"] =$comment;
  header('Location: '.$_SERVER["SCRIPT_NAME"]);
  exit;
}elseif (!is_null($no)) {
  $_SESSION["no"]      =$no;
  header('Location: '.$_SERVER["SCRIPT_NAME"]);
  exit;
}else{
  $name   =isset($_SESSION["name"])?   $_SESSION["name"]   :null;
  $comment=isset($_SESSION["comment"])?$_SESSION["comment"]:null;
  $no     =isset($_SESSION["no"])?     $_SESSION["no"]     :null;
}
$h_name   =htmlspecialchars($name);
$h_comment=htmlspecialchars($comment);
$h_no     =htmlspecialchars($no);
?>
<style>
.required{color:red;}
</style>

<form method="post" >
<input type="text" name="no" value="<?=$h_no;?>" readonly><br>
お名前<span class="required">【必須】</span>
<input type="text" name="name" id="name-field" required="required" value="<?=$h_name;?>"><br>
コメント<span class="required">【必須】</span><br>
<textarea name="comment" cols="30" rows="3" id="comment" required="required">
<?=$h_comment;?>
</textarea>
<input type="submit" name="s" value="投稿">
</form>

<form method="post">
編集対象番号
<input type="number" name="no" value="<?=$h_no;?>" min="1" required>
<input type="submit" name="s" value="編集">
</form>

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/10/04 14:16

    ありがとうございます

    キャンセル

  • 2019/10/04 17:06 編集

    一応最後にむちゃくちゃ古いバージョンでも動くサンプルだけ
    あげておきました
    (テスト用に残してあるPHP4.4で動作確認してあります)
    あとは諦めたみたいなので自力でがんばってくださいとしか・・・

    キャンセル

  • 2019/10/04 17:14

    すみません。ありがとうございます。
    後ほど検証させていただきます。
    折角手を付けたし、また使うことにもなるでしょうからSession関数をちゃんと理解したいと思っています。
    今回の質問で教えていただいた最初のコードから最後のものまで、細かくみていって消化したいと思います。
    本当にありがとうございます。

    キャンセル

check解決した方法

0

折角押していただいたのにyambejpさんには申し訳ないですが、修正していただいたコードが上手く行かず、何が悪いのかも見つける力が足りずに今回は諦め、後ほどまた勉強させていただくことにしました。

また質問のタイトルでsession関数を使い解決したいと言いながら最終的にはsession関数は使いませんでした。
yambejpさんには謝罪の意を表明するとともに感謝いたします。

下記のコードでなんとかやりたいことはできました。
元々のやりたいこととは前の質問の内容です。
掲示板の編集フォームで飛ばした番号の投稿内容を投稿用のフォームに表示させたいが、
header関数に邪魔されて表示させられない問題が発生していました。
そこでSessionを使うとできそうだということに行き当たり今回の質問に至りました。
掲示板で、すでに投稿されたものを編集する機能
掲示板のF5等更新時、二重投稿の防止方法について

最終的には投稿部分の分岐にのみ二重投稿防止のheader関数を用い、
削除部分と編集部分に書いていたheader関数は削除しました。
一番最初にheader関数を書いたときは、送信がポストだったらのifで分岐を作り、その中に投稿部分と削除部分と編集部分を入れていました。
それを投稿の分岐のみに変えたものです。
フォームに投稿内容が表示されたときの改行がおかしかったので置き換え文字も変更しました。
その他、セキュリティ対策的なことはまた後ほどしたいと思います。

<?php
session_start();
$fname = "keijiban.txt"; /*保存するファイル*/
$name = filter_input( INPUT_POST, "name" ); /*投稿者の名前*/
$comment = filter_input( INPUT_POST, "comment" ); /*投稿するコメント*/
$D_no = filter_input( INPUT_POST, "D_no" ); //削除番号の変数定義
$H_no = filter_input( INPUT_POST, "H_no" ); //編集番号の定義
$date = date( "Y-m-d H:i" ); /*投稿日時*/
$search = array( "\r\n", "\r", "\n", "<>" ); //置き換え時の検索文字
$replace = array( "<<改行1>>", "<<改行2>>", "<<改行3>>", "&lt;&gt;" ); //置き換える文字

//投稿番号の定義
if ( is_file( $fname ) ) { /*ファイルの存在確認。*/
  //最後の行にプラス1
  $ret_array = file( $fname );
  $lastline = $ret_array[ count( $ret_array ) - 1 ];
  $num = explode( '<>', $lastline );
  $lastnum = $num[ 0 ] + 1;
} else { /*ファイルが無かった場合変数の定義を1とする*/
  $lastnum = 1;
}

//書き込み内容
$hozon = $lastnum . "<>" . str_replace( $search, $replace, $name ) . "<>" . str_replace( $search, $replace, $comment ) . "<>" . $date . "\n";

//投稿部分
if ( !empty( $name ) && !empty( $comment ) ) { //もし名前とコメントが送信されたら
  $fp = fopen( $fname, "a" ); /*追記モードでファイルを開く*/
  if ( flock( $fp, LOCK_EX ) ) { /*ロックする*/
    fwrite( $fp, $hozon ); /*指定したファイルに追記モードで書き込み*/
  }
  flock( $fp, LOCK_UN );
  fclose( $fp );
  header( 'Location: keijiban.php', true, 303 );
  exit;
} elseif ( !empty( $D_no ) ) { //もしPOSTで送信され 削除番号が空でなかったら
  $ret_array = file( $fname ); //ファイルを配列として読み込む
  $fp = fopen( $fname, "w" );
  if ( flock( $fp, LOCK_EX ) ) {
    foreach ( $ret_array as $value ) { //ループ
      $D_bangou = explode( "<>", $value ); //<>で分割し投稿番号取り出す
      if ( $D_no !== $D_bangou[ 0 ] ) { //もし読み込んだ番号と送信した番号が違ったら
        fwrite( $fp, $value ); //ファイルに書き込む          
      }
    }
  }
  flock( $fp, LOCK_UN ); //ロック開放
  fclose( $fp );
} elseif ( !empty( $H_no ) ) { //もしPOSTで編集用の番号が送信されたら
  $ret_array = file( $fname ); //ファイルを配列として読み込む
  foreach ( $ret_array as $value ) { //ループ
    $H_bangou = explode( "<>", $value ); //<>で分割し投稿番号取り出す
    if ( $H_no == $H_bangou[ 0 ] ) { //送信と書き込みの番号が同じなら
      $h_no = $H_bangou[ 0 ];
      $h_name = $H_bangou[ 1 ];
      $h_comment = $H_bangou[ 2 ];
      $h_date = $H_bangou[ 3 ];
    }
}
}
var_dump( $H_no );
"<br>\n";
var_dump( $ret_array );
"<br>\n";
var_dump( $value );
"<br>\n";
var_dump( $H_bangou[1] );
"<br>\n";
var_dump( $h_name );
"<br>\n";
?>
<!doctype html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>簡易掲示板</title>
<script>
window.addEventListener('DOMContentLoaded', function(){
  document.querySelector('#delbtn').addEventListener('click',function(e){
    if(!confirm('本当に削除しますか?')){
      alert('キャンセルされました'); 
      e.preventDefault();
    }
  });
});
</script>
</head>

<body>
    <?php
    $fname = "keijiban.txt";
$f_search = array( "<<改行1>>", "<<改行2>>", "<<改行3>>", "&lt;&gt;" ); //置き換え時の検索文字
$f_replace = array( "\r\n", "\r", "\n", "<>" ); //置き換える文字
    ?>
<!--投稿フォーム-->
<form method="post" >
  <label for="name-field">お名前<span style="color: red;">【必須】</span><br>
  </label>
  <input type="text" name="name" id="name-field" required="required" value="<?php echo str_replace( $f_search, $f_replace, $h_name );?>">
  <label for="comment">コメント<span style="color: red;">【必須】</span></label>
  <br>
  <textarea name="comment" cols="30" rows="3" id="comment" required="required"><?php
  echo str_replace( $f_search, $f_replace, $h_comment );
  ?>
</textarea>
  <input type="submit" value="投稿">
</form>
<!--削除番号指定用フォーム-->
<form method="post" name="sakujo">
  <label for="D_no" >削除対象番号</label>
  <input type="namber" name="D_no" id="D_no" >
  <input name="btn" type="submit" value="削除" id="delbtn">
</form>

<!--編集番号指定用フォーム-->
<form method="post">
  <label for="H_no" >編集対象番号</label>
  <input type="namber" name="H_no" >
  <input type="submit" value="編集">
</form>
<?php
    $search = array( "<<改行1>>", "<<改行2>>", "<<改行3>>", "&lt;&gt;"); //置き換え時の検索文字
$replace = array( "<br>","<br>","<br>", "<>" ); //置き換える文字
if ( is_file( $fname ) ) { //ファイルの存在確認
  $ret_array = file( $fname ); //配列として読み込む
  if ( empty( $ret_array ) === false ) { //配列があれば
    foreach ( $ret_array as $value ) { //ループ
      $bunkatu = explode( "<>", $value ); //<>で分割する
      foreach ( $bunkatu as $value2 ) { //ループ
        echo str_replace( $search, $replace, $value2 ) . "<br>\n"; //投稿内容を表示(<<改行>>と&lt;&gt;を<br>と<>に置き換える)
      }
    }
  } else { //配列がなければ
    echo "まだ投稿はありません"; //「まだ投稿がありません」と表示させる
  }
} else { //ファイルが存在しなければ
  echo "まだ投稿はありません"; //「まだ投稿がありません」と表示させる
}
?>
</body>
</html>

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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