🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

1552閲覧

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

MakotoIshizawa

総合スコア32

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2019/10/02 10:09

編集2019/10/03 04:26

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

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

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

php

1<?php 2session_start(); 3//変数の定義 4$filename = "keijiban.txt"; /*保存するファイル*/ 5$hensyuNO=filter_input(INPUT_POST,"hensyuNO"); 6 7if (!is_null( $hensyuNO ) ) { //もしPOSTで編集用の番号が送信されたら 8 $ret_array = file( $filename ); //ファイルを配列として読み込む 9 foreach ( $ret_array as $value ) { //ループ 10 $bangou = explode( "<>", $value ); //<>で分割し投稿番号取り出す 11 if ( $hensyuNO == $bangou[ 0 ] ) { //送信と書き込みの番号が同じなら 12 $_SESSION["Hno"] = $bangou[ 0 ]; 13 $_SESSION["Hname"] = $bangou[ 1 ]; 14 $_SESSION["Hcomment"] = $bangou[ 2 ]; 15 $_SESSION["Hdate"] = $bangou[ 3 ]; 16 } 17 } 18 header('Location: hensyuNO.php'); 19 exit; 20}else{ 21 $hensyuNO=isset($_SESSION["hensyuNO"])?$_SESSION["hensyuNO"]:null; 22} 23var_dump($hensyuNO); 24var_dump($ret_array); 25var_dump($bangou); 26var_dump($_SESSION["Hname"]); 27?> 28<!doctype html> 29<html lang="ja"> 30<head> 31<meta charset="utf-8"> 32<title>テスト</title> 33</head> 34 35<body> 36<!--投稿フォーム--> 37<form method="post" > 38 <label for="name-field">お名前<span style="color: red;">【必須】</span><br> 39 </label> 40 <input type="text" name="name" id="name-field" required="required" value="<?php echo $_SESSION["Hname"];?>"> 41 <label for="comment">コメント<span style="color: red;">【必須】</span></label> 42 <br> 43 <textarea name="comment" cols="30" rows="3" id="comment" required="required"><?php 44 echo $_SESSION["Hcomment"]; 45 ?> 46</textarea> 47 <input type="submit" value="投稿"> 48</form> 49<!--編集番号指定用フォーム--> 50<form method="post"> 51 <label for="hensyuNO" >編集対象番号</label> 52 <input type="text" name="hensyuNO" value="123"> 53 <input type="submit" value="編集"> 54</form> 55<?php 56$filename = "keijiban.txt"; 57$search = array( "<<改行>>", "&lt;&gt;" ); //置き換え時の検索文字 58$replace = array( "<br>", "<>" ); //置き換える文字 59 60if ( is_file( $filename ) ) { //ファイルの存在確認 61 $ret_array = file( $filename ); //配列として読み込む 62 if ( empty( $ret_array ) === false ) { //配列があれば 63 foreach ( $ret_array as $value ) { //ループ 64 $bunkatu = explode( "<>", $value ); //<>で分割する 65 foreach ( $bunkatu as $value2 ) { //ループ 66 echo str_replace( $search, $replace, $value2 ) . "<br>\n"; //投稿内容を表示(<<改行>>と&lt;&gt;を<br>と<>に置き換える) 67 } 68 } 69 } else { //配列がなければ 70 echo "まだ投稿はありません"; //「まだ投稿がありません」と表示させる 71 } 72} else { //ファイルが存在しなければ 73 echo "まだ投稿はありません"; //「まだ投稿がありません」と表示させる 74} 75?> 76</body> 77</html> 78 79

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

php

