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

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

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

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

Q&A

解決済

2回答

3341閲覧

PHP:掲示板で未入力の際、メソッドに書いてあるエラーメッセージを表示したい

sumikko6210

総合スコア138

PHP

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

0グッド

0クリップ

投稿2016/12/15 04:56

編集2016/12/15 05:00

現在PHPで掲示板を作成しています。
未入力での投稿をした場合にエラーメッセージを表示させたいのですが、うまく作動しません。

MyValidator.php

php

1<?php 2require_once 'C:\xampp\htdocs\php_data\DbManager.php'; 3 4class MyValidator { 5 public $_errors; 6 7 public function __construct() { 8 $_errors = array(); 9 } 10 11 public function requiredCheck($value, $name) { 12 if(trim($value) === ''){ 13 $this->_errors[] = "{$name}は必須入力です。"; 14 } 15 } 16 17} 18 19?>

board.php

php

1<?php 2require_once 'C:\xampp\htdocs\php_data\DbManager.php'; 3require_once 'C:\xampp\htdocs\php_data\MyValidator.php'; 4 5date_default_timezone_set('Asia/Tokyo'); 6 7$dataFile ='bbs.txt'; 8 9if(isset($_POST['toukou'])){ 10 11 $v = new MyValidator(); 12 $v->requiredCheck($_POST['name'], '名前'); 13 $v->requiredCheck($_POST['contents'], 'メッセージ'); 14 15 16 $name = htmlspecialchars($_POST['name']); 17 $contents = htmlspecialchars($_POST['contents']); 18 $postedAt = date('Y-m-d H:i:s'); 19 20 21 22 $newData = (sizeof(file($dataFile)) + 1)." ".$name." ".$contents." ".$postedAt. "\n"; 23 24 $fp = fopen($dataFile,'a'); 25 fwrite($fp, $newData); 26 fclose($fp); 27 28} 29 30 try { 31 $db = getDb(); 32 33 $stt = $db->prepare('INSERT INTO bulletin(name, contents) VALUES(:name, :contents)'); 34 35 $stt->bindParam(':name', $_POST['name']); 36 $stt->bindParam(':contents', $_POST['contents']); 37 $stt->execute(); 38 $db = NULL; 39 40 } catch(PDOException $e) { 41 die("エラーメッセージ:{$e->getMessage()}"); 42} 43 44?> 45<!DOCTYPE html> 46<html lang="ja"> 47<head> 48 <meta charset="utf-8"> 49 <title>簡易掲示板</title> 50</head> 51<body> 52 <h1>簡易掲示板</h1></br> 53 <p>名前は20文字以内、メッセージは50文字以内で入力してください</p> 54 55 <form action="" method="POST"> 56 57 名前:<input type="text" name="name"> 58 メッセージ:<input type="text" name="contents"> 59 60 <input type="submit" name='toukou' value="投稿"></br></br> 61 62 </form> 63 64<?php 65 66 $file=file($dataFile); // ファイルの内容を配列に格納 67 foreach( $file as $value ){ 68 $line = explode(" ",$value); 69 echo $value."<br />\n"; // 改行しながら値を表示 70 } 71?> 72</body> 73</html> 74 75

現状、未入力で投稿するとエラーが出ずにそのまま空白で投稿されてしまいます。
修正よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

どこでエラーメッセージを出力しているのでしょうか?
MyValidatorクラスの$_errorsにセットしてるのだから、ここから取り出してhtmlとして出力する処理を書きましょう。


追記:解決してますが追記です。

処理の途中(特にクラスの中)でexitするのは悪手なのでやめた方がいいです。
これを踏まえて、$this->_errors[] = "{$name}は必須入力です。";に戻して(v$->_errosにエラーメッセージをセット)以下のようにするといいかもしれません。

PHP

1<?php 2// ・・・略・・・ 3if(isset($_POST['toukou'])){ 4 $v = new MyValidator(); 5 $v->requiredCheck($_POST['name'], '名前'); 6 $v->requiredCheck($_POST['contents'], 'メッセージ'); 7 8 if (count($v->$_errors) < 1) { // ファイルに書くのはエラーが無い時だけにする 9 $name = htmlspecialchars($_POST['name']); 10 // ・・・略・・・ 11 fclose($fp); 12 } 13} 14// ・・・略・・・ 15?> 16<!DOCTYPE html> 17<html lang="ja"> 18<!-- ・・・略・・・ --> 19 <p>名前は20文字以内、メッセージは50文字以内で入力してください</p> 20<?php // エラーメッセージがある時はエラーメッセージを表示する。 21if(isset($_POST['toukou'])){ 22 if (count($v->$_errors) > 0) { // エラーメッセージが1件以上あるとき 23 // エラーメッセージ配列を'<br>'で連結し<p>タグ内に出力 24 echo '<p>' . implode('<br>', $v->errors) . '</p>'; 25 } 26} 27?> 28 <form action="" method="POST"> 29<!-- ・・・略・・・ --> 30</html> 31

投稿2016/12/15 05:09

編集2016/12/15 05:55
Y.H.

総合スコア7914

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

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

sumikko6210

2016/12/15 05:20

アドバイスありがとうございます! public function requiredCheck($value, $name) { if(trim($value) === ''){ echo $this->_errors[] = "{$name}は必須入力です。"; exit; } } と変更して無事に出力することができました。
Y.H.

2016/12/15 05:56

解決しましたが、追記しました。時間のある時にでも読んでください。
guest

0

requiredCheck()を読んで、MyValidatorクラスの$_errorsにメッセージを貯めているのに、それを出力している処理がないです。
foreachで$_errorsを回してあげるのがとりあえず簡単でしょうか。

投稿2016/12/15 05:21

ttyp03

総合スコア16996

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問