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

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

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

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

Q&A

解決済

1回答

471閲覧

掲示板で過去の投稿を編集する時、パスワードが違った時にMessageを表示したい

MakotoIshizawa

総合スコア32

PHP

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

0グッド

0クリップ

投稿2019/10/10 06:00

編集2019/10/10 07:01

PHP5.2.4 (バージョンは指定によるもの)

掲示板を作る課題に取り組んでいます。

パスワードを入力し編集と削除を出来るようにするところです。
現在、保存されたパスワードは見えるようにしています(テストしやすくするため)。

削除機能ではパスワードが違った時にMessageを出すことに成功しています。

何故か編集機能ではそれが出来ません。
同じようにしたつもりなんですが。

そこで、変数とかname属性を今一度確認してみました。
スペルミスもチェックしました。

var_dumpしてみると$hpMessageはnullになっています。

何が悪いのかわかりません。

どこがおかしいのか、またそれを見つけるためにするべきことをご教示願います。

php

1<?php 2$fname = "keijiban.txt"; //保存するファイル 3$name = filter_input( INPUT_POST, "name" ); //投稿者の名前 4$comment = filter_input( INPUT_POST, "comment" ); //投稿するコメント 5$D_no = filter_input( INPUT_POST, "D_no" ); //削除番号の変数定義 6$H_no = filter_input( INPUT_POST, "H_no" ); //編集番号の定義 7$hidden = filter_input( INPUT_POST, "hidden" ); //hiddenの送信 8$psw = filter_input( INPUT_POST, "psw" ); //passwordの送信 9$chpsw = filter_input( INPUT_POST, "chpsw" ); //照合するパスワード 10$date = date( "Y-m-d H:i" ); //投稿日時 11$delimiter = "<>"; //区切り文字 12$search = array( "\r\n", "\r", "\n", "<>" ); //置き換え時の検索文字 13$replace = array( "<<改行1>>", "<<改行2>>", "<<改行3>>", "&lt;&gt;" ); //置き換える文字 14//投稿番号の定義 15$rname = str_replace( $search, $replace, $name ); //置き換えられた名前 16$rcomment = str_replace( $search, $replace, $comment ); //置き換えられたコメント 17if ( is_file( $fname ) ) { //ファイルの存在確認。 18 //最後の行にプラス1 19 $ret_array = file( $fname ); 20 $lastline = $ret_array[ count( $ret_array ) - 1 ]; 21 $num = explode( $delimiter, $lastline ); 22 $lastnum = $num[ 0 ] + 1; 23} else { //ファイルが無かった場合変数の定義を1とする 24 $lastnum = 1; 25} 26//書き込み内容 27$hozon = implode( $delimiter, array( $lastnum, $rname, $rcomment, $date, $psw ) ); 28 29//投稿部分 30if ( !empty( $name ) && !empty( $comment ) && !empty( $psw ) && empty( $hidden ) ) { //もし名前とコメントが送信されたら 31 $fp = fopen( $fname, "a" ); //追記モードでファイルを開く 32 if ( flock( $fp, LOCK_EX ) ) { //ロックする 33 fwrite( $fp, $hozon . "\r\n" ); //指定したファイルに追記モードで書き込み 34 } 35 flock( $fp, LOCK_UN ); 36 fclose( $fp ); 37 header( 'Location: tesuto.php', true, 303 ); 38 exit; 39} 40 41//編集番号指定 42elseif ( !empty( $H_no ) ) { //もしPOSTで編集用の番号が送信されたら 43 $ret_array = file( $fname ); //ファイルを配列として読み込む 44 foreach ( $ret_array as $value ) { //ループ 45 $h_bangou = explode( $delimiter, $value ); //<>で分割し投稿番号取り出す 46 if ( $H_no == $h_bangou[ 0 ] ) { //送信と書き込みの番号が同じなら 47 $h_no = $h_bangou[ 0 ]; 48 $h_name = $h_bangou[ 1 ]; 49 $h_comment = $h_bangou[ 2 ]; 50 $hMessage = ""; 51 } 52 if (!in_array($H_no,$h_bangou,true) || empty( $h_bangou )){//投稿番号の中に送信された番号がないか、ファイルの中身が無い時時 53 $sMessage = "該当する投稿がありません"; 54 } 55 } 56 57 } 58 59 60//編集機能 61elseif ( !empty( $name ) && !empty( $comment ) && !empty( $hidden ) ) { //名前とコメントとhiddenが空でなかったら 62 $ret_array = file( $fname ); //ファイルを配列として読み込む 63 $fp = fopen( $fname, "w" ); //書き込みモードでファイルを開く 64 if ( flock( $fp, LOCK_EX ) ) { //排他ロック出来たら 65 foreach ( $ret_array as $value ) { //ループ 66 $h_bangou = explode( $delimiter, trim( $value ) ); //<>で分割し投稿番号取り出す 67 if ( $H_no == $h_bangou[ 0 ] && $chpsw !== $h_bangou[ 4 ] ){ 68 $hpMessage = "パスワードが違います"; 69 } 70 71 if ( $hidden == $h_bangou[ 0 ] && $chpsw == $h_bangou[ 4 ] ) { //送信と書き込みの番号が同じで、且つパスワードが一致すけば 72 $hensyu = implode( $delimiter, array( $hidden, $rname, $rcomment, $date, $chpsw ) ); 73 fwrite( $fp, $hensyu . "\r\n" ); //指定したファイルに追記モードで書き込み 74 } else { 75 fwrite( $fp, $value ); 76 } 77 78 } 79 } 80 flock( $fp, LOCK_UN ); //ロック開放 81 fclose( $fp ); 82 /* header( 'Location: tesuto.php', true, 303 ); 83 exit;*/ 84} 85 86//削除機能 87elseif ( !empty( $D_no ) && !empty( $chpsw ) ) { //削除番号とパスワードがからでなかったら 88 $ret_array = file( $fname ); //ファイルを配列として読み込む 89 $fp = fopen( $fname, "w" ); //wモードで開く 90 if ( flock( $fp, LOCK_EX ) ) { //もし排他ロックかけたら 91 foreach ( $ret_array as $value ) { //ループ 92 $D_bangou = explode( $delimiter, trim( $value ) ); //<>で分割し投稿番号取り出す 93 if ( $D_no == $D_bangou[ 0 ] && $chpsw == $D_bangou[ 4 ] ) { //削除番号とパスワードが一致するものはなにもしない 94 $sMessage = "削除されました"; 95 } else{ //それ以外は 96 fwrite( $fp, $value ); //ファイルに書きこむ 97 } 98 if (!in_array($D_no,$D_bangou,true)|| empty( $D_bangou )){//投稿番号の中に送信された番号がなかった時 99 $sMessage = "該当する投稿がありません"; 100 } 101 if ( $D_no == $D_bangou[ 0 ] && $chpsw !== $D_bangou[ 4 ] ){ 102 $sMessage = "パスワードが違います"; 103 } 104 } 105 } 106 flock( $fp, LOCK_UN ); //ロック開放 107 fclose( $fp ); 108 109} 110var_dump( $fname ); 111var_dump( $ret_array ); 112var_dump( $h_bangou ); 113var_dump( $hpMessage ); 114//var_dump( $D_bangou[ 4 ] ); 115var_dump( $chpsw ); 116?> 117<!doctype html> 118<html lang="ja"> 119<head> 120<meta charset="utf-8"> 121<title>簡易掲示板</title> 122<script> 123window.addEventListener('DOMContentLoaded', function(){ 124document.querySelector('#delbtn').addEventListener('click',function(e){ 125if(!confirm('本当に削除しますか?')){ 126alert('キャンセルされました'); 127e.preventDefault(); 128} 129}); 130}); 131</script> 132<style> 133span { 134 color : red; 135} 136</style> 137</head> 138<body> 139<?php 140$fname = "keijiban.txt"; 141$f_search = array( "<<改行1>>", "<<改行2>>", "<<改行3>>", "&lt;&gt;" ); //置き換え時の検索文字 142$f_replace = array( "\r\n", "\r", "\n", "<>" ); //置き換える文字 143if ( !empty( $H_no ) && $H_no == $h_no ) { 144 echo "<span>" . $h_no . "番</span>の投稿を編集をします<BR>"; 145} 146?> 147<!--投稿フォーム--> 148<form method="post" > 149 <label for="name-field">お名前<span>【必須】</span> </label> 150 <input type="hidden" name="hidden" value="<? echo $h_no; ?>"> 151 <input type="text" name="name" id="name-field" required="required" value="<?php echo str_replace( $f_search, $f_replace, $h_name );?>"> 152 <br> 153 <label for="comment">コメント<span>【必須】</span></label> 154 <textarea name="comment" cols="30" rows="3" id="comment" required="required"><?php echo str_replace( $f_search, $f_replace, $h_comment );?></textarea> 155 <br> 156 <?php 157 if ( !empty( $H_no ) ) { 158 echo "投稿時設定したパスワードを入力して下さい<span>【必須】</span><br><input type='passwoerd' name='chpsw' required='required'>"; 159 echo $hpMessage; 160 } else { 161 echo "<label for='psw' >パスワード設定</label><span>【必須】</span> 162 <input type='password' name='psw' required='required'>"; 163 echo $hpMessage; 164 } 165 ?> 166 <input type="submit" value="<?php if (!empty( $H_no ) ){ echo '編集'; }else{ echo '投稿'; }?>"> 167</form> 168<!--削除番号指定用フォーム--> 169<form method="post" name="sakujo"> 170 <label for="D_no" >削除対象番号</label> 171 <input type="namber" name="D_no" id="D_no" required="required"> 172 <br> 173 <label for="spsw" >削除パスワード</label> 174 <input type="password" name="chpsw" required="required"> 175 <input name="btn" type="submit" value="削除" id="delbtn"> 176 <?php echo $sMessage; ?> 177</form> 178 179<!--編集番号指定用フォーム--> 180<form method="post"> 181 <label for="H_no" >編集対象番号</label> 182 <input type="namber" name="H_no" required="required"> 183 <input type="submit" value="編集"> 184 <?php echo $hMessage; ?> 185</form> 186<?php 187$search = array( "<<改行1>>", "<<改行2>>", "<<改行3>>", "&lt;&gt;" ); //置き換え時の検索文字 188$replace = array( "<br>", "<br>", "<br>", "<>" ); //置き換える文字 189if ( is_file( $fname ) ) { //ファイルの存在確認 190 $ret_array = file( $fname ); //配列として読み込む 191 if ( empty( $ret_array ) === false ) { //配列があれば 192 foreach ( $ret_array as $value ) { //ループ 193 $bunkatu = explode( $delimiter, $value ); //<>で分割する 194 foreach ( $bunkatu as $value2 ) { //ループ 195 echo str_replace( $search, $replace, $value2 ) . "<br>\n"; //投稿内容を表示(<<改行>>と&lt;&gt;を<br>と<>に置き換える) 196 } 197 } 198 } else { //配列がなければ 199 echo "まだ投稿はありません"; //「まだ投稿がありません」と表示させる 200 } 201} else { //ファイルが存在しなければ 202 echo "まだ投稿はありません"; //「まだ投稿がありません」と表示させる 203} 204?> 205</body> 206</html> 207

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

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

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

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

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