1<?php 2session_start(); 3//変数の定義 4$filename = "keijiban.txt"; /*保存するファイル*/ 5$name = filter_input( INPUT_POST, "name" ); /*投稿者の名前*/ 6$comment = filter_input( INPUT_POST, "comment" ); /*投稿するコメント*/ 7$date = date( "Y-m-d H:i" ); /*投稿日時*/ 8$search = array( "\r\n", "\r", "\n", "<>" ); //置き換え時の検索文字 9$replace = array( "<<改行>>", "<<改行>>", "<<改行>>", "&lt;&gt;" ); //置き換える文字 10$deleteNO = filter_input( INPUT_POST, "deleteNO" ); //削除番号の変数定義 11$hensyuNO = filter_input( INPUT_POST, "hesyuNO" ); //編集番号の定義 12//投稿番号の定義 13if ( is_file( $filename ) ) { /*ファイルの存在確認。*/ 14 //最後の行にプラス1 15 $ret_array = file( $filename ); 16 $lastline = $ret_array[ count( $ret_array ) - 1 ]; 17 $num = explode( '<>', $lastline ); 18 $lastnum = $num[ 0 ] + 1; 19} else { /*ファイルが無かった場合変数の定義を1とする*/ 20 $lastnum = 1; 21} 22 23//書き込み内容 24$hozon = $lastnum . "<>" . str_replace( $search, $replace, $name ) . "<>" . str_replace( $search, $replace, $comment ) . "<>" . $date . "\n"; 25 26//投稿部分 27/*もしポストで送信されたら以下の処理を行いGET送信でリダイレクトする(更新時の二重書き込み防止)*/ 28if ( !empty( $name ) && !empty( $comment ) ) { //もしPOSTで送信され名前とコメントがからでなかったら 29 30 /*もし名前とコメントが送信されたら*/ 31 $fp = fopen( $filename, "a" ); /*追記モードでファイルを開く*/ 32 if ( flock( $fp, LOCK_EX ) ) { /*ロックする*/ 33 fwrite( $fp, $hozon ); /*指定したファイルに追記モードで書き込み*/ 34 } 35 flock( $fp, LOCK_UN ); 36 fclose( $fp ); 37 header( 'Location: keijiban.php', true, 303 ); 38 exit; 39} elseif ( !empty( $deleteNO ) ) { //もしPOSTで送信され 削除番号が空でなかったら 40 $ret_array = file( $filename ); //ファイルを配列として読み込む 41 $fp = fopen( $filename, "w" ); 42 if ( flock( $fp, LOCK_EX ) ) { 43 foreach ( $ret_array as $value ) { //ループ 44 $bangou = explode( "<>", $value ); //<>で分割し投稿番号取り出す 45 if ( $deleteNO !== $bangou[ 0 ] ) { //もし読み込んだ番号と送信した番号が違ったら 46 fwrite( $fp, $value ); //ファイルに書き込む 47 } 48 } 49 } 50 flock( $fp, LOCK_UN ); //ロック開放 51 fclose( $fp ); 52 header( 'Location: keijiban.php', true, 303 ); 53 exit; 54} elseif ( !is_null( $hensyuNO ) ) { //もしPOSTで編集用の番号が送信されたら 55 $ret_array = file( $filename ); //ファイルを配列として読み込む 56 foreach ( $ret_array as $value ) { //ループ 57 $bangou = explode( "<>", $value ); //<>で分割し投稿番号取り出す 58 if ( $hensyuNO == $bangou[ 0 ] ) { //送信と書き込みの番号が同じなら 59 $_SESSION[ "Hno" ] = $bangou[ 0 ]; 60 $_SESSION[ "Hname" ] = $bangou[ 1 ]; 61 $_SESSION[ "Hcomment" ] = $bangou[ 2 ]; 62 $_SESSION[ "Hdate" ] = $bangou[ 3 ]; 63 } 64 } 65 66 header( 'Location: keijiban.php', true, 303 ); 67 exit; 68} else { 69 $hensyuNO = isset( $_SESSION[ "hensyuNO" ] ) ? $_SESSION[ "hensyuNO" ] : null; 70} 71var_dump( $hensyuNO ); 72"<br>\n"; 73var_dump( $ret_array ); 74"<br>\n"; 75var_dump( $bangou ); 76"<br>\n"; 77var_dump( $_SESSION[ "Hname" ] ); 78"<br>\n"; 79?> 80<!doctype html> 81<html lang="ja"> 82<head> 83<meta charset="utf-8"> 84<title>簡易掲示板</title> 85<script> 86window.addEventListener('DOMContentLoaded', function(){ 87 document.querySelector('#delbtn').addEventListener('click',function(e){ 88 if(!confirm('本当に削除しますか?')){ 89 alert('キャンセルされました'); 90 e.preventDefault(); 91 } 92 }); 93}); 94</script> 95</head> 96 97<body> 98<!--投稿フォーム--> 99<form method="post" > 100 <label for="name-field">お名前<span style="color: red;">【必須】</span><br> 101 </label> 102 <input type="text" name="name" id="name-field" required="required" value="<?php echo $_SESSION["Hname"];?>"> 103 <label for="comment">コメント<span style="color: red;">【必須】</span></label> 104 <br> 105 <textarea name="comment" cols="30" rows="3" id="comment" required="required"><?php 106 echo $_SESSION[ "Hcomment" ]; 107 ?> 108</textarea> 109 <input type="submit" value="投稿"> 110</form> 111<!--削除番号指定用フォーム--> 112<form method="post" name="sakujo"> 113 <label for="deleteNO" >削除対象番号</label> 114 <input type="text" name="deleteNO" id="deleteNO" > 115 <input name="btn" type="submit" value="削除" id="delbtn"> 116</form> 117 118<!--編集番号指定用フォーム--> 119<form method="post"> 120 <label for="hensyuNO" >編集対象番号</label> 121 <input type="text" name="hensyuNO" > 122 <input type="submit" value="編集"> 123</form> 124<?php 125$filename = "keijiban.txt"; 126$search = array( "<<改行>>", "&lt;&gt;" ); //置き換え時の検索文字 127$replace = array( "<br>", "<>" ); //置き換える文字 128 129if ( is_file( $filename ) ) { //ファイルの存在確認 130 $ret_array = file( $filename ); //配列として読み込む 131 if ( empty( $ret_array ) === false ) { //配列があれば 132 foreach ( $ret_array as $value ) { //ループ 133 $bunkatu = explode( "<>", $value ); //<>で分割する 134 foreach ( $bunkatu as $value2 ) { //ループ 135 echo str_replace( $search, $replace, $value2 ) . "<br>\n"; //投稿内容を表示(<<改行>>と&lt;&gt;を<br>と<>に置き換える) 136 } 137 } 138 } else { //配列がなければ 139 echo "まだ投稿はありません"; //「まだ投稿がありません」と表示させる 140 } 141} else { //ファイルが存在しなければ 142 echo "まだ投稿はありません"; //「まだ投稿がありません」と表示させる 143} 144?> 145</body> 146</html> 147

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2019/10/02 10:42

