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( "<<改行>>", "<>" ); //置き換え時の検索文字 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"; //投稿内容を表示(<<改行>>と<>を<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( "<<改行>>", "<<改行>>", "<<改行>>", "<>" ); //置き換える文字 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( "<<改行>>", "<>" ); //置き換え時の検索文字 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"; //投稿内容を表示(<<改行>>と<>を<br>と<>に置き換える) 136 } 137 } 138 } else { //配列がなければ 139 echo "まだ投稿はありません"; //「まだ投稿がありません」と表示させる 140 } 141} else { //ファイルが存在しなければ 142 echo "まだ投稿はありません"; //「まだ投稿がありません」と表示させる 143} 144?> 145</body> 146</html> 147
回答2件
あなたの回答
tips
プレビュー