m.ts10806

2019/10/10 06:23

>PHP初心者です。 「初心者アイコン」をつけるにとどめてください。
m.ts10806

2019/10/10 06:26

>PHPのバージョンは5.2.4で少し古いですが 10年以上まえのものなので少しどころではありません。指定なのであれば簡潔に下記だけで良いと思います。 PHP5.2.4 (バージョンは指定によるもの) もちろん、古すぎるがゆえ、回答者がすぐに再現環境を用意できなかったり、指定だとしても今さら学習するメリットが皆無である指摘がくることは覚悟が必要です。
MakotoIshizawa

2019/10/10 06:52

ありがとうございます。 10年も前なんですね。 以前にもこのバージョンは捨てるようにとの指摘をいただきました。
guest

回答1

0

自己解決

一応、$hpMessageを表示させることは出来ました。
下記の$H_noをぅ$hiddenに書き換えました。
$H_noは編集番号入力欄の値です。
番号を送信していないからnullだったわけです。
お騒がせしました。

php

1 if (!in_array($H_no,$h_bangou,true) || empty( $h_bangou )){//投稿番号の中に送信された番号がないか、ファイルの中身が無い時時 2 $sMessage = "該当する投稿がありません"; 3 }

投稿2019/10/10 06:18

MakotoIshizawa

総合スコア32

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問