投稿と編集の挙動の違いがわからない 編集は番号を指定してデータを読んでくる機能? 番号が入っている状態で投稿すると上書きされる? 番号無しで投稿すると新規投稿になって、そのIDはIDの最大値にする。
MakotoIshizawa

2019/10/02 10:59

質問文にも少し追加しましたが、 編集のフォームで飛ばした番号の投稿を抜き出して投稿用フォームに表示して、 そこで編集された内容を元の投稿と差し替えるようにします。 投稿と編集の区別はhiddenを使ってということです。 編集用のフォームから飛ばすのかなと思っています。
yambejp

2019/10/02 11:09

新規投稿は考えなくてよいですね?
MakotoIshizawa

2019/10/02 11:40

新規投稿は現時点で出来ます。 最終的には新規投稿も編集もしたいんですが、 今の段階では編集機能での、投稿フォームへの表示をクリアしたいです。
MakotoIshizawa

2019/10/03 10:06

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

2019/10/03 10:11

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

2019/10/04 05:02

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

回答2

0

  • keijiban.php

PHP

1<?php 2session_start(); 3$s =filter_input(INPUT_POST,"s"); 4$name =filter_input(INPUT_POST,"name"); 5$comment=filter_input(INPUT_POST,"comment"); 6$no =filter_input(INPUT_POST,"no"); 7$fname ="keijiban.txt"; 8if(!file_exists($fname)) die("no file"); // 追記 9if($s==="編集"){ 10 $fp=fopen($fname,"r"); 11 while(($row=fgetcsv($fp,1024))!==false){ 12 $rows[]=$row; 13 } 14 fclose($fp); 15 $rec=array_filter($rows,function($x) use($no){ 16 return $x[0]===$no; 17 }); 18 if(count($rec)>0){ 19 /* 修正 20 $rec=array_values($rec)[0]; 21 */ 22 $rec=array_shift($rec); 23 $_SESSION["name"] =$rec[1]; 24 $_SESSION["comment"] =$rec[2]; 25 }else{ 26 $_SESSION["name"] =""; 27 $_SESSION["comment"] =""; 28 } 29} 30if($s==="投稿"){ 31 $fp=fopen($fname,"r"); 32 while(($row=fgetcsv($fp,1024))!==false){ 33 $rows[]=$row; 34 } 35 fclose($fp); 36 /* 修正 37 $key=array_keys(array_filter($rows,function($x) use($no){ 38 return $x[0]===$no; 39 }))[0]; 40 */ 41 $key=array_shift(array_keys(array_filter($rows,function($x) use($no){ 42 return $x[0]===$no; 43 }))); 44 45 if($key>=0){ 46 $row=&$rows[$key]; 47 }else{ 48 $row=&$rows[]; 49 } 50 $row[0]=$no; 51 $row[1]=$name; 52 $row[2]=$comment; 53 unset($row); 54 $fp=fopen($fname,"w"); 55 foreach ($rows as $row) { 56 fputcsv($fp, $row); 57 } 58 fclose($fp); 59} 60 61 62if (!is_null($name) and !is_null($comment) ) { 63 $_SESSION["name"] =$name; 64 $_SESSION["comment"] =$comment; 65 header('Location: '.$_SERVER["SCRIPT_NAME"]); 66 exit; 67}elseif (!is_null($no)) { 68 $_SESSION["no"] =$no; 69 header('Location: '.$_SERVER["SCRIPT_NAME"]); 70 exit; 71}else{ 72 $name =isset($_SESSION["name"])? $_SESSION["name"] :null; 73 $comment=isset($_SESSION["comment"])?$_SESSION["comment"]:null; 74 $no =isset($_SESSION["no"])? $_SESSION["no"] :null; 75} 76$h_name =htmlspecialchars($name); 77$h_comment=htmlspecialchars($comment); 78$h_no =htmlspecialchars($no); 79?> 80<style> 81.required{color:red;} 82</style> 83 84<form method="post" > 85<input type="text" name="no" value="<?=$h_no;?>" readonly><br> 86お名前<span class="required">【必須】</span> 87<input type="text" name="name" id="name-field" required="required" value="<?=$h_name;?>"><br> 88コメント<span class="required">【必須】</span><br> 89<textarea name="comment" cols="30" rows="3" id="comment" required="required"> 90<?=$h_comment;?> 91</textarea> 92<input type="submit" name="s" value="投稿"> 93</form> 94 95<form method="post"> 96編集対象番号 97<input type="number" name="no" value="<?=$h_no;?>" min="1" required> 98<input type="submit" name="s" value="編集"> 99</form> 100
  • keijiban.txt

