下記コードは制作中のものの一部ですが、会員登録フォームを制作しています。
2つの入力フィールドに入力したアドレスが異なっていた場合
・配列に何かしらの文字(ここではerror)を代入
・それと同時にエラー文を作っておく
異なっていた場合はEmail::equal()でエラー文を表示させる
異なっていなければ
sessionにPOST内容を記録させて
header('Location: register1.php');で
次のページに遷移する。
<?php class Email{ function equal(){ $email1 = filter_input(INPUT_POST, 'email1'); $email2 = filter_input(INPUT_POST, 'email2'); if(isset($email1,$email2)){ if($email1 !== $email2 ){ $error['mailequal'] = "error"; $errorms = '<div class="r_em">' . "メールアドレスが一致しません" . '</div>' ; return $errorms; } } } } if(!empty($_POST)){ if($error['mailequal'] !== "error"){ $_SESSION['join'] = $_POST; header('Location: register1.php'); exit(); } } ?> <tr> <td>E-mail</td> <td colspan="2"><input type="email" name="email1" maxlength="50" size="46" placeholder="info@example.com" ></td> </tr> <tr> <td>E-mail (確認用)</td> <td colspan="2"><input type="email" name="email2" maxlength="50" size="46" placeholder="info@example.com" ></td> <td><?php echo Email::equal(); ?></td> </tr>
なのですが、ページ遷移のところでてこずっています。
異ならないアドレスで試してもページ遷移してしまうのですが、どうしたら良いでしょうか...?
多分、問題は外部からクラスへのアクセス方法になっているとおもいます。
$error['mailequal']をクラス外で使っているので未定義の変数を呼び出していることになって判定がうまくできないのだと思います。(違っていたら申し訳ない)
エラー文の表示では、クラスはインスタン化せずに::で使てますが
クラスのプロパティ(変数?)にアクセスする方法が分かれば...
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
ベストアンサー
とりあえず元のイメージを維持した形で書きました。
通常なら、Validate クラスでまとめるほうが無難だと思います。
html
1<?php 2 3class Email 4{ 5 6 /** 7 * エラーメッセージ 8 * 複数のエラーメッセージを格納できるように配列に 9 * 10 * @var array 11 */ 12 private $error = array(); 13 14 /** 15 * メールアドレスの入力チェック 16 * @return bool 17 */ 18 public function check() 19 { 20 if (is_null(filter_input_array(INPUT_POST))) { 21 return true; 22 } 23 $email = filter_input(INPUT_POST, 'email'); 24 $email_conf = filter_input(INPUT_POST, 'email_conf'); 25 26 if ($email !== $email_conf) { 27 $this->error[] = 'メールアドレスが一致しません。'; 28 return false; 29 } 30 return true; 31 } 32 33 /** 34 * エラーメッセージを取得する 35 * @return array 36 */ 37 public function getErrorMessage() 38 { 39 return $this->error; 40 } 41 42} 43 44$objEmail = new Email(); 45 46if (!$objEmail->check()) { 47 $errMsg = implode(',', $objEmail->getErrorMessage()); 48} 49?><!DOCTYPE HTML> 50<html lang=""> 51 <head> 52 <meta charset="UTF-8"> 53 <title></title> 54 </head> 55 <body> 56 <form action="" method="post"> 57 <table> 58 <tr> 59 <td>E-mail</td> 60 <td><input type="post" name="email" /></td> 61 </tr> 62 <tr> 63 <td>E-mail (確認用)</td> 64 <td><input type="post" name="email_conf" /></td> 65 </tr> 66 <tr> 67 <td></td> 68 <td><button>送信</button></td> 69 </tr> 70 </table> 71 <?php 72 if (isset($errMsg)) { 73 printf('<p>%s</p>', $errMsg); 74 } 75 ?> 76 </form> 77 </body> 78</html>
html
1<?php 2 3function h($str) 4{ 5 return htmlspecialchars($str, ENT_QUOTES, 'utf-8'); 6} 7 8class Validate 9{ 10 11 /** 12 * エラーメッセージ 13 * 複数のエラーメッセージを格納できるように配列に 14 * 15 * @var array 16 */ 17 private $error = array(); 18 19 public function required() 20 { 21 if (is_null(filter_input_array(INPUT_POST))) { 22 return $this; 23 } 24 $email = filter_input(INPUT_POST, 'email'); 25 $email_conf = filter_input(INPUT_POST, 'email_conf'); 26 27 if (empty($email)) { 28 $this->error[] = 'E-mail は入力必須です。'; 29 } 30 if (empty($email_conf)) { 31 $this->error[] = 'E-mail(確認用) は入力必須です。'; 32 } 33 return $this; 34 } 35 36 /** 37 * メールアドレスの確認用との一致 38 * @return \Validate 39 */ 40 public function isEqual() 41 { 42 if (is_null(filter_input_array(INPUT_POST))) { 43 return $this; 44 } 45 $email = filter_input(INPUT_POST, 'email'); 46 $email_conf = filter_input(INPUT_POST, 'email_conf'); 47 48 if ($email !== $email_conf) { 49 $this->error[] = 'メールアドレスが一致しません。'; 50 } 51 return $this; 52 } 53 54 /** 55 * 登録済みかどうか 56 * @return \Validate 57 */ 58 public function isRegisterd() 59 { 60 if (is_null(filter_input_array(INPUT_POST))) { 61 return $this; 62 } 63 64 $email = filter_input(INPUT_POST, 'email'); 65 66 // DB への問い合わせ 67 // 68 // この辺の処理は自分で書いてね 69 // 70 if (false) { 71 $this->error[] = '既に登録済みです。'; 72 } 73 return $this; 74 } 75 76 /** 77 * バリデート結果 78 * @return boolean 79 */ 80 public function check() 81 { 82 if (count($this->error)) { 83 return false; 84 } 85 return true; 86 } 87 88 /** 89 * エラーメッセージを取得する 90 * @return array 91 */ 92 public function getErrorMessage() 93 { 94 return $this->error; 95 } 96 97} 98 99$objValidate = new Validate(); 100$objValidate->required() 101 ->isEqual() 102 ->isRegisterd(); 103if (!$objValidate->check()) { 104 $errMsg = $objValidate->getErrorMessage(); 105} else { 106 // 成功時にページ遷移 107 if (!is_null(filter_input_array(INPUT_POST))) { 108 header('Location: success.php'); 109 } 110} 111?><!DOCTYPE HTML> 112<html lang="ja"> 113 <head> 114 <meta charset="UTF-8"> 115 <title></title> 116 </head> 117 <body> 118 <form action="" method="post"> 119 <table> 120 <tr> 121 <td>E-mail</td> 122 <td><input type="post" name="email" value="<?php echo h(filter_input(INPUT_POST, 'email')); ?>" /></td> 123 </tr> 124 <tr> 125 <td>E-mail (確認用)</td> 126 <td><input type="post" name="email_conf" value="<?php echo h(filter_input(INPUT_POST, 'email_conf')); ?>" /></td> 127 </tr> 128 <tr> 129 <td></td> 130 <td><button>送信</button></td> 131 </tr> 132 </table> 133 <?php 134 if (isset($errMsg)) { 135 foreach ($errMsg as $msg) { 136 printf('<p>%s</p>', $msg); 137 } 138 } 139 ?> 140 </form> 141 </body> 142</html>
#コメントへの回答
① $error[] とすると、function required() { } の中からだけがその変数へアクセスできるため、外からアクセスできません。なので他のメソッドからもアクセスできるクラスのプロパティに値を守らせることが目的です。
②この処理がないと、POSTされていない時も、そのあとの処理が実行されてしまいます。POSTしていない時は処理する必要がないので、処理を止めるために記述しています。
③他のメソッドの結果を利用せず、単独のメソッドだけで処理することが可能なら static で定義すればいいでしょう。 Validate クラスで 提示した例では、3つのチェックを行っています。それぞれ同時にチェックして、一度にエラーメッセージを出力するために、インスタンスを同一のものに保障しなければなりませんので、new して使う方法にしました。
static で実装する方法もありますが、シングルトンパターンの利用してインスタンスの同一性を担保することというアプローチが必要になります。失礼ながら質問者様にはまだ早計かと思い、このパターンでの実装は見送りました。
でも今試しに、private $error = array();を消して試してみたら
'メールアドレスが一致しません。がしっかり表示されています。
確かに省略した場合でも、表示はされますね。
ただし、その場合、$this->error は public となり、private 変数にはなりません。
privateで定義する意味は、あくまで $this->error の値を書き換えることができるのは、そのクラスの中からのみ可能とするためです。そうすることでアプリケーションの保守性やバグの注入を防ぐ意味があります。
もし、意図しないバグがあっても、Validate クラスの内部をチェックすれば良いことになるため、プログラムの保守性も上がるはずです。
public にしてしまうと、クラスの外から値を書き換えることが可能になってしまいます。
⑤を検証するためのサンプルコード
以下のようなコードを実際に書いて、検証してみましょう。
php
1<?php 2 3class Test 4{ 5 6 /** 7 * private プロパティ 8 */ 9 private $private = 'private'; 10 11 /** 12 * protected プロパティ 13 */ 14 protected $protected = 'protected'; 15 16 /** 17 * public プロパティ 18 */ 19 public $public = 'public'; 20 21 /** 22 * private_method 23 */ 24 private function private_method() 25 { 26 // この変数にアクセスできるのは、private_method()の中からだけ 27 // protected_method, public_method からはアクセスできない 28 $private_var = 'private_var'; 29 30 // プロパティにアクセス 31 $this->private = 'private_method で書き換えました'; 32 $this->protected = 'private_method で書き換えました'; 33 $this->public = 'private_method で書き換えました'; 34 35 return array( 36 'private_var' => $private_var 37 , 'private' => $this->private 38 , 'protected' => $this->protected 39 , 'public' => $this->public 40 ); 41 } 42 43 /** 44 * protected_method 45 */ 46 protected function protected_method() 47 { 48 // プロパティにアクセス 49 $this->private = 'protected_method で書き換えました'; 50 $this->protected = 'protected_method で書き換えました'; 51 $this->public = 'protected_method で書き換えました'; 52 53 return array( 54 'private' => $this->private 55 , 'protected' => $this->protected 56 , 'public' => $this->public 57 ); 58 } 59 60 /** 61 * public_method 62 */ 63 public function public_method() 64 { 65 // プロパティにアクセス 66 $this->private = 'public_method で書き換えました'; 67 $this->protected = 'public_method で書き換えました'; 68 $this->public = 'public_method で書き換えました'; 69 70 return array( 71 'private' => $this->private 72 , 'protected' => $this->protected 73 , 'public' => $this->public 74 ); 75 } 76 77} 78
投稿2016/06/09 14:29
編集2016/06/09 19:25退会済みユーザー
総合スコア0
0
equal()がstatic宣言されていないことが問題なのでは?
class Email{
public static function equal(){
何もreturnしないで抜けるパスがあるので、最後に
return "";
とかを入れた方がいいと思います。
投稿2016/06/09 03:34
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/06/09 14:12
退会済みユーザー
2016/06/09 14:40
0
外してたらごめんなさいですが、呼び出しシーケンスを再考されてはどうでしょうか。
- ブラウザからPHPが呼び出される
- if(!empty($_POST))が評価される。emptyなので何もしない
- htmlが出力される。その際にEmail::equal()が評価され表示される
- 一旦プログラム終了。$SESSION以外の変数は消える
- ブラウザからformに内容を入れてPHPが呼び出される
- if(!empty($_POST))が評価される。!empty($POST)だが$errorは未定義
ということでサーバ側作業とクライアント(ブラウザ側)作業を切り分けて、
シーケンス図のように遷移が解る図を書いてみると良いのではと思います。
投稿2016/06/09 02:11
総合スコア210
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/06/09 16:14 編集
2016/06/09 16:05
退会済みユーザー
2016/06/09 16:08
2016/06/09 17:17
退会済みユーザー
2016/06/09 17:29 編集
2016/06/09 17:33
退会済みユーザー
2016/06/09 17:35 編集
2016/06/09 17:58
退会済みユーザー
2016/06/09 18:11 編集
2016/06/09 18:32 編集
退会済みユーザー
2016/06/09 18:33 編集
2016/06/09 18:46
2016/06/09 19:01
退会済みユーザー
2016/06/09 19:25
2016/06/09 19:37
2016/06/09 20:22 編集
退会済みユーザー
2016/06/10 02:50 編集
2016/06/13 18:00
2016/06/13 18:23
退会済みユーザー
2016/06/13 18:27
2016/06/13 18:29
退会済みユーザー
2016/06/13 20:30