質問: ### 前提・実現したいこと phpで一言掲示板を作成しています。 以下が要件です 1,利用者が名前とコメントを入力し、発言できる。 2,利用者の過去の発言内容をテキストファイルで管理する。 全ての利用者の過去の発言内容を一覧で表示する。一覧には「名前」「コメント」「発言日時」の3つを1行ずつ表示する。 3,利用者の名前は最大20文字以内まで発言できる。もし20文字より多くの文字を入力して発言した場合はエラーメッセージを表示し、発言できないようにする。 4,利用者のコメントは最大100文字以内まで発言できる。もし100文字より多くの文字を入力して発言した場合はエラーメッセージを表示し、発言できないようにする。 5,利用者の名前とコメントは必ず文字が入力される。もし名前あるいはコメントが未入力で発言した場合はエラーメッセージを表示し、発言できないようにする。 ### 発生している問題・エラーメッセージ 3と4の要件に関して エラーメッセージは表示出来るのですが 「発言できないようにする」方法が分かりません。 現状では、エラーメッセージと、文字数制限を無視した発言が、同時に表示されてしまいます。 例: ・名前を入力してください(エラーメッセージ) ・ :こんにちは! -2017-05-22 23:24:34 (本来は、田中太郎:こんにちは!-2017-05-22 23:24:34 というような形で表示される) ### 該当のソースコード ``` ひとこと掲示板 ひとこと掲示板 $name_max){?> $comment_max){?> 名前: ひとこと: ``` ### 試したこと ・上記のコード(11行目,21行目辺り)でも試してあるように、ファイルへ書き込みを行う際に 指定の文字数以内もしくは、フォームへ入力した文字が0文字でない場合 のみ fwrite()の処理を行えるように、if文で条件分けした。 ・同様に、指定の文字数以内もしくは、フォームへ入力した文字が0文字でない場合のみ、fgets()の処理を行えるように、while文をif文で条件分けした ・同様に、指定の条件の場合のみ、配列dataに$tmp(読み込まれたファイル)が代入されるように、$data[]をif文で条件分けした。 以上3つ共試した結果、どの方法でも「発生している問題・エラーメッセージ」に記載したような結果になってしまいました。 大変お手数かと思いますが、ご教授お願い致します。
回答: 上記の回答に沿って、修正した後 1名前OK-コメント空白 2名前OK-コメント100文字オーバー の2つの条件で送信ボタンを押した場合に、エラーメッセージと共に 名前だけが出力されてしまうという問題が発生してしまいました。 例: ・ひとことは100文字以内で入力してください。(エラーメッセージ) ・田中太郎: ※(この状態で、次に、名前・ひとこと共に正常な文字数で入力した場合 ・田中太郎:田中太郎: こんにちは!-2017-05-22 23:24:34 と投稿されてしまう) そこで、 ``` if ($_SERVER['REQUEST_METHOD'] === 'POST'){ $name = $_POST['name']; $comment = $_POST['comment']; if (($fp_name = fopen($filename , 'a')) !== FALSE){ if (((mb_strlen($name) <= $name_max) && (mb_strlen($name) !== 0)) && ((mb_strlen($comment) <= $comment_max) && (mb_strlen($comment) !== 0))){ if (fwrite($fp_name , "$name:") === FALSE){ print 'ファイル書き込み失敗' . $filename; } } fclose($fp_name); } $text = "$comment $log\n"; if (($fp_comment = fopen($filename , 'a')) !== FALSE){ if (((mb_strlen($comment) <= $comment_max) && (mb_strlen($comment) !== 0)) && ((mb_strlen($name) <= $name_max) && (mb_strlen($name) !== 0))){ if (fwrite($fp_comment , " $text") === FALSE){ print 'ファイル書き込み失敗' . $filename; } } fclose($fp_comment); } } ``` というコードで試したところ、問題なく修正されました。 修正前のコードでは、 $comment = $_POST['comment']; を $fp_nameへ書き込みを行うコードの後($fp_commentの直前)に 書いていたため、 $fp_nameへ書き込みを行う際の条件分岐の時点で、$commentに、あらかじめ宣言しておいた 「0」が代入されていて、文字数が「1」になり このコードでいう5行目の、条件式が通ってしまう 状態になっていたところが問題でした。 結論としましては、 $comment = $_POST['comment']; を $name = $_POST['name'];と同じ位置に移動させてあげることによって 問題が解決できました。 ・プログラムは上から順番に処理をする ・変数は、使いたいところより前(上)で宣言、代入する といった基本的なところが抜けていたので、以後気をつけたいと思います。