txt

11,hoge,あああああ 22,fuga,いいいいい 33,piyo,うううう

下位互換(とりあえず)

PHP

1<?php 2session_start(); 3$s =filter_input(INPUT_POST,"s"); 4$name =filter_input(INPUT_POST,"name"); 5$comment=filter_input(INPUT_POST,"comment"); 6$no =filter_input(INPUT_POST,"no"); 7$fname ="keijiban.txt"; 8if(!file_exists($fname)) die("no file"); // 追記 9if($s==="編集"){ 10 $fp=fopen($fname,"r"); 11 while(($row=fgetcsv($fp,1024))!==false){ 12 $rows[]=$row; 13 } 14 fclose($fp); 15 foreach($rows as $val){ 16 if($val[0]===$no) $rec[]=$val; 17 } 18 //$rec=array_filter($rows,function($x) use($no){ 19 // return $x[0]===$no; 20 //}); 21 if(count($rec)>0){ 22 /* 修正 23 $rec=array_values($rec)[0]; 24 */ 25 $rec=array_shift($rec); 26 $_SESSION["name"] =$rec[1]; 27 $_SESSION["comment"] =$rec[2]; 28 }else{ 29 $_SESSION["name"] =""; 30 $_SESSION["comment"] =""; 31 } 32} 33if($s==="投稿"){ 34 $fp=fopen($fname,"r"); 35 while(($row=fgetcsv($fp,1024))!==false){ 36 $rows[]=$row; 37 } 38 fclose($fp); 39 /* 修正 40 $key=array_keys(array_filter($rows,function($x) use($no){ 41 return $x[0]===$no; 42 }))[0]; 43 */ 44 foreach($rows as $index=>$val){ 45 if($val[0]===$no){ 46 $key=$index; 47 break; 48 } 49 } 50 //$key=array_shift(array_keys(array_filter($rows,function($x) use($no){ 51 // return $x[0]===$no; 52 //}))); 53 54 if($key>=0){ 55 $row=&$rows[$key]; 56 }else{ 57 $row=&$rows[]; 58 } 59 $row[0]=$no; 60 $row[1]=$name; 61 $row[2]=$comment; 62 unset($row); 63 $fp=fopen($fname,"w"); 64 foreach ($rows as $row) { 65 fputcsv($fp, $row); 66 } 67 fclose($fp); 68} 69 70 71if (!is_null($name) and !is_null($comment) ) { 72 $_SESSION["name"] =$name; 73 $_SESSION["comment"] =$comment; 74 header('Location: '.$_SERVER["SCRIPT_NAME"]); 75 exit; 76}elseif (!is_null($no)) { 77 $_SESSION["no"] =$no; 78 header('Location: '.$_SERVER["SCRIPT_NAME"]); 79 exit; 80}else{ 81 $name =isset($_SESSION["name"])? $_SESSION["name"] :null; 82 $comment=isset($_SESSION["comment"])?$_SESSION["comment"]:null; 83 $no =isset($_SESSION["no"])? $_SESSION["no"] :null; 84} 85$h_name =htmlspecialchars($name); 86$h_comment=htmlspecialchars($comment); 87$h_no =htmlspecialchars($no); 88?> 89<style> 90.required{color:red;} 91</style> 92 93<form method="post" > 94<input type="text" name="no" value="<?=$h_no;?>" readonly><br> 95お名前<span class="required">【必須】</span> 96<input type="text" name="name" id="name-field" required="required" value="<?=$h_name;?>"><br> 97コメント<span class="required">【必須】</span><br> 98<textarea name="comment" cols="30" rows="3" id="comment" required="required"> 99<?=$h_comment;?> 100</textarea> 101<input type="submit" name="s" value="投稿"> 102</form> 103 104<form method="post"> 105編集対象番号 106<input type="number" name="no" value="<?=$h_no;?>" min="1" required> 107<input type="submit" name="s" value="編集"> 108</form> 109

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

PHP

1<?php 2header('content-type:text/html;charset=UTF8'); 3session_start(); 4function get_post($val){ 5 return isset($_POST[$val])?$_POST[$val]:null; 6} 7$s =get_post("s"); 8$name =get_post("name"); 9$comment=get_post("comment"); 10$no =get_post("no"); 11$fname ="keijiban.txt"; 12if(!file_exists($fname)) die("no file"); 13if($s==="編集"){ 14 $fp=fopen($fname,"r"); 15 while(($row=fgetcsv($fp,1024))!==false){ 16 $rows[]=$row; 17 } 18 fclose($fp); 19 foreach($rows as $val){ 20 if($val[0]===$no) $rec[]=$val; 21 } 22 if(count($rec)>0){ 23 $rec=array_shift($rec); 24 $_SESSION["name"] =$rec[1]; 25 $_SESSION["comment"] =$rec[2]; 26 }else{ 27 $_SESSION["name"] =""; 28 $_SESSION["comment"] =""; 29 } 30} 31if($s==="投稿"){ 32 $fp=fopen($fname,"r"); 33 while(($row=fgetcsv($fp,1024))!==false){ 34 $rows[]=$row; 35 } 36 fclose($fp); 37 foreach($rows as $index=>$val){ 38 if($val[0]===$no){ 39 $key=$index; 40 break; 41 } 42 } 43 44 if($key>=0){ 45 $row=&$rows[$key]; 46 }else{ 47 $row=&$rows[]; 48 } 49 $row[0]=$no; 50 $row[1]=$name; 51 $row[2]=$comment; 52 unset($row); 53 $fp=fopen($fname,"w"); 54 foreach ($rows as $row) { 55 foreach ($row as $key=>$val) { 56 if(!is_numeric($val)){ 57 $val=str_replace("\"","\"\"",$val); 58 $val="\"".$val."\""; 59 $row[$key]=$val; 60 } 61 } 62 fwrite($fp,implode(",",$row)."\r\n"); 63 } 64 fclose($fp); 65} 66 67 68if (!is_null($name) and !is_null($comment) ) { 69 $_SESSION["name"] =$name; 70 $_SESSION["comment"] =$comment; 71 header('Location: '.$_SERVER["SCRIPT_NAME"]); 72 exit; 73}elseif (!is_null($no)) { 74 $_SESSION["no"] =$no; 75 header('Location: '.$_SERVER["SCRIPT_NAME"]); 76 exit; 77}else{ 78 $name =isset($_SESSION["name"])? $_SESSION["name"] :null; 79 $comment=isset($_SESSION["comment"])?$_SESSION["comment"]:null; 80 $no =isset($_SESSION["no"])? $_SESSION["no"] :null; 81} 82$h_name =htmlspecialchars($name); 83$h_comment=htmlspecialchars($comment); 84$h_no =htmlspecialchars($no); 85?> 86<style> 87.required{color:red;} 88</style> 89 90<form method="post" > 91<input type="text" name="no" value="<?=$h_no;?>" readonly><br> 92お名前<span class="required">【必須】</span> 93<input type="text" name="name" id="name-field" required="required" value="<?=$h_name;?>"><br> 94コメント<span class="required">【必須】</span><br> 95<textarea name="comment" cols="30" rows="3" id="comment" required="required"> 96<?=$h_comment;?> 97</textarea> 98<input type="submit" name="s" value="投稿"> 99</form> 100 101<form method="post"> 102編集対象番号 103<input type="number" name="no" value="<?=$h_no;?>" min="1" required> 104<input type="submit" name="s" value="編集"> 105</form>

投稿2019/10/02 11:46

編集2019/10/04 08:05
yambejp

総合スコア116661

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2019/10/02 11:46

とりあえず書いてみました。 ロックとかしてないのでグダグダですが 流れはわかると思います
MakotoIshizawa

2019/10/02 11:51

ありがとうございます。 今日は時間がないので明日また挑戦してみます。 使ったことない関数とかでてきて勉強になります。 なんとか頑張って消化していきます。
MakotoIshizawa

2019/10/03 04:29

syntax error, unexpected T_FUNCTION とエラーが出てしまいました。 バージョンのせいでしょうか。 PHPのバージョンを追記しておきました。 5.2.4です
yambejp

2019/10/03 05:40

関数の仕様が変わっているのかもしれません ちょっと5.2系は古いかなーと、一応5.6系を前提に書いてあります どうしてもバージョンが上げられない場合はそれなりの 書き方で工夫してもらいしかありません。 (具体的にどの部分か指示があればヒントくらいなら・・・)
MakotoIshizawa

2019/10/03 06:41

すみません、色々検索してみます。 お忙しい中ありがとうございます。
yambejp

2019/10/03 10:23

一番怪しいとこだけ2箇所修正しときました
MakotoIshizawa

2019/10/04 04:34

せっかく修正していただいて申し訳ないんですが、 $rec=array_filter($rows,function($x) use($no){ の行がエラーでした。 なので恐らく $key=array_shift(array_keys(array_filter($rows,function($x) use($no){ ここもですね。 これをなんとか古い形でと思ったんですが自分では辿り着けなかったです。 もう一つ思ったんですが、 最初に教えていただいたコードを試していたとき、元のファイルとテスト用ファイルが同じフォルダーに入っていて、inputのname属性もおなじなのでsession関数の影響が出たんでしょうか? テスト用から送信した内容が元のファイルの投稿用のフォームにも表示されてしまい、 元のファイルから送信した内容は表示されませんでした。
yambejp

2019/10/04 04:44

アドバイスは今から考えますが、5.2を使い続けるのはマストなんですね? 古いバージョンを使い続けるにはそれなりの知識と覚悟が必要です
yambejp

2019/10/04 05:12 編集

下位互換バージョンをとりあえずあげました。 (修正箇所はコメントアウトしてありますが、いらなければ コメントを削除してください) ちなみに「それなりの知識と覚悟」って 「他人に頼らず死ぬ気で勉強してください」ってことですからね
yambejp

2019/10/04 08:07 編集

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

2019/10/04 08:14

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

0

自己解決

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

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

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

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

php

1<?php 2session_start(); 3$fname = "keijiban.txt"; /*保存するファイル*/ 4$name = filter_input( INPUT_POST, "name" ); /*投稿者の名前*/ 5$comment = filter_input( INPUT_POST, "comment" ); /*投稿するコメント*/ 6$D_no = filter_input( INPUT_POST, "D_no" ); //削除番号の変数定義 7$H_no = filter_input( INPUT_POST, "H_no" ); //編集番号の定義 8$date = date( "Y-m-d H:i" ); /*投稿日時*/ 9$search = array( "\r\n", "\r", "\n", "<>" ); //置き換え時の検索文字 10$replace = array( "<<改行1>>", "<<改行2>>", "<<改行3>>", "&lt;&gt;" ); //置き換える文字 11 12//投稿番号の定義 13if ( is_file( $fname ) ) { /*ファイルの存在確認。*/ 14 //最後の行にプラス1 15 $ret_array = file( $fname ); 16 $lastline = $ret_array[ count( $ret_array ) - 1 ]; 17 $num = explode( '<>', $lastline ); 18 $lastnum = $num[ 0 ] + 1; 19} else { /*ファイルが無かった場合変数の定義を1とする*/ 20 $lastnum = 1; 21} 22 23//書き込み内容 24$hozon = $lastnum . "<>" . str_replace( $search, $replace, $name ) . "<>" . str_replace( $search, $replace, $comment ) . "<>" . $date . "\n"; 25 26//投稿部分 27if ( !empty( $name ) && !empty( $comment ) ) { //もし名前とコメントが送信されたら 28 $fp = fopen( $fname, "a" ); /*追記モードでファイルを開く*/ 29 if ( flock( $fp, LOCK_EX ) ) { /*ロックする*/ 30 fwrite( $fp, $hozon ); /*指定したファイルに追記モードで書き込み*/ 31 } 32 flock( $fp, LOCK_UN ); 33 fclose( $fp ); 34 header( 'Location: keijiban.php', true, 303 ); 35 exit; 36} elseif ( !empty( $D_no ) ) { //もしPOSTで送信され 削除番号が空でなかったら 37 $ret_array = file( $fname ); //ファイルを配列として読み込む 38 $fp = fopen( $fname, "w" ); 39 if ( flock( $fp, LOCK_EX ) ) { 40 foreach ( $ret_array as $value ) { //ループ 41 $D_bangou = explode( "<>", $value ); //<>で分割し投稿番号取り出す 42 if ( $D_no !== $D_bangou[ 0 ] ) { //もし読み込んだ番号と送信した番号が違ったら 43 fwrite( $fp, $value ); //ファイルに書き込む 44 } 45 } 46 } 47 flock( $fp, LOCK_UN ); //ロック開放 48 fclose( $fp ); 49} elseif ( !empty( $H_no ) ) { //もしPOSTで編集用の番号が送信されたら 50 $ret_array = file( $fname ); //ファイルを配列として読み込む 51 foreach ( $ret_array as $value ) { //ループ 52 $H_bangou = explode( "<>", $value ); //<>で分割し投稿番号取り出す 53 if ( $H_no == $H_bangou[ 0 ] ) { //送信と書き込みの番号が同じなら 54 $h_no = $H_bangou[ 0 ]; 55 $h_name = $H_bangou[ 1 ]; 56 $h_comment = $H_bangou[ 2 ]; 57 $h_date = $H_bangou[ 3 ]; 58 } 59} 60} 61var_dump( $H_no ); 62"<br>\n"; 63var_dump( $ret_array ); 64"<br>\n"; 65var_dump( $value ); 66"<br>\n"; 67var_dump( $H_bangou[1] ); 68"<br>\n"; 69var_dump( $h_name ); 70"<br>\n"; 71?> 72<!doctype html> 73<html lang="ja"> 74<head> 75<meta charset="utf-8"> 76<title>簡易掲示板</title> 77<script> 78window.addEventListener('DOMContentLoaded', function(){ 79 document.querySelector('#delbtn').addEventListener('click',function(e){ 80 if(!confirm('本当に削除しますか?')){ 81 alert('キャンセルされました'); 82 e.preventDefault(); 83 } 84 }); 85}); 86</script> 87</head> 88 89<body> 90 <?php 91 $fname = "keijiban.txt"; 92$f_search = array( "<<改行1>>", "<<改行2>>", "<<改行3>>", "&lt;&gt;" ); //置き換え時の検索文字 93$f_replace = array( "\r\n", "\r", "\n", "<>" ); //置き換える文字 94 ?> 95<!--投稿フォーム--> 96<form method="post" > 97 <label for="name-field">お名前<span style="color: red;">【必須】</span><br> 98 </label> 99 <input type="text" name="name" id="name-field" required="required" value="<?php echo str_replace( $f_search, $f_replace, $h_name );?>"> 100 <label for="comment">コメント<span style="color: red;">【必須】</span></label> 101 <br> 102 <textarea name="comment" cols="30" rows="3" id="comment" required="required"><?php 103 echo str_replace( $f_search, $f_replace, $h_comment ); 104 ?> 105</textarea> 106 <input type="submit" value="投稿"> 107</form> 108<!--削除番号指定用フォーム--> 109<form method="post" name="sakujo"> 110 <label for="D_no" >削除対象番号</label> 111 <input type="namber" name="D_no" id="D_no" > 112 <input name="btn" type="submit" value="削除" id="delbtn"> 113</form> 114 115<!--編集番号指定用フォーム--> 116<form method="post"> 117 <label for="H_no" >編集対象番号</label> 118 <input type="namber" name="H_no" > 119 <input type="submit" value="編集"> 120</form> 121<?php 122 $search = array( "<<改行1>>", "<<改行2>>", "<<改行3>>", "&lt;&gt;"); //置き換え時の検索文字 123$replace = array( "<br>","<br>","<br>", "<>" ); //置き換える文字 124if ( is_file( $fname ) ) { //ファイルの存在確認 125 $ret_array = file( $fname ); //配列として読み込む 126 if ( empty( $ret_array ) === false ) { //配列があれば 127 foreach ( $ret_array as $value ) { //ループ 128 $bunkatu = explode( "<>", $value ); //<>で分割する 129 foreach ( $bunkatu as $value2 ) { //ループ 130 echo str_replace( $search, $replace, $value2 ) . "<br>\n"; //投稿内容を表示(<<改行>>と&lt;&gt;を<br>と<>に置き換える) 131 } 132 } 133 } else { //配列がなければ 134 echo "まだ投稿はありません"; //「まだ投稿がありません」と表示させる 135 } 136} else { //ファイルが存在しなければ 137 echo "まだ投稿はありません"; //「まだ投稿がありません」と表示させる 138} 139?> 140</body> 141</html> 142

投稿2019/10/04 07:35

MakotoIshizawa

総合スコア32

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問